微信开放平台第三方代小程序开发,授权事件、消息与事件通知总结

大家好,我是小悟

时间过得真快,转眼就到了国庆节尾巴,小伙伴们吃好喝好玩好了么。

关于微信开放平台第三方代小程序开发的两个事件接收推送通知,是开放平台代小程序实现业务的重要功能。

授权事件推送,事件类型以InfoType的值判断,消息与事件推送,事件类型以Event的值判断。

授权事件推送通知

在这里插入图片描述

授权事件推送包括:验证票据、授权成功、取消授权、授权更新、快速注册企业小程序、快速注册个人小程序、注册试用小程序、试用小程序快速认证、发起小程序管理员人脸核身、申请小程序备案。微信服务器会向第三方平台方的授权事件接收 URL 以 POST 的方式推送相关通知。

值得注意的是,关于发起小程序管理员人脸核身和申请小程序备案,官方文档归类的是消息与事件推送,数据格式是JSON。实测应该是授权事件推送,数据格式仍然是XML。

验证票据:在第三方平台创建审核通过后,微信服务器会向其“授权事件接收URL” 每隔10分钟以 POST 的方式推送票据。
InfoType的值为component_verify_ticket

<xml><AppId>some_appid</AppId><CreateTime>1413192605</CreateTime><InfoType>component_verify_ticket</InfoType><ComponentVerifyTicket>some_verify_ticket</ComponentVerifyTicket>
</xml>

授权成功:InfoType的值为authorized

<xml><AppId>第三方平台appid</AppId><CreateTime>1413192760</CreateTime><InfoType>authorized</InfoType><AuthorizerAppid>公众号appid</AuthorizerAppid><AuthorizationCode>授权码</AuthorizationCode><AuthorizationCodeExpiredTime>过期时间</AuthorizationCodeExpiredTime><PreAuthCode>预授权码</PreAuthCode>
<xml>

取消授权:InfoType的值为unauthorized

<xml><AppId>第三方平台appid</AppId><CreateTime>1413192760</CreateTime><InfoType>unauthorized</InfoType><AuthorizerAppid>公众号appid</AuthorizerAppid>
</xml>

授权更新:InfoType的值为updateauthorized

<xml><AppId>第三方平台appid</AppId><CreateTime>1413192760</CreateTime><InfoType>updateauthorized</InfoType><AuthorizerAppid>公众号appid</AuthorizerAppid><AuthorizationCode>授权码</AuthorizationCode><AuthorizationCodeExpiredTime>过期时间</AuthorizationCodeExpiredTime><PreAuthCode>预授权码</PreAuthCode>
<xml>

快速注册企业小程序:InfoType的值为notify_third_fasteregister

<xml><AppId><![CDATA[第三方平台appid]]></AppId><CreateTime>1535442403</CreateTime><InfoType><![CDATA[notify_third_fasteregister]]></InfoType><appid>创建小程序appid</appid><status>0</status><auth_code>xxxxx第三方授权码</auth_code><msg>OK</msg><info><name><![CDATA[企业名称]]></name><code><![CDATA[企业代码]]></code><code_type>1</code_type><legal_persona_wechat><![CDATA[法人微信号]]></legal_persona_wechat><legal_persona_name><![CDATA[法人姓名]]></legal_persona_name><component_phone><![CDATA[第三方联系电话]]></component_phone></info>
</xml>

快速注册个人小程序:InfoType的值为notify_third_fasteregister

<xml><AppId><![CDATA[第三方平台appid]]></AppId><CreateTime>1535442403</CreateTime><InfoType><![CDATA[notify_third_fasteregister]]></InfoType><appid>创建小程序appid</appid><status>0</status><auth_code>xxxxx第三方授权码</auth_code><msg>OK</msg><info><taskid><![CDATA[任务id]]></taskid> 实测只有返回这个<wxuser><![CDATA[用户微信号]]></wxuser> 实测没有返回这个<idname><![CDATA[用户姓名]]></wxidnnn> 实测没有返回这个<component_phone><![CDATA[第三方联系电话]]></component_phone> 实测没有返回这个</info>
</xml>

注册试用小程序:InfoType的值为notify_third_fastregisterbetaapp

<xml><AppId><![CDATA[第三方平台appid]]></AppId><CreateTime>1535442403</CreateTime><InfoType><![CDATA[notify_third_fastregisterbetaapp]]></InfoType><appid>创建小程序appid<appid><status>0</status><msg>OK</msg><info><unique_id><![CDATA[unique_id]]></unique_id><name><![CDATA[小程序名称]]></name></info>
</xml>

试用小程序快速认证:InfoType的值为notify_third_fastverifybetaapp

<xml><AppId><![CDATA[第三方平台appid]]></AppId><CreateTime>1535442403</CreateTime><InfoType><![CDATA[notify_third_fastverifybetaapp]]></InfoType><appid>小程序appid<appid><status>0</status><msg>OK</msg><info><name><![CDATA[企业名称]]></name><code><![CDATA[企业代码]]></code><code_type>1</code_type><legal_persona_wechat><![CDATA[法人微信号]]></legal_persona_wechat><legal_persona_name><![CDATA[法人姓名]]></legal_persona_name><component_phone><![CDATA[第三方联系电话]]></component_phone></info>
</xml>

发起小程序管理员人脸核身:InfoType的值为notify_icpfiling_verify_result

<xml><AppId><![CDATA[第三方平台appid]]></AppId><CreateTime>1689839779</CreateTime><InfoType><![CDATA[notify_icpfiling_verify_result]]></InfoType><task_id>人脸核验任务id<task_id><verify_appid>小程序唯一id</verify_appid><result>人脸核验结果:2-核验失败;3-核验成功</result>
</xml>

申请小程序备案:InfoType的值为notify_apply_icpfiling_result

<xml><AppId><![CDATA[第三方平台appid]]></AppId><CreateTime>1689839779</CreateTime><InfoType><![CDATA[notify_apply_icpfiling_result]]></InfoType><authorizer_appid>小程序唯一id<authorizer_appid><beian_status>备案状态</beian_status>
</xml>

接收 POST 请求后,只需直接返回字符串 success。为了加强安全性,postdata 中的 xml 将使用服务申请时的加解密 key 来进行加密,在收到推送后需进行解密。


@PostMapping(value = "saveTicket")
public void saveTicket(HttpServletRequest request, HttpServletResponse response) throws IOException {String msgSignature = request.getParameter("msg_signature");String timeStamp = request.getParameter("timestamp");String nonce = request.getParameter("nonce");BufferedReader br = new BufferedReader(new InputStreamReader(request.getInputStream(),"UTF-8"));StringBuffer sb = new StringBuffer();String line;while ((line = br.readLine()) != null) {sb = sb.append(line);}String postData = sb.toString();try {logger.warn("推送component_verify_ticket协议---->获得数据为msgSignature={},timeStamp={}, nonce={},postData={}",msgSignature, timeStamp, nonce, postData);ComponentVerifyTicket obj = DecryptMsgKey.loadComponentVerifyTicket(nonce, timeStamp, msgSignature,postData);String infoType = obj.getInfoType();logger.warn("infoType:{}", infoType);if (StringUtils.equals("component_verify_ticket", infoType)) {RedisService<ComponentVerifyTicket> redisService = RedisService.load();redisService.save(obj, ComponentVerifyTicket.class);logger.warn("推送component_verify_ticket协议---->成功,保存到缓存中的值为:" + obj);} else if (StringUtils.equals("authorized", infoType)) {logger.warn("授权成功");} else if (StringUtils.equals("unauthorized", infoType)) {logger.warn("取消授权");} else if (StringUtils.equals("updateauthorized", infoType)) {logger.warn("授权更新");} else if (StringUtils.equals("notify_third_fasteregister", infoType)) {logger.warn("快速注册小程序");} else if (StringUtils.equals("notify_third_fastregisterbetaapp", infoType)) {logger.warn("注册试用小程序");} else if (StringUtils.equals("notify_third_fastverifybetaapp", infoType)) {logger.warn("试用小程序快速认证");} else if (StringUtils.equals("notify_icpfiling_verify_result", infoType)) {logger.warn("发起小程序管理员人脸核身");} else if (StringUtils.equals("notify_apply_icpfiling_result", infoType)) {logger.warn("申请小程序备案");}} catch (Exception e) {logger.error("系统异常", e);} finally {// 响应消息PrintWriter out = response.getWriter();out.print("success");}
}

消息与事件推送通知

在这里插入图片描述

消息与事件推送包括:设置小程序名称、添加类目、提交代码审核。审核结果会向消息与事件接收 URL 进行事件推送。

设置小程序名称:Event的值为wxa_nickname_audit

<xml><ToUserName><![CDATA[gh_fxxxxxxxa4b2]]></ToUserName><FromUserName><![CDATA[odxxxxM-xxxxxxxx-trm4a7apsU8]]></FromUserName><CreateTime>1488800000</CreateTime><MsgType><![CDATA[event]]></MsgType><Event><![CDATA[wxa_nickname_audit]]></Event><ret>2</ret><nickname>昵称</nickname><reason>驳回原因</reason>
</xml>

添加类目:Event的值为wxa_category_audit

<xml><ToUserName><![CDATA[gh_fxxxxxxxa4b2]]></ToUserName><FromUserName><![CDATA[odxxxxM-xxxxxxxx-trm4a7apsU8]]></FromUserName><CreateTime>1488800000</CreateTime><MsgType><![CDATA[event]]></MsgType><Event><![CDATA[wxa_category_audit]]></Event><ret>2</ret><first>一级类目id</nickname><second>二级类目id</reason><reason>驳回原因</reason>
</xml>

提交代码审核:包括三种结果,审核通过、审核不通过、审核延后。
审核通过:Event的值为weapp_audit_success

<xml><ToUserName><![CDATA[gh_fb9688c2a4b2]]></ToUserName><FromUserName><![CDATA[od1P50M-fNQI5Gcq-trm4a7apsU8]]></FromUserName><CreateTime>1488856741</CreateTime><MsgType><![CDATA[event]]></MsgType><Event><![CDATA[weapp_audit_success]]></Event><SuccTime>1488856741</SuccTime>
</xml>

审核不通过:Event的值为weapp_audit_fail

<xml><ToUserName><![CDATA[gh_fb9688c2a4b2]]></ToUserName><FromUserName><![CDATA[od1P50M-fNQI5Gcq-trm4a7apsU8]]></FromUserName><CreateTime>1488856591</CreateTime><MsgType><![CDATA[event]]></MsgType><Event><![CDATA[weapp_audit_fail]]></Event><Reason><![CDATA[1:账号信息不符合规范:<br>(1):包含不适合因素<br>2:服务类目"金融业-保险_"与你提交代码审核时设置的功能页面内容不一致:<br>(1):功能页面设置的部分标签不属于所选的服务类目范围。<br>(2):功能页面设置的部分标签与该页面内容不相关。<br>]]></Reason><FailTime>1488856591</FailTime><ScreenShot>xxx|yyy|zzz</ScreenShot>
</xml>

审核延后:Event的值为weapp_audit_delay

<xml><ToUserName><![CDATA[gh_fb9688c2a4b2]]></ToUserName><FromUserName><![CDATA[od1P50M-fNQI5Gcq-trm4a7apsU8]]></FromUserName><CreateTime>1488856591</CreateTime><MsgType><![CDATA[event]]></MsgType><Event><![CDATA[weapp_audit_delay]]></Event><Reason><![CDATA[为了更好的服务小程序,您的服务商正在进行提审系统的优化,可能会导致审核时效的增长,请耐心等待]]></Reason><DelayTime>1488856591</DelayTime>
</xml>

接收 POST 请求后,只需直接返回字符串 success。为了加强安全性,postdata 中的 xml 将使用服务申请时的加解密 key 来进行加密,在收到推送后需进行解密。

@PostMapping(value = "/notify/{appId}/callback")
public void callback(@PathVariable("appId") String appId, HttpServletRequest request, HttpServletResponse response) throws IOException {logger.info("消息与事件通知appId:{}", appId);String msgSignature = request.getParameter("msg_signature");String timeStamp = request.getParameter("timestamp");String nonce = request.getParameter("nonce");BufferedReader br = new BufferedReader(new InputStreamReader(request.getInputStream(),"UTF-8"));StringBuffer sb = new StringBuffer();String line;while ((line = br.readLine()) != null) {sb = sb.append(line);}String postData = sb.toString();logger.info("消息与事件通知postData:{}", postData);try {PushCallbackEvent pushCallbackEvent = DecryptMsgKey.loadPushCallbackEvent(nonce, timeStamp, msgSignature, postData);String event = pushCallbackEvent.getEvent();if (StringUtils.equals("wxa_nickname_audit", event)) {logger.warn("设置小程序名称");} else if (StringUtils.equals("wxa_category_audit", event)) {logger.warn("添加类目");} else if (StringUtils.equals("weapp_audit_success", event)) {logger.warn("提交代码审核通过");} else if (StringUtils.equals("weapp_audit_fail", event)) {logger.warn("提交代码审核不通过");} else if (StringUtils.equals("weapp_audit_delay", event)) {logger.warn("提交代码审核延后");}} catch (Exception e) {logger.error("系统异常", e);} finally {// 响应消息PrintWriter out = response.getWriter();out.print("success");}
}

您的一键三连,是我更新的最大动力,谢谢

山水有相逢,来日皆可期,谢谢阅读,我们再会

我手中的金箍棒,上能通天,下能探海

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/96152.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ssm+vue的培训机构运营管理系统(有报告)。Javaee项目,ssm vue前后端分离项目。

演示视频&#xff1a; ssmvue的培训机构运营管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;ssm vue前后端分离项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结…

二分查找:34. 在排序数组中查找元素的第一个和最后一个位置

个人主页 &#xff1a; 个人主页 个人专栏 &#xff1a; 《数据结构》 《C语言》《C》《算法》 文章目录 前言一、题目解析二、解题思路1. 暴力查找2. 一次二分查找 部分遍历3. 两次二分查找分别查找左右端点1.查找区间左端点2. 查找区间右端点 三、代码实现总结 前言 本篇文…

蓝桥杯每日一题2023.10.6

题目描述 门牌制作 - 蓝桥云课 (lanqiao.cn) 题目分析 #include<bits/stdc.h> using namespace std; int ans; int main() {for(int i 1; i < 2020; i ){int x i;while(x){int a x % 10;if(a 2)ans ;x / 10;}}cout << ans;return 0; } 题目描述 既约分数…

C++设计模式-桥接(Bridge)

目录 C设计模式-桥接&#xff08;Bridge&#xff09; 一、意图 二、适用性 三、结构 四、参与者 五、代码 C设计模式-桥接&#xff08;Bridge&#xff09; 一、意图 将抽象部分与它的实现部分分离&#xff0c;使它们都可以独立地变化。 二、适用性 你不希望在抽象和它…

Spring Cloud Gateway网关中各个过滤器的作用与介绍

文章目录 1. Route To Request URL Filter&#xff08;路由过滤器&#xff09;2. Gateway Filter&#xff08;全局过滤器&#xff09;3. Pre Filter&#xff08;前置过滤器&#xff09;4. Post Filter&#xff08;后置过滤器&#xff09;5. Error Filter&#xff08;错误过滤器…

Linux中的wc命令

2023年10月6月&#xff0c;周五晚上 目录 wc命令的主要功能和用法如下:统计文件行数、字数和字节数只统计行数只统计字数只统计字节数 wc命令在Linux/Unix系统中是word count的缩写,它用来统计文件的行数、字数和字节数。 wc命令的主要功能和用法如下: 统计文件行数、字数和字…

【C++设计模式之状态模式:行为型】分析及示例

简介 状态模式&#xff08;State Pattern&#xff09;是一种行为型设计模式&#xff0c;它允许对象在内部状态改变时改变其行为&#xff0c;看起来就像是改变了其类。状态模式将对象的状态封装成不同的类&#xff0c;并使得对象在不同状态下有不同的行为。 描述 状态模式通过…

Qt之显示PDF文件

之前使用过mupdf库&#xff0c;能够成功显示pdf&#xff0c;但是我用着有BUG&#xff0c;不太理解它的代码&#xff0c;搞了好久都不行。后面又试了其他库&#xff0c;如pdfium、popler、下载了很多例程&#xff0c;都跑不起来&#xff01;后面偶然得知xpdf库&#xff0c;看起来…

C++-封装unordered

本期我们来封装实现unordered系列&#xff0c;需要前置知识&#xff0c;没有看过哈希的建议先看看哈希&#xff0c;而且哈希的代码都在这里面&#xff0c;一会要用到 C-哈希Hash-CSDN博客 目录 代码实现 迭代器 const迭代器 全部代码 代码实现 首先我们要把V改为T&#xff…

2023-10-06 LeetCode每日一题(买卖股票的最佳时机含手续费)

2023-10-06每日一题 一、题目编号 714. 买卖股票的最佳时机含手续费二、题目链接 点击跳转到题目位置 三、题目描述 给定一个整数数组 prices&#xff0c;其中 prices[i]表示第 i 天的股票价格 &#xff1b;整数 fee 代表了交易股票的手续费用。 你可以无限次地完成交易&…

STM32复习笔记(一):软件配置工程创建

目录 Preface&#xff1a; Hardware-Configuration & Software-Environment&#xff1a; &#xff08;一&#xff09;新建项目工程 &#xff08;二&#xff09;工程配置 &#xff08;三&#xff09;配置外设 &#xff08;四&#xff09;项目管理 &#xff08;五&…

区别对比表:阿里云轻量服务器和云服务器ECS对照表

阿里云轻量应用服务器和云服务器ECS区别对照表&#xff0c;一看就懂的适用人群、使用场景、优缺点、使用限制、计费方式、网路和镜像系统全方位对比&#xff0c;阿里云服务器网分享ECS和轻量应用服务器区别对照表&#xff1a; 目录 轻量应用服务器和云服务器ECS区别对照表 轻…

51单片机音乐闹钟秒表倒计时整点报时多功能电子钟万年历数码管显示( proteus仿真+程序+原理图+报告+讲解视频)

51单片机音乐闹钟秒表倒计时整点报时多功能电子钟万年历数码管显示( proteus仿真程序原理图报告讲解视频&#xff09; 讲解视频1.主要功能&#xff1a;2.仿真3. 程序代码4.原理图5. 设计报告6. 设计资料内容清单 51单片机音乐闹钟秒表倒计时整点报时多功能电子钟万年历数码管显…

MySQL视图、用户管理

目录 视图概念和操作 视图基本操作 视图规则和限制 用户管理 用户 视图概念和操作 什么是视图&#xff1f; 视图是一个虚拟表&#xff0c;由一个或多个基本表的查询结果组成&#xff08;视图是存储在数据库中的查询的SQL 语句&#xff0c;不在数据库中以存储的数据值集形式…

Verilator: sh: 1: exec: < PATHNAME >: not found

事出有因 I assumed that I install verilator via git clone its source, so I need to set the export VERILATOR_ROOT. At first, due to laziness, I just copy the code directly to my ubuntu. so stupid I am!!! Then, I recoginzed that the pathname is not real, …

wireshark of tshark tools v3.4.0版本 支持json

tshark(1) Install tshark (Wireshark) Ver.3.4.0 on CentOS7 --It must be "ps", "text", "pdml", "psml" or "fields". TCP 协议中的三次握手和四次挥手是 TCP 连接建立和关闭的过程。 三次握手 客户端向服务器发送 SYN…

JMeter学习第一、二、三天

首先&#xff0c;我们来了解一下到底什么是接口测试与性能测试&#xff1a; 接口测试 定义 接口测试主要关注系统组件之间的交互&#xff0c;确保各个接口按预期工作。这包括验证传递的数据、数据格式、调用的频率和其他与接口调用相关的任何限制。 目的 确保系统的各个组件可…

mac清理垃圾的软件有哪些?这三款我最推荐

没错&#xff0c;Mac电脑真的好用&#xff0c;但是清理系统垃圾可不是件容易的事。由于Mac系统的封闭性&#xff0c;系统的缓存垃圾常常隐藏得让人发现不了。不过&#xff0c;别担心&#xff01;有一些专业的Mac清理软件可以帮你解决这一系列问题&#xff0c;让清理垃圾变得轻松…

10链表-单链表构造LinkedList

目录 LeetCode之路——707. 设计链表 分析&#xff1a; Code&#xff1a; LeetCode之路——707. 设计链表 你可以选择使用单链表或者双链表&#xff0c;设计并实现自己的链表。 单链表中的节点应该具备两个属性&#xff1a;val 和 next 。val 是当前节点的值&#xff0c;n…

什么是TF-A项目的长期支持?

安全之安全(security)博客目录导读 问题&#xff1a;Trusted Firmware-A社区每六个月发布一次代码。然而&#xff0c;对于生产中的平台&#xff0c;该策略在维护、重要软件修复的向后兼容性、获得最新的安全缓解措施和整体产品生命周期管理方面不具备可扩展性。 开源软件项目&…