1. 定义三种参数:

  • {api-gateway-host}

    img

  • {unified_domain}
    统一域名,即开放平台前台页面的域名
    如:
    湖北网教通:http://new.hbeducloud.com
    获取方式:

    img

  • {sdp-app-id}
    查看位置:开放平台-开发文档-接口调用,如图:

2.审核通过后,便可以开始接入。有两种授权流程:

  • 授权码接入

1) 拼接授权码页面

  1. http://{unified_domain}/openplatform/connect?sdp-app-id={sdp-app-id}&response_type={response_type}&access_key_id={access_key_id}&redirect_uri={redirect_uri}&scope={scope}&state={state}&type={type}
参数名 是否必须 类型 说明
sdp-app-id string 开放平台租户标识(获取方式如上)
access_key_id string 应用唯一标识,应用注册时由开放平台分配
redirect_uri string 授权成功的回调地址,其中域名必须符合应用注册时填写的安全域名
response_type string 响应类型,目前仅支持传code
scope string scope_base(获取你的公开信息)与scope_userinfo(获取你的详细信息)
state string 第三方应用自行产生,可以使用随机字符串
type string h5 页面,不传为web页面,传‘h5’为h5页面

授权成功开放平台帐号中心会返回302 重定向到应用提供的{redirect_uri}页面并且带上code和state参数
{redirect_uri}?code={code}&state={state}

2) 根据code获取access_token

  1. http://{api-gateway-host}/oauth/access_token

将code传过去,获取返回body中的access_token和open_id。Java代码示例:

  1. public Object auth(@RequestParam("code") String code) throws IOException {
  2. if (StringUtils.isBlank(code)) {
  3. return "code is null";
  4. }
  5. HttpClient httpClient = NdHttpClientBuilder.getHttpClient(ACCESS_KEY_ID, SECRET_ACCESS_ID);//此类由sdk提供
  6. JSONObject obj = new JSONObject();
  7. obj.put("access_key_id", ACCESS_KEY_ID);
  8. obj.put("secret_access_key", SECRET_ACCESS_ID);
  9. obj.put("code", code);
  10. obj.put("grant_type", "authorization_code");
  11. HttpPost request = new HttpPost(API_GATEWAY_HOST + "/oauth/access_token");
  12. request.setHeader("Content-Type", "application/json");
  13. StringEntity entity = new StringEntity(obj.toString());
  14. request.setHeader("sdp-app-id", SDP_APP_ID);
  15. request.setEntity(entity);
  16. HttpHost httpHost = HttpHost.create(API_GATEWAY_HOST);
  17. HttpResponse httpResponse = httpClient.execute(httpHost, request);
  18. if (httpResponse.getStatusLine().getStatusCode() == 200) {
  19. String result = EntityUtils.toString(httpResponse.getEntity());
  20. return JSONObject.parseObject(result);
  21. }
  22. return EntityUtils.toString(httpResponse.getEntity());
  23. }
返回参数:
参数 含义
access_token 访问令牌,接口调用凭证,有效期 7 天
expires_at access_token 的过期时间
refresh_token 用于刷新 access_token,有效期 60 天
open_id 授权用户唯一标识
server_time 服务器时间
  • ticket接入

1) 用户登录智慧教育云平台,进入第三方应用

用户进入第三方后,智慧教育云平台将会302到第三方提供的http地址,并附带ticket参数,如:{redirect_uri}?ticket={ticket}

2) 根据ticket获取access_token

  1. http://{api-gateway-host}/oauth/access_token

将ticket传过去,获取返回body中的access_token和open_id。Java代码示例:

  1. public Object authTicket(String ticket) throws IOException {
  2. if (StringUtils.isBlank(ticket)) {
  3. return "ticket is null";
  4. }
  5. HttpClient httpClient = NdHttpClientBuilder.getHttpClient(ACCESS_KEY_ID, SECRET_ACCESS_ID);//此类由sdk提供
  6. JSONObject obj = new JSONObject();
  7. obj.put("access_key_id", ACCESS_KEY_ID);
  8. obj.put("secret_access_key", SECRET_ACCESS_ID);
  9. obj.put("ticket", ticket);
  10. obj.put("grant_type", "ticket");
  11. HttpPost request = new HttpPost(API_GATEWAY_HOST + "/oauth/access_token");
  12. request.setHeader("Content-Type", "application/json");
  13. StringEntity entity = new StringEntity(obj.toString());
  14. request.setHeader("sdp-app-id", SDP_APP_ID);
  15. request.setEntity(entity);
  16. HttpHost httpHost = HttpHost.create(API_GATEWAY_HOST);
  17. HttpResponse httpResponse = httpClient.execute(httpHost, request);
  18. if (httpResponse.getStatusLine().getStatusCode() == 200) {
  19. String result = EntityUtils.toString(httpResponse.getEntity());
  20. return JSONObject.parseObject(result);
  21. }
  22. return EntityUtils.toString(httpResponse.getEntity());
  23. }
返回参数:
参数 含义
access_token 访问令牌,接口调用凭证,有效期 7 天
expires_at access_token 的过期时间
refresh_token 用于刷新 access_token,有效期 60 天
open_id 授权用户唯一标识
server_time 服务器时间

3.授权完成后可获取到access_token和open_id。获取用户的基本信息

  1. http://{api-gateway-host}/base/get_user_info

Java代码示例:

  1. public Object getUserInfo(String openid, String accessToken) throws IOException {
  2. HttpClient httpClient = NdHttpClientBuilder.getHttpClient(ACCESS_KEY_ID, SECRET_ACCESS_ID);//此类由sdk提供
  3. JSONObject obj = new JSONObject();
  4. obj.put("open_id", openid);
  5. obj.put("access_token", accessToken);
  6. HttpPost request = new HttpPost(API_GATEWAY_HOST + "/base/get_user_info");
  7. request.setHeader("Content-Type", "application/json");
  8. StringEntity entity = new StringEntity(obj.toString());
  9. request.setHeader("sdp-app-id", SDP_APP_ID);
  10. request.setEntity(entity);
  11. HttpHost httpHost = HttpHost.create(API_GATEWAY_HOST);
  12. HttpResponse httpResponse = httpClient.execute(httpHost, request);
  13. if (httpResponse.getStatusLine().getStatusCode() == 200) {
  14. String result = EntityUtils.toString(httpResponse.getEntity());
  15. return JSONObject.parseObject(result);
  16. }
  17. return EntityUtils.toString(httpResponse.getEntity());
  18. }
返回参数:
参数 含义
open_id 开放平台帐号中心 颁发给应用的授权用户的唯一标识,用来标记一个具体的用户
nick_name 昵称
avatar_url 头像
gender 性别 1:男,2:女,0:未知

4.令牌可定时续约,防止令牌失效

  1. http://{api-gateway-host}/oauth/refresh_token

将授权后获取的refresh_token外加其他参数传入,Java代码示例:

  1. public Object refresh(String refreshToken) throws IOException {
  2. HttpClient httpClient = NdHttpClientBuilder.getHttpClient(ACCESS_KEY_ID, SECRET_ACCESS_ID);//此类由sdk提供
  3. JSONObject obj = new JSONObject();
  4. obj.put("access_key_id", ACCESS_KEY_ID);
  5. obj.put("refresh_token", refreshToken);
  6. obj.put("grant_type", "refresh_token");
  7. HttpPost request = new HttpPost(API_GATEWAY_HOST + "/oauth/refresh_token");
  8. request.setHeader("Content-Type", "application/json");
  9. StringEntity entity = new StringEntity(obj.toString());
  10. request.setHeader("sdp-app-id", SDP_APP_ID);
  11. request.setEntity(entity);
  12. HttpHost httpHost = HttpHost.create(API_GATEWAY_HOST);
  13. HttpResponse httpResponse = httpClient.execute(httpHost, request);
  14. if (httpResponse.getStatusLine().getStatusCode() == 200) {
  15. String result = EntityUtils.toString(httpResponse.getEntity());
  16. return JSONObject.parseObject(result);
  17. }
  18. return EntityUtils.toString(httpResponse.getEntity());
  19. }
返回参数:
参数 含义
access_token 访问令牌,接口调用凭证,有效期 7 天
expires_at access_token 的过期时间
refresh_token 用于刷新 access_token,有效期 60 天
open_id 授权用户唯一标识
server_time 服务器时间

返回的access_token更新原来的令牌,refresh_token可用来下次续约

作者:wangtc  创建时间:2020-06-18 18:24
 更新时间:2023-11-14 10:57