一、需求:对公众号关注用户的信息获取和管理
二、整体流程:获取票据 ------ 获取令牌 ------ 获取预授权码 ------ 生成授权页面 ------ 授权并且获取授权码 ------ 有需要的话再获取刷新令牌
三、说明:
1.官方文档:https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/api/authorization_info.html
2.票据:component_verify_ticket
3.令牌:component_access_token
4.预授权码:pre_auth_code
5.授权码:authorization_code / auth_code
6.刷新令牌:authorizer_refresh_token
四、具体实现(也可以先看第五点,没这么啰嗦看不懂再回来看):
1.微信官方接口API(以下简称wxapi)会定时(每10分钟)给第三方平台创建时填写的url上推送一个叫验证票据(component_verify_ticket)的东西。这个url是什么呢?你写一个地址为这个url的接口,比如(http://abc.com/auth.do),然后每10分钟微信就发ticket过来了,接口里面干什么呢?解析微信的数据,然后进行保存。缓存、数据库、甚至你也可以在代码中log.info(component_verify_ticket),甚至System.out.println(component_verify_ticket),它会过期,你能找到最新的就行。
2.拿到component_verify_ticket之后,要去获取令牌component_access_token,以POST请求wxapi获取。
https://api.weixin.qq.com/cgi-bin/component/api_component_token
请求的body内容为
{"component_appid":"第三方平台APPID","component_appsecret":"第三方平台secret","component_verify_ticket":"第一步的ticket"}
wxpai返回{
"component_access_token": "34_jycC7AzLnzu7Pj2goiI8Uyt3rn9hNgg7yhKfCLEDPYLugDT3jIBpN69N9wOU6JwkyKrlIkbqMWKJ5_J7yB-oDKWjVMpiTht0LLBXdZBltK-Al9PHia8LKzCLARJx0duoGrxezk2Yuro6fv9STEJbAJADOT",
"expires_in": 7200
}
3.拿到令牌之后,要预授权码(pre_auth_code),post请求以下地址
"https://api.weixin.qq.com/cgi-bin/component/api_create_preauthcode?component_access_token=",加上令牌,类似下面:
https://api.weixin.qq.com/cgi-bin/component/api_create_preauthcode?component_access_token=34_jycC7AzLnzu7Pj2goiI8Uyt3rn9hNgg7yhKfCLEDPYLugDT3jIBpN69N9wOU6JwkyKrlIkbqMWKJ5_J7yB-oDKWjVMpiTht0LLBXdZBltK-Al9PHia8LKzCLARJx0duoGrxezk2Yuro6fv9STEJbAJADOT
4.生成授权注册页面(一个地址):
a.在页面上添加一个按钮,按钮跳转地址:
会产生以下错误:
b.点击按钮,生成二维码,公众号的管理员拿起手机微信扫码,点击授权
c.此时网页上跳转到一个空白页面,看到上面的网址链接:https://mp.weixin.qq.com/cgi-bin/abc/redirect.do?auth_code=queryauthcode@@@dPIbKHrGFaTwgUjqbZ9A-fpv6bfnSEUYUpmKZtduDXw4V0NoQw6KRISQuBFtYRecXLYVOLzLy0ClPw-7rCIV1g&expires_in=3600,这样,我们就拿到了授权码
auth_code:queryauthcode@@@dPIbKHrGFaTwgUjqbZ9A-fpv6bfnSEUYUpmKZtduDXw4V0NoQw6KRISQuBFtYRecXLYVOLzLy0ClPw-7rCIV1g
d.此时我们用授权码和之前的令牌可以拿到授权信息,授权信息中有个叫刷新令牌的东西有用,post请求:
https://api.weixin.qq.com/cgi-bin/component/api_query_auth?component_access_token=34_jycC7AzLnzu7Pj2goiI8Uyt3rn9hNgg7yhKfCLEDPYLugDT3jIBpN69N9wOU6JwkyKrlIkbqMWKJ5_J7yB-oDKWjVMpiTht0LLBXdZBltK-Al9PHia8LKzCLARJx0DUoGrxezk2Yuro6fv9STEJbAJADOT,
body参数:
{"component_appid":"wx1234567890" ,"authorization_code": "queryauthcode@@@PLpatQIOkdmpyuROjYDouXeXCR709IJBWoiRbsDWpyHRVzHjYPL4MNt_0t-PCVowLJQXbeNszANhNA4u7cssAA"}
返回内容:
{"authorization_info":{"authorizer_appid":"wxb6cbb11cd427d000","authorizer_access_token":"34_N7QdVWfC-AbhmZLxa6k9iWka3vs6rI57fBxUlc4RPToY85sbBb9hcbq5QDL4ZAT5Nmjl_RoQ9vA996KqesNQYRjrQtID6NT5TiQqzfeNoUTLV7A-ojsVoUAvvd4rXPtFf88clSNu3Tr8SKC0FHIcAEDMOP","expires_in":7200,"authorizer_refresh_token":"refreshtoken@@@hRHXlzfs8i1cNo03XwtLXclah6_S7df6mTqk3ruDSSg","func_info":[{"funcscope_category":{"id":7}},{"funcscope_category":{"id":2}}]}}
五、言而简之:
1.开发一个接口并且把地址配置到第三方平台的授权事件接收URL,接口解析并保存票据component_verify_ticket字段;
2.用票据去POST请求获取令牌component_access_token:
地址:https://api.weixin.qq.com/cgi-bin/component/api_component_token
body参数:{"component_appid":"第三方平台APPID","component_appsecret":"第三方平台secret","component_verify_ticket":"第一步的ticket"}
3.用令牌POST请求获取预授权码(pre_auth_code)
地址:https://api.weixin.qq.com/cgi-bin/component/api_create_preauthcode?component_access_token=aaa
{"pre_auth_code":"preauthcode@@@qOcm5IX1boBVwEYMlg22iqfv6oEphMWOnEmm5r0wWZU4VLNGroD1HMvckD-sOTGo","expires_in":1800}
4.在项目的JSP/html页面上写一个按钮,地址:
https://mp.weixin.qq.com/cgi-bin/componentloginpage?component_appid=第三方平台appid&pre_auth_code=预授权码&redirect_uri=随便写一个合法的地址吧&auth_type=
然后登录项目网站,点击该按钮,就会跳转到授权二维码页面
5.公众号管理员拿起他的手机扫一扫,然后授权
6.此时网页会跳转,需要的是页面上地址栏的内容:
此时已经授权成功。
7.一般还有一步:获取一个叫刷新令牌的东西,此时授权码和令牌都还热乎,赶紧POST请求拿:
地址:https://api.weixin.qq.com/cgi-bin/component/api_query_auth?component_access_token=COMPONENT_ACCESS_TOKEN
body参数:{"component_appid":"三方appid" ,"authorization_code": "授权码"}
wxapi返回:{"authorization_info":{"authorizer_appid":"wxb6cbb11cd427d0a0","authorizer_access_token":"34_N7QdVWfC-AbhmZLxa6k9iWka3vs6rI57fBxUlc4RPToY85sbBb9hcbq5QDL4ZAT5Nmjl_RoQ9vA996KqesNQYRjrQtID6NT5TiQqzfeNoUTLV7A-ojsVoUAvvd4rXPtFf88clSNu3Tr8SKC0FHIcAEDMOP","expires_in":7200,"authorizer_refresh_token":"refreshtoken@@@hRHXlzfs8i1cNo03XwtLXclah6_S7df6mTqk3ruDSSg","func_info":[{"funcscope_category":{"id":7}},{"funcscope_category":{"id":2}}]}}