微信第三方平台开发经验总结(五):接收授权方授权请求并保存授权方信息

时间:2020-12-03 05:46:01
接收授权方授权请求并保存授权方信息

     接上回,在重定向到授权页后,在授权页上会有一个二维码

     微信公众号管理员通过的使用本人微信扫描二维码对第三方平台进行授权

     在公众号管理员扫描二维码后,第三方平台后台给定的回调地址( redirect_uri)将会收到一条请求

     不知道redirect_uri是什么的请去看 点击打开链接

     请求中包含了授权方的authorization_code和authorization_code 的有效时间,直接回复"success"字符串就行了

/**
* 根据auth_code查询授权信息
* @param authCode 授权成功时获得的授权码
* @param expiresIn 存活时间
* @return
*/
@ResponseBody
@RequestMapping(value = "/queryAuth")
public String queryAuth(@RequestParam("auth_code")String authCode, @RequestParam("expires_in")String expiresIn){
    logger.info("auth_code={},expires_in={}",authCode,expiresIn);
    thirdPartyService.queryAuth(authCode,expiresIn);
    return "success";
}


     然后通过获取到的authorization_code 查询授权方的信息, 以下是官方文档上的部分信息
     

4、使用授权码换取公众号或小程序的接口调用凭据和授权信息

该API用于使用授权码换取授权公众号或小程序的授权信息,并换取authorizer_access_token和authorizer_refresh_token。 授权码的获取,需要在用户在第三方平台授权页中完成授权流程后,在回调URI中通过URL参数提供给第三方平台方。请注意,由于现在公众号或小程序可以自定义选择部分权限授权给第三方平台,因此第三方平台开发者需要通过该接口来获取公众号或小程序具体授权了哪些权限,而不是简单地认为自己声明的权限就是公众号或小程序授权的权限。

接口调用请求说明

http请求方式: POST(请使用https协议)

https://api.weixin.qq.com/cgi-bin/component/api_query_auth?component_access_token=xxxx

POST数据示例:

{
"component_appid":"appid_value" ,
"authorization_code": "auth_code_value"
}

请求参数说明
参数 说明
component_appid 第三方平台appid
authorization_code 授权code,会在授权成功时返回给第三方平台,详见第三方平台授权流程说明
返回结果示例


"authorization_info": {
"authorizer_appid": "wxf8b4f85f3a794e77", 
"authorizer_access_token": "QXjUqNqfYVH0yBE1iI_7vuN_9gQbpjfK7hYwJ3P7xOa88a89-Aga5x1NMYJyB8G2yKt1KCl0nPC3W9GJzw0Zzq_dBxc8pxIGUNi_bFes0qM", 
"expires_in": 7200, 
"authorizer_refresh_token": "dTo-YCXPL4llX-u1W1pPpnp8Hgm4wpJtlR6iV0doKdY", 
"func_info": [
{
"funcscope_category": {
"id": 1
}
}, 
{
"funcscope_category": {
"id": 2
}
}, 
{
"funcscope_category": {
"id": 3
}
}
]
}
   

结果参数说明
参数 说明
authorization_info 授权信息
authorizer_appid 授权方appid
authorizer_access_token 授权方接口调用凭据(在授权的公众号或小程序具备API权限时,才有此返回值),也简称为令牌
expires_in 有效期(在授权的公众号或小程序具备API权限时,才有此返回值)
authorizer_refresh_token 接口调用凭据刷新令牌(在授权的公众号具备API权限时,才有此返回值),刷新令牌主要用于第三方平台获取和刷新已授权用户的access_token,只会在授权时刻提供,请妥善保存。 一旦丢失,只能让用户重新授权,才能再次拿到新的刷新令牌
func_info 公众号授权给开发者的权限集列表,ID为1到15时分别代表:
消息管理权限
用户管理权限
帐号服务权限
网页服务权限
微信小店权限
微信多客服权限
群发与通知权限
微信卡券权限

微信扫一扫权限

微信连WIFI权限

素材管理权限

微信摇周边权限

微信门店权限

微信支付权限

自定义菜单权限


请注意:
1)该字段的返回不会考虑公众号是否具备该权限集的权限(因为可能部分具备),请根据公众号的帐号类型和认证情况,来判断公众号的接口权限。
     根据官方文档调用api获取authorizer_access_token和authorizer_refresh_token
      authorizer_appid在之后调用代公众号实现业务的接口时会经常用到,比如发送客服消息
          
public String queryAuth(String authCode,String expiresIn) {

    String componentAccessToken = getComponentAccessToken();//把之前保存的component_access_token取出来
    logger.info("ThirdPartyServiceImpl:queryAuth:componentAccessToken={}",componentAccessToken);

    /**替换Url中的{component_access_token}*/
    String url = ThirdPartyConfig.QUERY_AUTH_URL.replace("{component_access_token}",componentAccessToken);
    logger.info("ThirdPartyServiceImpl:getPreAuthCode:url={}",url);

     /**拼json*/
    JSONObject json = new JSONObject();
    json.accumulate("component_appid",ThirdPartyConfig.APP_ID);
    json.accumulate("authorization_code",authCode);
    logger.info("ThirdPartyServiceImpl:getPreAuthCode:json={}",json);

    /**发送Https请求到微信*/
    String retStr = HttpsUtil.postHtpps(url,json.toString());
    logger.info("ThirdPartyServiceImpl:getPreAuthCode:retStr={}",retStr);
    JSONObject resultJson = JSONObject.fromObject(retStr);
    JSONObject infoJson = resultJson.getJSONObject("authorization_info");

    /**在返回结果中获取信息*/
    String authorizerAccessToken = infoJson.getString("authorizer_access_token");
    String authorizerRefreshToken = infoJson.getString("authorizer_refresh_token");
    String authorizerAppid = infoJson.getString("authorizer_appid");
    logger.info("queryAuth:authorizer_appid={}",authorizerAppid);
    logger.info("queryAuth:authorizer_access_token={}",authorizerAccessToken);
    logger.info("queryAuth:authorizer_refresh_token={}",authorizerRefreshToken);

     /**把authorizer_access_token和authorizer_refresh_token保存到数据库中*/
    authorizerDBService.setexAccessToken(authorizerAppid, authorizerAccessToken,7200);
    authorizerDBService.setRefreshToken(authorizerAppid, authorizerRefreshToken);
     /**通过authorizerAppid调用Api获取更详细的信息*/
    setAuthorizerInfo(authorizerAppid);

    return authorizerAppid;
}