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

news2024/11/16 17:27:33

大家好,我是小悟

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

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

授权事件推送,事件类型以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.coloradmin.cn/o/1063574.html

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

相关文章

面试题: Spring AOP是如何实现的? 它和AspectJ有什么区别?

Spring AOP是如何实现的? 它和AspectJ有什么区别? 背景答案SpringAOP实现与AspectJ区别AOP 的几种实现方案 个人评价 背景 想换工作, 学习一下面试题, 算是学习记录的输出. 答案 SpringAOP实现 Spring AOP 是利用的动态代理的机制, 如果一个Bean 实现了接口, 那么就会采用…

苹果签名的MDM(Mobile Device Management)?是怎么做的?优势是什么?什么场合需要应用到?

苹果签名有多少种类之TF签名(TestFlight签名&#xff09;是什么&#xff1f;优势是什么&#xff1f;什么场合需要应用到&#xff1f; 苹果签名有多少种类之TF签名(TestFlight签名&#xff09;是什么&#xff1f;优势是什么&#xff1f;什么场合需要应用到&#xff1f; MDM&am…

1400*C. Soldier and Cards(贪心模拟)

Problem - 546C - Codeforces Soldier and Cards - 洛谷 解析&#xff1a; 模拟即可&#xff0c;当循环次数过大的时候跳出循环打印 -1 #include<bits/stdc.h> using namespace std; #define int long long const int N2e55; int n,x,k1,k2,cnt; queue<int>a,b;…

LangChain 摘要 和问答示例

在Azure上的OpenAI端点 注意 OpenAI key 可以用微软 用例【1. 嵌入 &#xff0c;2. 问答】 1. import os import openai from langchain.embeddings import OpenAIEmbeddings os.environ["OPENAI_API_KEY"] "****" # Azure 的密钥 os.environ["OP…

Python入门教程50:Pycharm中鼠标滚动,如何实现字体大小自由的缩放

★★★★★博文创作不易&#xff0c;我的博文不需要打赏&#xff0c;也不需要知识付费&#xff0c;可以白嫖学习编程小技巧。使用代码的过程中&#xff0c;如有疑问的地方&#xff0c;欢迎大家指正留言交流。喜欢的老铁可以多多点赞收藏分享置顶&#xff0c;小红牛在此表示感谢…

Http常见问题

说说 HTTP 常用的状态码及其含义&#xff1f; HTTP 状态码首先应该知道个大概的分类&#xff1a; 1XX&#xff1a;信息性状态码2XX&#xff1a;成功状态码3XX&#xff1a;重定向状态码4XX&#xff1a;客户端错误状态码5XX&#xff1a;服务端错误状态码 301&#xff1a;永久性…

Linux上将进程、线程与CPU核绑定

CPU亲和性(CPU Affinity)是某一进程(或线程)绑定到特定的CPU核(或CPU集合)&#xff0c;从而使得该进程(或线程)只能运行在绑定的CPU核(或CPU集合)上。进程(或线程)本质上并不与CPU核绑定。每次进程(或线程)被调度执行时&#xff0c;它都可以由其关联列表中的任何CPU核执行。如果…

洛谷题解 | P9690 [GDCPC2023] Programming Contest

目录 题面翻译题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示题目简化题目思路AC代码 题面翻译 【题目描述】 广东省是全国较早一批将程序设计竞赛引入省内大学生竞赛体系的省份之一。 2003 2003 2003 年&#xff0c;中山大学承办了第一届广东省大学生程序设计…

2023了,学习深度学习框架哪个比较好?

都2023年&#xff0c;才来回答这个问题&#xff0c;自然毫无悬念地选择PyTorch&#xff0c;TensorFlow在大模型这一波浪潮中没有起死回生&#xff0c;有点惋惜&#xff0c;现在GLM、GPT、LLaMA等各种大模型都是基于PyTorch框架构建。这个事情已经水落石出。 不过呢&#xff0c…

关于智能空气动力学

智能空气动力学是指运用智能科学方法和研究范式研究空气运动&#xff0c;尤其是物体与空气相对运动时空气对物体所施作用力规律、气体的流动规律和伴随发生的物理学变化&#xff0c;解决空气动力学问题的新的交叉学科。在空气动力学三大传统研究手段的基础上&#xff0c;智能空…

自学SLAM(2)---保姆教程教你如何使用自己的视频运行ORB-SLAM2

前言 如果你是新手入门&#xff0c;仅仅只会Linux的基本操作&#xff0c;并看了高翔老师视觉SLAM视屏的第一讲&#xff0c;那么你需要准备一整天的时间&#xff0c;可能还不一定能运行出来&#xff01;运行ORB-SLAM2将会安装很多很多东西。那么&#xff0c;我们准备开始&#x…

新版WIFI分销系统微信小程序源码+WiFi大师版流量主+搭建独立源码WiFi营销小程序源码

新版WIFI分销系统微信小程序源码&#xff0c;带有流量主&#xff0c;可以搭建独立源码的WiFi营销小程序源码。它是一款集流量主、分销和WiFi热点为一体的微信小程序源码。它基于创新的技术架构和设计理念&#xff0c;实用和运行稳定。 这款源码有多种分销模式&#xff0c;用户…

基于闪电搜索优化的BP神经网络(分类应用) - 附代码

基于闪电搜索优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码 文章目录 基于闪电搜索优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码1.鸢尾花iris数据介绍2.数据集整理3.闪电搜索优化BP神经网络3.1 BP神经网络参数设置3.2 闪电搜索算法应用 4.测试结果…

bat脚本获取系统服务的可执行文件路径

查看系统服务器名称 鼠标右键点击&#xff0c;选择任务管理器 我们以ActiveMQ为例子进行演示 手动查看可执行文件路径 打开服务 选择服务&#xff0c;右键选择属性 下图中就是可执行路径 命令行查看可执行文件路径 选择管理员运行 cmd运行下面命令 sc qc ActiveMQ 下图就是…

Python 无废话-基础知识函数详解

函数定义 函数是一段可重复使用的代码块&#xff0c;用于实现特定的功能。 类似的前面已学过print(),len(),input(),str(),list(),tuple()等内置函数 自定义函数 内置函数是python类库的已定义好的函数&#xff0c;如果某些功能不能满足时&#xff0c;需要我们自定义函数&am…

迄今为止丨ChatGPT最强指令,一个可以让机器人生成机器人的Prompt,价值百万!

原文&#xff1a; 【ChatGPT调教】ChatGPT最强指令、让机器人为你生成机器人&#xff01;-CSDN博客 说明&#xff1a;最好看原文 昨天&#xff0c;发现了一条可能是迄今为止&#xff0c;我见过最牛的&#xff0c;商业价值最高的ChatGPT指令。 通过这条指令&#xff0c;可以…

推荐系统实践 笔记

诸神缄默不语-个人CSDN博文目录 这是我2020年写的笔记&#xff0c;我从印象笔记搬过来公开。 如果那年还在读本科的同学也许有印象&#xff0c;那年美赛出了道根据电商评论给商户提建议的题。其实这件事跟推荐系统关系不大&#xff0c;但我们当时病急乱投医&#xff0c;我打开…

Golang interface 接口的应用场景 使用细节

应用场景介绍 对初学者讲&#xff0c;理解接口的概念不算太难&#xff0c;难的是不知道什么时候使用接口&#xff0c;下面我例举几个应用场景&#xff1a; 1.说现在美国要制造轰炸机&#xff0c;武装直升机&#xff0c;专家只需把飞机需要的功能/规格定下来即可&#xff0c;然…

​“FTX 传奇曾经大佬 SBF 的审判:密友出庭指控,陪审团选择延长,听证会揭示 “

备受期待的 FTX 创始人 SBF 刑事审判开始&#xff0c;引发了检方和辩方之间关于他在加密货币交易所垮台中所扮演角色的冲突。美国助理检察官塞恩雷恩(ThaneRehn)将 SBF 描述为一位前雄心勃勃的人物&#xff0c;过着建立在欺骗基础上的奢华生活方式。 SBF 的律师马克科…

逻辑回归评分卡

文章目录 一、基础知识点(1)逻辑回归表达式(2)sigmoid函数的导数损失函数(Cross-entropy, 交叉熵损失函数)交叉熵求导准确率计算评估指标 二、导入库和数据集导入库读取数据 三、分析与训练四、模型评价ROC曲线KS值再做特征筛选生成报告 五、行为评分卡模型表现总结 一、基础知…