接收微信用户发送的事件以及消息

进入第三方平台的管理中心,查看并保存以下信息
确认预设的公众号消息与事件接收URL
把token和key保存在项目的静态类中或者数据库中,方便随时调用
微信公众平台技术文档
https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140453
下面只讲接收普通文本消息

接收普通消息

当普通微信用户向公众账号发消息时,微信服务器将POST消息的XML数据包到开发者填写的URL上。

请注意:

1、关于重试的消息排重,推荐使用msgid排重。

2、微信服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次。假如服务器无法保证在五秒内处理并回复,

可以直接回复空串,微信服务器不会对此作任何处理,并且不会发起重试。详情请见“发送消息-被动回复消息”。

3、如果开发者需要对用户消息在5秒内立即做出回应,即使用“发送消息-被动回复消息”接口向用户被动回复消息时,可以在

公众平台官网的开发者中心处设置消息加密。开启加密后,用户发来的消息和开发者回复的消息都会被加密(但开发者通过客服

接口等API调用形式向用户发送消息,则不受影响)。关于消息加解密的详细说明,请见“发送消息-被动回复消息加解密说明”。

各消息类型的推送XML数据包结构如下:

文本消息

<xml>
 <ToUserName><![CDATA[toUser]]></ToUserName>
 <FromUserName><![CDATA[fromUser]]></FromUserName>
 <CreateTime>1348831860</CreateTime>
 <MsgType><![CDATA[text]]></MsgType>
 <Content><![CDATA[this is a test]]></Content>
 <MsgId>1234567890123456</MsgId>
 </xml>

参数 描述
ToUserName 开发者微信号
FromUserName 发送方帐号(一个OpenID)
CreateTime 消息创建时间 (整型)
MsgType text
Content 文本消息内容
MsgId 消息id,64位整型
简单讲,就是微信用户在手机上给公众号发的普通文本消息会以上面的格式发到第三方平台的公众号消息与事件接收URL
然后这个xml是加密过的,关于加解密前面第一篇讲过了,忘记的可以回去看
/**
* 接收公众号消息以及事件入口
* @return
*/
@ResponseBody
@RequestMapping(value = "/{appid}/callback")
public String callback(@RequestParam("timestamp")String timestamp, @RequestParam("nonce")String nonce,
@RequestParam("msg_signature")String msgSignature, @PathVariable String appid,@RequestBody String postData){
/**在日志中打印所有参数方便确认*/
logger.info("timestamp={},nonce={},msg_signature={}",timestamp,nonce,msgSignature);
try {
/**对xml进行解密*/
String resultData = thirdPartyService.decryptMsg(msgSignature, timestamp, nonce, postData);
logger.info("ThirdPartyController:callback:appid={},resultData={}",appid, resultData);
/**获取处理返回处理消息*/
String sendData = thirdPartyService.callback(resultData);
logger.info("ThirdPartyController:callback:sendData={}",sendData);
return thirdPartyService.encryptMsg( timestamp, nonce, sendData);
} catch (Exception e) {
/**如果加解密失败,打印失败信息*/
logger.info("ThirdPartyController:getComponentVerifyTicket:加解密失败");
e.printStackTrace();
return "success";
}
}
解密之后得到xml明文,将Xml转换成map,方便提取数据
之后根据消息类型进行分类处理
@Override
public String callback(String resultData) {
try {
/**将消息解析为map*/
Map<String,String> dataMap = ThirdPartyUtil.xmlToMap(resultData);
/**下面这段是每次接收消息都记录下发送方和接收方的名称并保存到数据库,方便之后的业务处理*/
String userId = dataMap.get("FromUserName");
String platformId = dataMap.get("ToUserName");
/**拼装User*/
if(!userDBService.exists(userId)){
User user = new User(platformId, userId);
logger.info("将要插入数据库:user={}",user);
userDBService.set(user);
}
/**判断消息类型,调用对应的方法*/
switch (dataMap.get("MsgType")){
case "event":
return platformMessageService.replyEvent(dataMap);
case "text":
return platformMessageService.replyMsg(dataMap);
default:
return "success";
}
} catch (Exception e) {
e.printStackTrace();
return "callback发生了异常";
}
}
以全网发布需要的测试为例子

1、模拟粉丝触发专用测试公众号的事件,并推送事件消息到专用测试公众号,第三方平台方开发者需要提取推送XML信息中的event值,并在5秒内立即返回按照下述要求组装的文本消息给粉丝。

  1. 1)微信推送给第三方平台方: 事件XML内容(与普通公众号接收到的信息是一样的)

  2. 2)服务方开发者在5秒内回应文本消息并最终触达到粉丝:文本消息的XML中Content字段的内容必须组装为:event + “from_callback”(假定event为LOCATION,则Content为: LOCATIONfrom_callback)
@Override
public String replyMsg(Map<String, String> dataMap) throws Exception {
String receivedContent = dataMap.get("Content");//获取消息内容
String platformId = dataMap.get("ToUserName");//获取公众号名称
String userId = dataMap.get("FromUserName");//获取微信用户名称
/**下面这个if也是全网发布需要的测试,通过客服消息接口给微信用户发消息*/
if(receivedContent.contains("QUERY_AUTH_CODE")){
int index = receivedContent.indexOf(":");
String authCode = receivedContent.substring(index+1);
String appId = thirdPartyService.queryAuth(authCode,"7200");
sendServiceMsg(appId,userId,receivedContent+"_from_api");
return "";
}
//拼装成指定格式
return WxMsgUtil.replyText(userId,platformId,"TESTCOMPONENT_MSG_TYPE_TEXT_callback");
}
replyText
public static String replyText(String toUserName, String fromUserName, String content) throws Exception {
Map<String,String> replyMap = new HashMap<String, String>();
replyMap.put("ToUserName",toUserName);
replyMap.put("FromUserName",fromUserName);
replyMap.put("CreateTime",ThirdPartyUtil.getCurrentTimestamp()+"");
replyMap.put("MsgType","text");
replyMap.put("Content",content);
return ThirdPartyUtil.mapToXml(replyMap);
}

微信第三方平台开发经验总结(六):接收微信用户发送的事件以及消息相关推荐

  1. 微信第三方平台开发经验总结(一):接收component_verify_ticket

    接收component_verify_ticket 在第三方平台创建审核通过后,微信服务器会向其"授权事件接收URL"每隔10分钟定时推送component_verify_tick ...

  2. 微信第三方平台开发经验总结(四):重定向到授权页

    重定向到授权页 步骤2:引入用户进入授权页 第三方平台方可以在自己的网站:中放置"微信公众号授权"或者"小程序授权"的入口,引导公众号和小程序管理员进入授权页. ...

  3. 微信第三方平台服务器端收不到微信推送的component_verify_ticket请求

    搞了很久,长时间收不到来自微信推送的component_verify_ticket 后发现是微信的BUG(由于修改过第三方开放平台相关信息,推送地址不更新的问题) 解决办法:重新申请一个公众号第三方平 ...

  4. 微信公众号接入web服务器,asp.net Web API 接入微信公众平台验证服务器,接收微信发送的POST请求...

    验证签名,接入微信公众平台:不能直接返回String,直接返回String微信服务器不接受. // GET: api/checkSignature/5 public HttpResponseMessa ...

  5. 用微信第三方平台授权小程序业务

    如果本文对你有用,请爱心点个赞,提高排名,帮助更多的人.谢谢大家!❤ 如果解决不了,可以在文末进群交流. 本文章转自php中文网:http://www.php.cn/weixin-kaifa-4069 ...

  6. 微信第三方平台开发流程和总结

    微信第三方平台开发流程和总结 创建第三方平台 1).在微信开放平台-管理中心-第三方平台中创建第三方平台账号.创建第三方平台 2).选择"平台型服务商类型"创建第三方平台.填写第三 ...

  7. java微信第三方平台全网发布(三)

    在java微信第三方平台开发(二)中写了授权事件的处理,并且第三方平台代公众号发起网页授权,获取用户信息和发红包等基本业务.接下来代公众号处理消息和事件.这时候就需要用到在开发者资料中填写的公众号消息 ...

  8. 微信企业支付 服务器根证书,微信第三方平台微信支付配置没有rootca.pem根证书文件的解决办法-蜘蛛网博客...

    微信第三方平台微信支付配置没有rootca.pem根证书文件的解决办法我们在通过微信第三方平台制作微信活动的时候,很多情况下都需要用到微信支付接口,例如商城类的微信功能,微砍价.微助力.微秒杀.微拼团 ...

  9. 微信第三方平台授权流程- java

    1. 微信第三方平台的开发,第一步就是公众号的授权,授权成功后第三方凭条才能利用公众号的appid和token获得公众账号额信息,并代替公众账号完成一些功能. 2. 授权的流程,理论图 代码流程, 1 ...

最新文章

  1. 模板 - O(n)预处理,O(1)查询gcd
  2. 虚拟机+CentOS内核hack7、8、9、17失败记
  3. Xampp里Mysql服务启动不起来,错误1067
  4. 你也可以搞懂的微服务第一篇——来自ThoughtWork的学习体验
  5. 前端学习(2945):首页搭建
  6. unittest读取ddt之-元组,嵌套元组,字典
  7. 07 熟练使用Console类实现从控制台输入输出数据 1214
  8. Python程序设计语言基础02:Python基本图形绘制
  9. Ubuntu 20.04 安装 CUDA10.0和cudnn7.6
  10. php MySQLDB类
  11. SQL Server事务、视图和索引
  12. Python 3 实现插入排序
  13. webqq机器人php,一步一步来做WebQQ机器人-(一)(验证码)
  14. 解决win10分辨率过高导致某些软件显示小的办法
  15. 已解决(Python运行报错)SyntaxError: expression cannot contain assignment, perhaps you meant “==“?
  16. java创建工厂方法_Java设计模式(八) 之创建型模式(工厂方法模式)
  17. 让旧Mac免费获得 iWork 套件的秘籍
  18. 2021年8月--最新免费国内1000个http代理ip
  19. 【noi.ac #596】road
  20. docker + laravel项目使用elasticsearch进行全文检索功能

热门文章

  1. 错误 C2447 “{”: 缺少函数标题(是否是老式的形式表?)
  2. 微信小程序-控制文本的显示及隐藏(当文字超出两行时,设置为可点击并进入查看详情页面)
  3. Linux下使用nc命令测试TCP、UDP
  4. [转载]Object-C 声明属性为什么用下划线,代码规范和编程风格_s芃成_新浪博客...
  5. 【配置rust环境】windows+vscode
  6. Android---网络交互之登录嘀咕网
  7. 2020年中国FEVE氟碳涂料行业市场运行现状及需求结构分析[图]
  8. PiLarm: 便携式树莓派警报器(红外感应+拍照+警报)
  9. 《塞尔达传说》发售 | 历史上的今天
  10. Merkle Patricia Tree 梅克尔帕特里夏树(MPT)规范(笔记)