最近碰到微信第三方平台这个东西,就研究了下。由于微信官方文档顺序不是很明确,我特别也整理了一下。
官方的概述是
公众平台第三方平台是为了让公众号或小程序运营者,在面向垂直行业需求时,可以一键授权给第三方平台(并且可以同时授权给多家第三方),通过第三方平台来完成业务,开放给所有通过开发者资质认证后的开发者使用。
就是说第三方平台相当与一个中介来管理那些授权的公众号和小程序。
申请的流程可以去微信第三方平台的官方平台
https://open.weixin.qq.com/cgi-bin/frame?t=home/wx_plugin_tmpl&lang=zh_CN
以公众号为例子,公众号授权第三方平台流程是这样子的:
首先名词梳理下:
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 获取,其中用户授权给第三方平台需要通过预授权码才能完成整个授权。
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 进行刷新。
授权流程(以下所需的参数可参考上面的名词)
1.接收 component_verify_ticket。
该 Ticket 将会以 POST 的方式发送到(授权接收 URL,这是微信第三方平台注册时配置的参数),对消息进行解密,获取 Ticket。
微信的加密解密详见:https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419318479&lang=zh_CN
返回结果示例
<xml>
<AppId> </AppId>
<CreateTime>1413192605 </CreateTime>
<InfoType> </InfoType>
<ComponentVerifyTicket> </ComponentVerifyTicket>
</xml>
由于微信数据以 XML 方式进行推送,我们可以将xml转换为json;
2.利用 component_verify_ticket 获取 component_access_token。
该流程比较简单,以 HTTPS 协议并以 POST 方式传输数据即可获取 component_access_token(2小时以内有效,有上限,似乎是2000次)。请第三方平台做好令牌的存储(可以数据库,可以redis),在令牌快过期时(比如1小时50分)再进行刷新。
http请求方式: POST(请使用https协议)
https://api.weixin.qq.com/cgi-bin/component/api_component_token
POST数据示例:
{
“component_appid”:“appid_value” ,
“component_appsecret”: “appsecret_value”,
“component_verify_ticket”: “ticket_value”
}
返回结果示例
{“component_access_token”:“61W3mEpU66027wgNZ_MhGHNQDHnFATkDa92llqrMBjUwxRSNPbVsMmyD-yq8wZETSoE5NQgecigDrSHkPtIYA”, “expires_in”:7200}
由于返回的数据格式是 JSON 字符串,也可以转换成json;
3.利用 component_access_token 获取预授权码(pre_auth_code)。
预授权码用于公众号或小程序授权时的第三方平台方安全验证。
同样以 HTTPS 协议并以 POST 方式传输数据即可获取。
http请求方式: POST(请使用https协议)
https://api.weixin.qq.com/cgi-bin/component/api_create_preauthcode?component_access_token=xxx
POST数据示例:
{
“component_appid”:“appid_value”
}
返回结果示例
{“pre_auth_code”:“Cx_Dk6qiBE0Dmx4EmlT3oRfArPvwSQoa3NL_fwHM7VI08r52wazoZX2Rhpz1dEw”,“expires_in”:600}
由于返回的数据格式是 JSON 字符串,也可以转换成json;
注意 pre_auth_code 有效期只有10分钟,所有没必要保存到数据库,用户授权时根据 component_access_token 生成之后,返回到html或jsp上生成一个拼接后的的授权 URL。
4.引导进入授权页面
在html或者jsp页面上,加一个按钮,地址为拼接的授权 URL。
授权页网址为:
https://mp.weixin.qq.com/cgibin/componentloginpagecomponent_appid=xxxx&pre_auth_code=xxxxx&redirect_uri=xxxx&auth_type=xxx
xxxx换成自己所需的参数。
注意:授权回调 URL,注意授权回调 URL 的域名必须与第一步的授权接收 URL域名保持一致,不然微信会报错
5.用户点击后将会跳转到微信授权页面
用户进入第三方平台授权页后,需要确认并同意将自己的公众号或小程序授权给第三方平台方,完成授权流程。
6.授权后回调URI,得到授权码(authorization_code)和过期时间
授权流程完成后,授权页会自动跳转进入回调URI,并在URL参数中返回授权码和过期时间(redirect_url?auth_code=xxx&expires_in=600)
我们需要根据这个 auth_code,到微信后台获取用户的授权公众号或者小程序接口调用凭证信息
走到这一步其实用户公众号就已经授权成功了。但是我们去要获取用户公众号的信息还需一下的操作。
7.使用授权码换取公众号或小程序的接口调用凭据和授权信息
该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”
}
authorization_code就是之前获取的auth_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
}
}
]
}}
8.获取(刷新)授权公众号或小程序的接口调用凭据(令牌)
该API用于在授权方令牌(authorizer_access_token)失效时,可用刷新令(authorizer_refresh_token)获取新的令牌。请注意,此处token是2小时刷新一次,开发者需要自行进行token的缓存,避免token的获取次数达到每日的限定额度。
当换取authorizer_refresh_token后建议保存。
接口调用请求说明
http请求方式: POST(请使用https协议)
https:// api.weixin.qq.com /cgi-bin/component/api_authorizer_token?component_access_token=xxxxx
POST数据示例:
{
“component_appid”:“appid_value”,
“authorizer_appid”:“auth_appid_value”,
“authorizer_refresh_token”:“refresh_token_value”,
}
返回结果示例
{
“authorizer_access_token”: “aaUl5s6kAByLwgV0BhXNuIFFUqfrR8vTATsoSHukcIGqJgrc4KmMJJlKoC_-NKCLBvuU1cWPv4vDcLN8Z0pn5I45mpATruU0b51hzeT1f8”,
“expires_in”: 7200,
“authorizer_refresh_token”:
“BstnRqgTJBXb9N2aJq6L5hzfJwP406tpfahQeLNxX0w”
}
9.获取授权方的帐号基本信息
该API用于获取授权方的基本信息,包括头像、昵称、帐号类型、认证类型、微信号、原始ID和二维码图片URL。
需要特别记录授权方的帐号类型,在消息及事件推送时,对于不具备客服接口的公众号,需要在5秒内立即响应;而若有客服接口,则可以选择暂时不响应,而选择后续通过客服接口来发送消息触达粉丝。
(1)公众号获取方法如下:
接口调用请求说明
http请求方式: POST(请使用https协议)
https://api.weixin.qq.com/cgi-bin/component/api_get_authorizer_info?component_access_token=xxxx
POST数据示例:
{
“component_appid”:“appid_value” ,
“authorizer_appid”: “auth_appid_value”
}
返回结果示例
{
“authorizer_info”: {
“nick_name”: “微信SDK Demo Special”,
“head_img”: “http://wx.qlogo.cn/mmopen/GPy”,
“service_type_info”: { “id”: 2 },
“verify_type_info”: { “id”: 0 },
“user_name”:“gh_eb5e3a772040”,
“principal_name”:“腾讯计算机系统有限公司”,
“business_info”: {“open_store”: 0, “open_scan”: 0, “open_pay”: 0, “open_card”: 0,
“open_shake”: 0},
“alias”:“paytest01”
“qrcode_url”:“URL”,
},
“authorization_info”: {
“authorization_appid”: “wxf8b4f85f3a794e77”,
“func_info”: [
{ “funcscope_category”: { “id”: 1 } },
{ “funcscope_category”: { “id”: 2 } },
{ “funcscope_category”: { “id”: 3 } }
]
}
}
(2)小程序获取方法如下
接口调用请求说明
http请求方式: POST(请使用https协议)
https://api.weixin.qq.com/cgi-bin/component/api_get_authorizer_info?component_access_token=xxxx
POST数据示例:
{
“component_appid”:“appid_value” ,
“authorizer_appid”: “auth_appid_value”
}
返回结果示例:
{
“authorizer_info”: {
“nick_name”: “微信SDK Demo Special”,
“head_img”: “http://wx.qlogo.cn/mmopen/GPy”,
“service_type_info”: { “id”: 2 },
“verify_type_info”: { “id”: 0 },
“user_name”:“gh_eb5e3a772040”,
“principal_name”:“腾讯计算机系统有限公司”,
“business_info”: {“open_store”: 0, “open_scan”: 0, “open_pay”: 0, “open_card”: 0, “open_shake”: 0},
“qrcode_url”:“URL”,
“signature”: “时间的水缓缓流去”,
“MiniProgramInfo”: {
“network”: {
“RequestDomain”:[“https://www.qq.com”,“https://www.qq.com”],
“WsRequestDomain”:[“wss://www.qq.com”,“wss://www.qq.com”],
“UploadDomain”:[“https://www.qq.com”,“https://www.qq.com”],
“DownloadDomain”:[“https://www.qq.com”,“https://www.qq.com”],
},
“categories”:[{“first”:“资讯”,“second”:“文娱”},{“first”:“工具”,“second”:“天气”}],
“visit_status”: 0,
}
},
“authorization_info”: {
“authorization_appid”: “wxf8b4f85f3a794e77”,
“func_info”: [
{ “funcscope_category”: { “id”: 17 } },
{ “funcscope_category”: { “id”: 18 } },
{ “funcscope_category”: { “id”: 19 } }
]
}
}
返回参数说明
10.设置授权方的选项信息
11.推送授权相关通知
这两个在官方文档已经讲的很详细我就不重复。 官方参考文档地址:https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1453779503&token=&lang=