微信公众号与开放平台第三方平台开发

概述

第三方平台通过获得公众号或小程序的接口能力的授权,代公众平台帐号调用各业务接口来实现业务。

  • 定制化型
    通过获取商家提供小程序或者公众号的appidsecret进行开发
  • 平台型
    通过获取authorizer_access_token代商家调用相关接口能力进行开发

流程

  1. 注册微信开放平台账号 进行企业实名认证
  2. 新建第三方平台,填写信息,设置权限集、接口地址、测试公众号/小程序白名单
  3. 写接口并通过步骤2中的白名单进行测试,并进行全网发布接入测试
  4. 申请全网发布并上线,上线后其他公众号即可进行授权
  • 关于接口地址配置
    授权接收地址、消息事件接收地址为服务器入口地址
    授权发起域名是前端页面所在域名,注意因referrer policy导致的授权入口页域名为空的报错
    公众号开发域名是前端页面所在域名
    白名单IP地址为出口地址(最好带端口号和不带端口号的都写上)

网站应用授权流程

适用于PC网站上用户微信扫码登录的场景


移动应用授权流程

  1. 验证票据 component_verify_ticket

    • 在第三方平台创建审核通过后,微信服务器会向其 ”授权事件接收URL” 每隔 10 分钟以 POST 的方式推送请求,通过对query的字符串和body中的二进制流进行解析最终可以转化为一个包含component_verify_ticket的xml
    • 有效时间为 12 小时
  2. 令牌 component_access_token

    • 通过验证票据component_verify_ticket调接口获取
    • 有效时间为 2 小时,在令牌快过期时(比如1小时50分),应重新获取。
  3. 预授权码 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)

  4. 通过上一步中获得的授权码auth_code调用https://api.weixin.qq.com/cgi-bin/component/api_query_auth?component_access_token=xxxx,换取授权公众号或小程序的appid和authorizer_access_token、authorizer_refresh_token

  5. authorizer_access_token有效期2小时,如果过期可通过authorizer_refresh_token重新获取

  6. 获取授权公众号或小程序的详细信息

  7. 当公众号/小程序对第三方平台进行授权、取消授权、更新授权后也会向步骤1中接口推送消息,通过解析可以拿到授权的变更情况

  8. 拉取所有已授权的帐号信息 该文档目前已经迁移 暂时找不到


代公众号处理业务

通过authorizer_access_tokenappid可以代公众号处理业务

代公众号调用接口

需要公众号本身有该接口权限且授权了第三方平台该权限,此时本来需要公众号access_token的地方传入authorizer_access_token即可。
错误码:45009为调用次数超限,61007为未获取公众号对应授权,48001为公众号自身缺少该权限

  • 生成带参数(场景值)二维码(关注码)
    临时码无数量限制,但最多30天。永久码无时间限制,但最多10W个。
    场景值类型可以为scene_idscene_str之一,其值会回传在用户事件的event_key
  • 发送模板消息
    仅服务号可用,需先按照所属行业申请模板
    只能发给关注了公众号的用户
  • 发送订阅通知
    仅服务号可用,需先按照所属行业申请模板
    对已关注服务号的用户,通知下发到号内,未关注的下发到服务通知。
    需用户在网页等场景中订阅后,服务号可不限时间地下发一次对应的通知。(仅政务民生、医疗等特殊行业可多次下发)
  • 获取用户信息 /cgi-bin/user/info
    同一用户,对每个公众号的OpenID是唯一的。
    同一用户,对同一个微信开放平台下的不同应用,unionid是相同的。
    通过本接口可以根据OpenID获取用户unionid(如存在)和是否关注公众号,如已关注则还有关注时间、关注的渠道、关注时的场景码。(2021年12月起此接口不再能获得用户头像、昵称)。
代公众号处理消息和事件
  • 接收用户消息、接收用户事件
    微信服务器会将粉丝发给公众号的消息,以及微信服务器发给公众号的事件推送(如菜单点击、关注通知等),发给该公众号所有已授权的第三方平台开发者服务器。

  • 被动回复用户消息/事件
    开发者在接收到上述消息和部分事件后,需要在 5 秒内响应,否则微信会重试三次。依然无响应或响应错误,则向用户下发系统提示“该公众号暂时无法提供服务,请稍后再试”。
    返回内容可以通过XML配置为文本、图片、语音、视频、音乐、图文。为如多个第三方平台都做出响应,则依照响应顺序依次生效

  • 主动发送客服消息
    在用户主动触发上述行为后的一段时间内,可以主动向用户发送客服消息

代公众号发起网页授权
  1. 令用户访问授权地址https://open.weixin.qq.com/connect/oauth2/authorize,同意后带着code跳转到符合【第三方平台 - 公众号开发域名】的自定义回调地址。其中scope的值可以为:
    • snsapi_base:静默授权,仅能用于获取openid
    • snsapi_userinfo:需要用户手动同意,可用于获取openid、unionid、头像、昵称等。可能触发网页快照机制,详见文末。
  2. 在回调地址中,通过code换取公众号access_token,并调用接口获取scope对应的用户信息
    注:使用第三方平台和直接微信公众号开发,接口相同但参数不同。且公众号的返回值里还会多一个is_snapshotuser用于判断是否进入了快照模式
  3. 在回调地址中做二次跳转,前往用户最终需要的前端页面
代公众号使用JSSDK

用户信息获取概况

  • 用户关注、向公众号发消息、扫描带参数二维码等操作后,收到的事件推送XML中含有openid
  • 通过openid可进一步调用/cgi-bin/user/info获取unionid及用户关注情况(是否关注、关注时间、关注的途径及场景码)
  • snsapi_base 模式的网页授权为静默授权,回调获取code可兑换openid
  • snsapi_userinfo 模式的网页授权,回调获取code可兑换openidunionid、头像、昵称等
    1. 从本公众号的会话或菜单中直接访问该授权地址,静默授权
    2. 通过扫码、和其他用户的会话链接等场景,直接访问该授权地址
      • 最近刚关注,或通过其他方式完成过本公众号授权,则静默授权
      • 以前关注过公众号,但长期未授权,则进入授权页面。此时如果拒绝授权,重定向不带code参数
      • 未关注公众号,总是触发网页快照机制
    3. 通过其他页面跳转到该授权地址(微信官方推荐的做法)
      即先告知用户授权的目的,然后用户主动交互跳转到授权地址。
      若最近完成过本公众号授权,则静默授权。否则会在原页面底部自动弹出授权弹窗,若拒绝则无事发生。若同意则完成重定向并带有code。
      暂不清楚该模式下是否会触发网页快照机制
网页快照机制

2022 年 7 月起,使用snsapi_userinfo权限时必须符合授权规范,否则强制变为网页快照模式(你不体面,微信就帮你体面)。
快照的授权流程看似静默授权,不会出现授权弹窗,且重定向后正常返回code,但实际上通过该code只能兑换假的用户信息(包括openid也是假的。且其昵称似乎固定为“微信用户”)。
最终跳转的页面会变为快照页面,是实际网页的静态预览,无法交互。仅点击底部同意授权后,会再次走正常的code流程,并抵达真正的最终页面。

  • 虽然官方文档没有明确说明,但已关注公众号的用户似乎不会触发网页快照机制

你可能感兴趣的:(微信公众号与开放平台第三方平台开发)