微信公众号第三方平台授权流程
获取授权码流程:
拿到component_verify_ticket
-> 获取component_access_token
-> 获取pre_auth_code
-> 引导用户进入授权页
-> 用户同意授权给第三方平台
-> 拿到授权码(auth_code)
-> 获取authorizer_access_token(若过期,使用 authorizer_refresh_token 刷新)
-> 根据authorizer_access_token调用公众号相关API
1. 第三方平台方获取预授权码(pre_auth_code)
预授权码是第三方平台方实现授权托管的必备信息
1.1. 推送component_verify_ticket
授权事件接受URL:用于接收取消授权通知、授权成功通知、授权更新通知,也用于接收ticket,ticket是验证平台方的重要凭据。
微信服务器每十分钟向授权事件接收URL推送一次component_verify_ticket,用于获取第三方平台接口调用凭据
POST数据说明:
<xml>
<AppId> </AppId> //第三方平台AppID
<CreateTime>1413192605 </CreateTime> //时间戳
<InfoType> </InfoType> //component_verify_ticket
<ComponentVerifyTicket> </ComponentVerifyTicket> //Ticket内容
</xml>
1.2. 获取第三方平台component_access_token
第三方平台通过自己的component_appid(即在微信开放平台管理中心的第三方平台详情页中的AppID和AppSecret)和component_appsecret,以及component_verify_ticket来获取自己的接口调用凭证(component_access_token)
接口调用请求说明:
- Http请求方式: POST
- 请求接口:
https://api.weixin.qq.com/cgi-bin/component/api_component_token
POST请求数据示例:
{
"component_appid":"appid_value", //第三方平台appid
"component_appsecret": "appsecret_value", //第三方平台appsecret
"component_verify_ticket": "ticket_value" //微信后台推送的ticket
}
返回结果示例:
{
"component_access_token": "61W3mEpU66027wgNZ_MhGHNQDHnFATkDa9-2llqrMBjUwxRSNPbVsMmyD-yq8wZETSoE5NQgecigDrSHkPtIYA", //第三方平台component_access_token
"expires_in": 7200 //有效期
}
1.3. 获取预授权码pre_auth_code
第三方平台通过自己的接口调用凭据(component_access_token)来获取用于授权流程准备的预授权码(pre_auth_code)
接口调用请求说明:
- Http请求方式: POST
- 请求接口:
https://api.weixin.qq.com/cgi-bin/component/api_create_preauthcode?component_access_token=xxx
POST数据示例:
{
"component_appid":"appid_value" //第三方平台方appid
}
返回结果示例
{
"pre_auth_code": "Cx_Dk6qiBE0Dmx4EmlT3oRfArPvwSQ-oa3NL_fwHM7VI08r52wazoZX2Rhpz1dEw", //预授权码
"expires_in": 600 //有效期,为20分钟
}
2. 获取授权码
2.1. 引导用户进入授权页
授权页网址:
https://mp.weixin.qq.com/cgi-bin/componentloginpage?component_appid=xxxx&pre_auth_code=xxxxx&redirect_uri=xxxx
参数说明:
- component_appid: 第三方平台方appid
- pre_auth_code: 第一步获取的预授权码
- redirect_uri: 回调url
2.2. 用户确认并同意登录授权给第三方平台方
用户进入第三方平台授权页后,需要确认并同意将自己的公众号登录授权给第三方平台方,完成授权流程。
2.3. 授权后回调URI,得到授权码(authorization_code)和过期时间
授权流程完成后,授权页会自动跳转进入回调URI,并在URL参数中返回授权码和过期时间(redirect_url?auth_code=xxx&expires_in=600)
参数说明:
- auth_code: 授权码
- expires_in: 过期时间
3. 利用授权码调用用户公众号的相关API
在得到授权码后,第三方平台方可以使用授权码(auth_code)换取授权公众号的接口调用凭据(authorizer_access_token,也简称为令牌),再通过该接口调用凭据,按照公众号开发者文档(mp.weixin.qq.com/wiki)的说明,去调用公众号相关API。
先根据授权码(auth_code)换取公众号的接口调用凭据(authorizer_access_token)
接口调用请求说明:
- Http请求方式: POST(请使用https协议)
- 请求接口:
https://api.weixin.qq.com/cgi-bin/component/api_query_auth?component_access_token=xxxx
POST数据示例:
{
"component_appid": "appid_value", //第三方平台appid
"authorization_code": "auth_code_value" //授权码,会在授权成功时返回给第三方平台,详见第三方平台授权流程说明
}
返回结果示例:
{
"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
}
}
]
}
返回值说明:
- authorization_info: 授权信息
- authorizer_appid: 授权方appid
- authorizer_access_token: 授权方接口调用凭据(在授权的公众号具备API权限时,才有此返回值),也简称为令牌
- expires_in: 有效期(在授权的公众号具备API权限时,才有此返回值)
- authorizer_refresh_token: 接口调用凭据刷新令牌(在授权的公众号具备API权限时,才有此返回值),刷新令牌主要用于公众号第三方平台获取和刷新已授权用户的access_token,只会在授权时刻提供,请妥善保存。 一旦丢失,只能让用户重新授权,才能再次拿到新的刷新令牌
- func_info: 公众号授权给开发者的权限集列表,详情查看:权限集列表
拿到授权码(authorizer_access_token)后,根据 authorizer_access_token 调用公众号相关API。
获取(刷新)授权公众号的接口调用凭据(令牌)
方令牌(authorizer_access_token)失效时,可用刷新令牌(authorizer_refresh_token)获取新的令牌。请注意,此处token是2小时刷新一次,开发者需要自行进行token的缓存,避免token的获取次数达到每日的限定额度。
接口调用请求说明:
- http请求方式: POST(请使用https协议)
- 请求接口:
https:// api.weixin.qq.com /cgi-bin/component/api_authorizer_token?component_access_token=xxxxx
POST数据示例:
{
"component_appid": "appid_value", //第三方平台appid
"authorizer_appid": "auth_appid_value", //授权方appid
"authorizer_refresh_token": "refresh_token_value"
}
authorizer_refresh_token: 授权方的刷新令牌,刷新令牌主要用于公众号第三方平台获取和刷新已授权用户的access_token,只会在授权时刻提供,请妥善保存。一旦丢失,只能让用户重新授权,才能再次拿到新的刷新令牌
返回结果示例:
{
"authorizer_access_token": "aaUl5s6kAByLwgV0BhXNuIFFUqfrR8vTATsoSHukcIGqJgrc4KmMJ-JlKoC_-NKCLBvuU1cWPv4vDcLN8Z0pn5I45mpATruU0b51hzeT1f8", //授权方令牌
"expires_in": 7200, //有效期,为2小时
"authorizer_refresh_token": "************" //刷新令牌
}