微信小程序接收客服消息时遇到的坑

在开发微信小程序并使用客服消息功能时,遇到了接收数据包字段大小写不匹配的问题。微信服务器发送的数据包字段首字母大写,而Java SpringBoot的实体字段通常首字母小写。尝试通过设置别名解决接收问题后,发现发送客服消息时,字段又变为全小写,暗示可能为腾讯内部不同模块的规则不一致。此外,对于Java开发者,腾讯提供的示例代码均为PHP,缺乏Java示例,增加了开发难度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近开发微信小程序, 使用到了客服消息功能, 开发文档中这样描述: 

接收消息和事件

在页面中使用 <button open-type="contact" /> 可以显示进入客服会话按钮。

当用户在客服会话发送消息(或进行某些特定的用户操作引发的事件推送时),微信服务器会将消息(或事件)的数据包(JSON或者XML格式)POST请求开发者填写的URL。开发者收到请求后可以使用发送客服消息接口进行异步回复。

用户在客服会话中发送文本消息时将产生如下数据包:

{
	"ToUserName": "toUser",
	"FromUserName": "fromUser",
	"CreateTime": 1482048670,
	"MsgType": "text",
	"Content": "this is a test",
	"MsgId": 1234567890123456
}

也就是说微信服务器会把这个数据包post到我的服务器上, 我的服务器收到数据包后, 就把信息保存到数据库中.  

后台服务器我用的是java平台技术springBoot那一套方案, 我建立一个实体类来映射消息 , 字段名与数据包中的字段名保持一致, 问题来了, 数据包中的字段首字母都是大写的如 ToUserName, java类中字段名一般都是首字母小写的, 为了与数据包保持一致, 那就大写吧, 控制器方法用@RequestBody接收数据包, 写完调试时, 发现死活接收不到数据, 都是null , 没办法, 把字段名首字母改成小写试试, 发现spring直接报错, 说ToUserName没有找到相应的getter方法,  行不通. 

后来一通搜索大法, 找到解决方法如下

### 微信小程序实现 MQTT 消息接收的方法 #### 准备工作 为了使微信小程序能够通过 MQTT 协议实现实消息接收,需先完成一些准备工作。这包括但不限于引入 mqtt.js 库文件至项目中以及配置好服务器端的相关参数[^2]。 #### 连接设置 在 `app.js` 或者页面对应的 js 文件里初始化 MQTT 客户端实例并建立连接: ```javascript const mqtt = require('mqtt'); // 创建客户端, 替换成自己的 Broker 地址和服务认证信息 let client = mqtt.connect('wss://broker.emqx.io:8084/mqtt', { clientId: 'wx_app_' + Math.random().toString(16).substr(2, 8), }); ``` 上述代码片段展示了如何创建一个 WebSocket 类型的安全连接来作为传输通道,并指定了唯一的 Client ID 来标识此次会话。 #### 订阅主题与处理收到的消息 当成功建立了同云端服务之间的稳定链接之后,则可以开始订阅感兴趣的主题以便监听特定类型的数据更新事件;与此同定义回调函数用于捕获新到达的信息包: ```javascript client.on('connect', function () { console.log("Connected to broker"); // 成功连接后订阅 topic 主题 client.subscribe('/test/topic',function (err) { if (!err){ console.log("Subscribed!"); } }); }); client.on('message', function (topic, message) { // 当有新的消息到来触发此方法 console.log(`Received Message: ${message.toString()} from Topic:${topic}`); }) ``` 这里实现了两个重要的功能:一是确认已连上代理节点并向指定话题发起请求;二是每当检测到目标频道内存在未读数据项即刻执行相应逻辑操作——打印日志记录下具体内容。 #### 断开重试机制 考虑到网络波动可能导致意外断线情况的发生,在实际开发过程中建议加入自动恢复特性以增强系统的健壮性和用户体验度: ```javascript client.on('close', ()=>{ console.warn('Connection closed unexpectedly. Retrying...'); setTimeout(() => { client.reconnect(); }, 5000); // 延迟五秒尝试重新接入 }) client.on('offline',()=>{ console.error('Client is offline.'); }) ``` 以上部分提供了针对异常状况下的应对策略,确保即使遇到短暂性的通信障碍也能尽快恢复正常运作状态。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值