3.公众号授权流程解析
对宏观经济感兴趣的IT从业者,同名公众号LeeYond
# 公众号授权流程解析
标签(空格分隔): 第三方平台开发
本章主要让您对于微信的授权机制以及方式有着深刻的理解。

梳理&回顾
1.名词梳理
- component_appid 第三方平台id,在申请通过之后可以查看
- component_appsecret 第三方平台密钥,申请之后可以查看,需要自己妥善保存,否则丢失或者忘记之后只能重置获取
- component_verify_ticket 微信后台每10分钟推送到第三方平台的授权接收URL的ticket
- component_access_token 第三放平台的token,有效期2小时,需要根据component_verify_ticket获取
- pre_auth_code 从名称可以看出是预授权码,由component_access_token结合component_appid获取,其中 s'x用户授权给第三方平台需要通过预授权码才能完成整个授权
- authorization_code 用户授权时微信通过地址栏参数的方式传输给第三方平台,平台需要根据该code结合component_access_token以及component_appid获取授权公众号的信息。
- authorizer_appid 授权方appid其实就是公众号的appId(其实就是下面的消息与事件接收URL中的A)
- authorizer_access_token 公众号的access token
- authorizer_refresh_token 主要用于第三方平台获取和刷新已授权用户的access_token,只会在授权的时候提供,公众号的access token也是2小时失效,所以需要根据authorizer_refresh_token进行刷新
2.相关URL总览
- 授权接收URLhttp://www.baidu.com/gitchat/component/event 主要用来接收微信授权相关事件信息,例如授权、取消授权、更新授权;与此同时主要接收微信每10分钟推送的component_verify_ticket(用来换取平台的component_access_token)
- 消息与事件接收URL : http://www.baidu.com/gitchat/wechat/A/callback 主要用来接收公众号A相关的信息,例如公众号会话、扫描二维码、点击菜单等。
- 授权回调URL:其实该URL不在上面章节中,该URL主要是在微信授权成功后的回调URL,主要是因为微信授权时,需要在微信相关页面进行,所以需要将授权传到该URL,进行保存。
授权流程解析
微信的授权文档乍一看比较乱,主要是因为微信在po授权流程图时隐藏了部分流程,但是这些流程又在授权文章中夹杂的出现导致文档看起来比较乱。本文按照实施流程进行讲解,使整个逻辑比较通畅
加解密
微信有非常详细的加解密Demo >传送门<,可以参照练练手。
授权流程
1.接收component_verify_ticket 该ticket将会以POST的方式发送到http://www.baidu.com/gitchat/component/event(授权接收URL),对消息进行解密,获取ticket。其中由于微信这里数据是以xml方式进行推送,然而大部分编程习惯是驼峰式的,可以采用注解方式进行解决。样例Class如下:
@XStreamAlias("xml")
public class WechatComponentVerifyTickets {
@XStreamAlias("AppId")
private String appId;
@XStreamAlias("CreateTime")
private String createTime;
@XStreamAlias("InfoType")
private String infoType;
@XStreamAlias("ComponentVerifyTicket")
private String componentVerifyTicket;
}
其中对于XStream来说,开启注解需要显示的调用xstream.processAnnotations(cls);参考函数如下:
public static Object parseXml(String xml,Class cls) {
XStream xstream = new XStream();
xstream.processAnnotations(cls);
Object object = (Object) xstream.fromXML(xml);
return object;
}
解密之后的字符串格式如下:
<xml> <AppId> </AppId> <CreateTime>1413192605 </CreateTime> <InfoType> </InfoType> <ComponentVerifyTicket> </ComponentVerifyTicket> </xml>
2.利用component_verify_ticket获取component_access_token 该流程比较简单,以https协议并以post方式传输数据即可获取component_access_token(2小时以内有效,有上限,似乎是2000次):
url:https://api.weixin.qq.com/cgi-bin/component/api_component_token
数据格式:
{
"component_appid":"appid_value" ,
"component_appsecret": "appsecret_value",
"component_verify_ticket": "ticket_value"
}
返回结果如下所示 {"component_access_token":"61W3mEpU66027wgNZ_MhGHNQDHnFATkDa9-2llqrMBjUwxRSNPbVsMmyD-yq8wZETSoE5NQgecigDrSHkPtIYA", "expires_in":7200}
由于返回的数据格式是Json字符串,所以同样可以采用注解的方式反序列化。提供样例如下:
public class WechatComponentAccessTokens {
@SerializedName(value = "expires_in")
private int expiresIn;
@SerializedName(value = "component_access_token")
private String componentAccessToken;
}
3.利用component_access_token获取预授权码(pre_auth_code) 同样以https协议并以post方式传输数据即可获取
url:https://api.weixin.qq.com/cgi-bin/component/api_create_preauthcode?c omponent_access_token=%s
数据格式:
{
"component_appid":"appid_value" ,
}
返回结果如下所示:
{"pre_auth_code":"Cx_Dk6qiBE0Dmx4EmlT3oRfArPvwSQ-oa3NL_fwHM7VI08r52wazoZX2Rhpz1dEw","expires_in":600}
同样利用注解进行反序列化:
public class WechatComponentPreAuthCode {
@SerializedName(value = "expires_in")
private int expiresIn;
@SerializedName(value = "pre_auth_code")
private String preAuthCode;
}
注意pre_auth_code有效期只有10分钟,所有没必要保存到数据库,用户授权时根据c omponent_access_token生成之后,返回到前台拼接成真正的授权URL,如下所示:
https://mp.weixin.qq.com/cgi-bin/componentloginpage? component_appid=**平台appId**&pre_auth_code=**预授权码**&redirect_uri=授权回调URL&auth_type=1 其中对于auth_type主要是用于设置用户扫码授权时展示的账号类型,1表示公众号,2表示小程序,3表示公众号以及小程序。 至此基本上就可以进行授权工作了,但是还不够,因为用户授权后会传输公众号相关信息,例如authorizer_appid、authorizer_access_token,authorizer_refresh_token等。
4.授权回调保存信息。
我们上文提到了授权回调URL,注意授权回调URL的域名必须与上文填写的域名保持一致,不然微信会报错。在本Chat中格式如下所示:
www.baidu.com/component/callback
- 当用户点击前台授权URL时,

- 将会跳转到微信授权页面,

- 扫描二维码,出现如下图片,选择公众号确认授权。

- 回调URL接收相关参数
当用授权完成后,跳转到授权回调URL时,微信会传输一个auth_code,我们需要根据这个auth_code,到微信后台获取用户的授权公众号或者小程序接口调用凭证信息。
public class WechatUserAuthorizationInfo {
@SerializedName(value = "authorizer_appid")
private String authorizerAppId;
@SerializedName(value = "authorizer_access_token")
private String authorizerAccessToken;
@SerializedName(value = "authorizer_refresh_token")
private String authorizerRefreshToken;
/*
* casuse wechat response "func_info": [{"funcscope_category": {"id": 1}},{"funcscope_category": {"id": 3}}]
* then change list<String> ids to string
*/
@SerializedName(value = "func_info")
private List<WechatUserAuthorizationFuncScope> funcScopes;
@SerializedName(value = "expires_in")
private Integer expiresIn;
private String funcInfo;
}
后面可以通过authorizerAppId获取该微信公众号的账号基本详细信息(当初我一直纠结的是不是授权人的账号信息,冏)。
至此微信授权整个流程讲解完毕。
总结
本文较为详细的介绍了微信授权的流程以及其中设计的参数,第一次进行尝试时,不要被微信的流程所吓到,静下心来一步一步进行开发,写好基础包,必将可以完成授权流程。 在下一张中,我们将主要讲解如何保存上述出现的一些信息,如何利用SSM框架进行token(平台以及公众号的)的刷新,打好后续自定义二维码等的开发。3.公众号授权流程解析
4733

被折叠的 条评论
为什么被折叠?



