整体流程图 :
1.接收验证票据(component_verify_ticket)
出于安全考虑,在第三方平台创建审核通过后,微信服务器会每隔 10 分钟会向第三方的消息接收地址推送一次 component_verify_ticket,用于获取第三方平台接口调用凭据。
第三方的程序被动接收,建议每次都将新值放入Redis中,供其他请求获取值(获取令牌时使用)。
接口文档:https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/api/component_verify_ticket.html
推送内容解密后的示例:
<xml>
<AppId>some_appid</AppId>
<CreateTime>1413192605</CreateTime>
<InfoType>component_verify_ticket</InfoType>
<ComponentVerifyTicket>some_verify_ticket</ComponentVerifyTicket>
</xml>
2.获取令牌(component_access_token)
第三方平台通过component_appid和 component_appsecret,以及 component_verify_ticket(每 10 分钟推送一次的安全 ticket)来获取自己的接口调用凭据(component_access_token)
(微信开放平台管理中心的第三方平台详情页中可以查看的 AppID 和 AppSecret)。
在需要授权时,第三方平台程序主动发送POST请求获取,单个令牌有效期为2个小时(7200s),在令牌快过期时(比如1小时50分),重新调用接口获取,可以将其存储在Redis中。
接口文档:https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/api/component_access_token.html
POST数据示例
{
"component_appid": "appid_value" ,
"component_appsecret": "appsecret_value",
"component_verify_ticket": "ticket_value"
}
返回数据示例
{
"component_access_token": "61W3mEpU66027wgNZ_MhGHNQDHnFATkDa9-2llqrMBjUwxRSNPbVsMmyD-yq8wZETSoE5NQgecigDrSHkPtIYA",
"expires_in": 7200
}
3.获取预授权码(pre_auth_code)
通过第二步获取的接口调用凭据(component_access_token)来获取用于授权流程准备的预授权码(pre_auth_code)。
每个预授权码有效期为10分钟(600s)需将其存储在Redis中,生成授权页会使用。
接口文档:https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/api/pre_auth_code.html
请求参数说明
参数 类型 必填 说明
component_access_token string 是 第三方平台component_access_token,不是authorizer_access_token
component_appid string 是 第三方平台 appid
返回数据示例:
{
"pre_auth_code": "Cx_Dk6qiBE0Dmx4EmlT3oRfArPvwSQ-oa3NL_fwHM7VI08r52wazoZX2Rhpz1dEw",
"expires_in": 600
}
4.引入用户进入授权页
第三方平台方可以在自己的网站中放置“微信公众号授权”或者“小程序授权”的入口,或生成授权链接放置在移动网页中,引导公众号和小程序管理员进入授权页。
用户进入第三方平台授权页后,需要确认并同意将自己的公众号或小程序授权给第三方平台方,完成授权流程,授权方式分为以下两种,详细介绍:
方式一:授权注册页面扫码授权
授权页网址为:
https://mp.weixin.qq.com/cgi-bin/componentloginpage?component_appid=xxxx&pre_auth_code=xxxxx&redirect_uri=xxxx&auth_type=xxx。
方式二:点击移动端链接快速授权 第三方平台方可以生成授权链接,将链接通过移动端直接发给授权管理员,管理员确认后即授权成功。
授权链接地址:
https://mp.weixin.qq.com/safe/bindcomponent?action=bindcomponent&auth_type=3&no_scan=1&component_appid=xxxx&pre_auth_code=xxxxx&redirect_uri=xxxx&auth_type=xxx&biz_appid=xxxx#wechat_redirect
5.获取授权码(pre_auth_code)
当用户在第三方平台授权页中完成授权流程后,第三方平台开发者可以在回调 URI 中通过 URL 参数获取授权码。
回调URI中会接收授权码信息和过期时间(redirect_url?auth_code=xxx&expires_in=600)(获取接口调用凭据时使用)
6.获取接口调用凭据(authorizer_access_token)
通过授权码和自已接口的调用凭据(component_access_token)换取公众号或小程序的接口调用凭据(authorizer_access_token 和用于前者快过期时用来刷新它的 authorizer_refresh_token)和授权信息(授权了哪些权限等信息)建议保存授权信息中的刷新令牌(authorizer_refresh_token)。
接口文档:https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/api/authorization_info.html
7.获取/刷新授权公众号或小程序的接口调用凭据
刷新令牌(在授权的公众号具备API权限时,才有此返回值),刷新令牌主要用于第三方平台获取和刷新已授权用户的 authorizer_access_token。
一旦丢失,只能让用户重新授权,才能再次拿到新的刷新令牌。用户重新授权后,之前的刷新令牌会失效,所以建议来刷新公众号或小程序的接口调用凭据。
接口文档:https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/api/api_authorizer_token.html
8、第三方平台接口使用
通过以上授权流程,获取到微信小程序的接口调用凭据authorizer_access_token后即可完成相应的业务开发了。
如小程序基本信息接口,以下可以获取小程序的基本信息:
GET https://api.weixin.qq.com/cgi-bin/account/getaccountbasicinfo?access_token=ACCESS_TOKEN
接口文档:https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/Mini_Programs/Mini_Program_Information_Settings.html
9.如何在企业微信网页授权链接中加入自定义参数
问题复现
在使用企业微信网页授权链接时,redirect_url中无法加入自定义的参数。
比如:
https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=https://www.baidu.com?need_trim=need_trim&agentId=1&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect
这样的授权链接,在重定向到redirect_url的时候,是不会携带need_trim和agentId参数的。
解决方案
将redirect_url进行encodeUrlComponent,推荐一个在线转换的网址:encodeUrlComponent。转换之后授权链接就成了这种形式:
https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=https%3A%2F%2Fwww.baidu.com%3Fneed_trim%3Dneed_trim%26agentId%3D1&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect
这个时候,重定向redirect_url之后,会携带need_trim和agentId两个自定义的参数。
详细授权流程说明:
https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/Authorization_Process_Technical_Description.html
相关接口文档说明:
https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/api/pre_auth_code.html