概述
第三方平台通过获得公众号或小程序的接口能力的授权,代公众平台帐号调用各业务接口来实现业务。
- 定制化型
通过获取商家提供小程序或者公众号的appid
和secret
进行开发 - 平台型
通过获取authorizer_access_token
代商家调用相关接口能力进行开发
流程
- 注册微信开放平台账号 进行企业实名认证
- 新建第三方平台,填写信息,设置权限集、接口地址、测试公众号/小程序白名单
- 写接口并通过步骤2中的白名单进行测试,并进行全网发布接入测试
- 申请全网发布并上线,上线后其他公众号即可进行授权
- 关于接口地址配置
授权接收地址、消息事件接收地址为服务器入口地址
授权发起域名是前端页面所在域名,注意因referrer policy导致的授权入口页域名为空的报错
公众号开发域名是前端页面所在域名
白名单IP地址为出口地址(最好带端口号和不带端口号的都写上)
网站应用授权流程
适用于PC网站上用户微信扫码登录的场景
移动应用授权流程
-
验证票据
component_verify_ticket
- 在第三方平台创建审核通过后,微信服务器会向其 ”授权事件接收URL” 每隔 10 分钟以 POST 的方式推送请求,通过对query的字符串和body中的二进制流进行解析最终可以转化为一个包含
component_verify_ticket
的xml - 有效时间为 12 小时
- 在第三方平台创建审核通过后,微信服务器会向其 ”授权事件接收URL” 每隔 10 分钟以 POST 的方式推送请求,通过对query的字符串和body中的二进制流进行解析最终可以转化为一个包含
-
令牌
component_access_token
- 通过验证票据
component_verify_ticket
调接口获取 - 有效时间为 2 小时,在令牌快过期时(比如1小时50分),应重新获取。
- 通过验证票据
预授权码
pre_auth_code
通过令牌component_access_token
调接口获取,有效期为 10 分钟
3.1. 引导用户进入授权网页(必须在第三方平台配置的url)进行扫码授权
https://mp.weixin.qq.com/cgi-bin/componentloginpage?component_appid=xxxx&pre_auth_code=xxxxx&redirect_uri=xxxx
或直接在手机打开网址进行授权
https://mp.weixin.qq.com/safe/bindcomponent?action=bindcomponent&no_scan=1&component_appid=xxxx&pre_auth_code=xxxxx&redirect_uri=xxxx&auth_type=xxx&biz_appid=xxxx#wechat_redirect
3.2. 用户完成授权后会进入授权网址中的redirect_uri
,并在 URL 参数中返回授权码authorization_code
和过期时间(redirect_url?auth_code=xxx&expires_in=600)通过上一步中获得的授权码
auth_code
调用https://api.weixin.qq.com/cgi-bin/component/api_query_auth?component_access_token=xxxx
,换取授权公众号或小程序的appid
和authorizer_access_token、authorizer_refresh_token
authorizer_access_token
有效期2小时,如果过期可通过authorizer_refresh_token
重新获取获取授权公众号或小程序的详细信息
略
略
当公众号/小程序对第三方平台进行授权、取消授权、更新授权后也会向步骤1中接口推送消息,通过解析可以拿到授权的变更情况
拉取所有已授权的帐号信息该文档目前已经迁移 暂时找不到
代公众号处理业务
通过authorizer_access_token
和appid
可以代公众号处理业务
代公众号调用接口
需要公众号本身有该接口权限且授权了第三方平台该权限,此时本来需要公众号access_token
的地方传入authorizer_access_token
即可。
错误码:45009为调用次数超限,61007为未获取公众号对应授权,48001为公众号自身缺少该权限
-
生成带参数(场景值)二维码(关注码)
临时码无数量限制,但最多30天。永久码无时间限制,但最多10W个。
场景值类型可以为scene_id
和scene_str
之一,其值会回传在用户事件的event_key
中 -
发送模板消息
仅服务号可用,需先按照所属行业申请模板
只能发给关注了公众号的用户 -
发送订阅通知
仅服务号可用,需先按照所属行业申请模板
对已关注服务号的用户,通知下发到号内,未关注的下发到服务通知。
需用户在网页等场景中订阅后,服务号可不限时间地下发一次对应的通知。(仅政务民生、医疗等特殊行业可多次下发) -
获取用户信息
/cgi-bin/user/info
同一用户,对每个公众号的OpenID是唯一的。
同一用户,对同一个微信开放平台下的不同应用,unionid是相同的。
通过本接口可以根据OpenID获取用户unionid(如存在)和是否关注公众号,如已关注则还有关注时间、关注的渠道、关注时的场景码。(2021年12月起此接口不再能获得用户头像、昵称)。
代公众号处理消息和事件
接收用户消息、接收用户事件
微信服务器会将粉丝发给公众号的消息,以及微信服务器发给公众号的事件推送(如菜单点击、关注通知等),发给该公众号所有已授权的第三方平台开发者服务器。被动回复用户消息/事件
开发者在接收到上述消息和部分事件后,需要在 5 秒内响应,否则微信会重试三次。依然无响应或响应错误,则向用户下发系统提示“该公众号暂时无法提供服务,请稍后再试”。
返回内容可以通过XML配置为文本、图片、语音、视频、音乐、图文。为如多个第三方平台都做出响应,则依照响应顺序依次生效。主动发送客服消息
在用户主动触发上述行为后的一段时间内,可以主动向用户发送客服消息
代公众号发起网页授权
- 令用户访问授权地址
https://open.weixin.qq.com/connect/oauth2/authorize
,同意后带着code跳转到符合【第三方平台 - 公众号开发域名】的自定义回调地址。其中scope的值可以为:- snsapi_base:静默授权,仅能用于获取openid
- snsapi_userinfo:需要用户手动同意,可用于获取openid、unionid、头像、昵称等。可能触发网页快照机制,详见文末。
- 在回调地址中,通过code换取公众号access_token,并调用接口获取scope对应的用户信息
注:使用第三方平台和直接微信公众号开发,接口相同但参数不同。且公众号的返回值里还会多一个is_snapshotuser
用于判断是否进入了快照模式 - 在回调地址中做二次跳转,前往用户最终需要的前端页面
代公众号使用JSSDK
用户信息获取概况
- 用户关注、向公众号发消息、扫描带参数二维码等操作后,收到的事件推送XML中含有
openid
- 通过
openid
可进一步调用/cgi-bin/user/info
获取unionid
及用户关注情况(是否关注、关注时间、关注的途径及场景码) - snsapi_base 模式的网页授权为静默授权,回调获取
code
可兑换openid
- snsapi_userinfo 模式的网页授权,回调获取
code
可兑换openid
、unionid
、头像、昵称等- 从本公众号的会话或菜单中直接访问该授权地址,静默授权
- 通过扫码、和其他用户的会话链接等场景,直接访问该授权地址
- 最近刚关注,或通过其他方式完成过本公众号授权,则静默授权
- 以前关注过公众号,但长期未授权,则进入授权页面。此时如果拒绝授权,重定向不带code参数
- 未关注公众号,总是触发网页快照机制
- 通过其他页面跳转到该授权地址(微信官方推荐的做法)
即先告知用户授权的目的,然后用户主动交互跳转到授权地址。
若最近完成过本公众号授权,则静默授权。否则会在原页面底部自动弹出授权弹窗,若拒绝则无事发生。若同意则完成重定向并带有code。
暂不清楚该模式下是否会触发网页快照机制。
网页快照机制
2022 年 7 月起,使用snsapi_userinfo权限时必须符合授权规范,否则强制变为网页快照模式(你不体面,微信就帮你体面)。
快照的授权流程看似静默授权,不会出现授权弹窗,且重定向后正常返回code,但实际上通过该code只能兑换假的用户信息(包括openid也是假的。且其昵称似乎固定为“微信用户”)。
最终跳转的页面会变为快照页面,是实际网页的静态预览,无法交互。仅点击底部同意授权后,会再次走正常的code流程,并抵达真正的最终页面。
- 虽然官方文档没有明确说明,但已关注公众号的用户似乎不会触发网页快照机制