前几个月的时候,开发了一个微信硬件相关的项目,其业务相对比较简单,就是一个微信的蓝牙硬件设备,通过微信硬件 JSAPI 传输一些数据到我们这边的服务器。
有开发微信硬件的朋友,应该都会有了解,这个流程大致如下:
但是最近客户向我反馈,收不到硬件发送的信息了。
这怎么可能,代码、服务器都没有变过,怎么可能会出问题呢?但毕竟客户就是上帝,这个问题得检查一下啊,我怀着一颗忐忑的心,看了一下服务器的 Log 日志。
看到了这段日志,更觉得奇怪,easywechat 的扩展包从来没有升级过,此版本 3.1。怎么可能会出这个问题呢?我打开了Guard.php
这个文件的代码:
/** * Handle message. * * @param array $message * * @return mixed */ protected function handleMessage(array $message) { $handler = $this->messageHandler; if (!is_callable($handler)) { Log::debug('No handler enabled.'); return null; } Log::debug('Message detail:', $message); $message = new Collection($message); $type = $this->messageTypeMapping[$message->get('MsgType')]; $response = null; if ($this->messageFilter & $type) { $response = call_user_func_array($handler, [$message]); } return $response; }
第 393 行的代码是这一行:
$type = $this->messageTypeMapping[$message->get('MsgType')];
从日志来看,错误很明显,我打印了一下$message->get('MsgType')
,结果为 null。
各种 Google 无果,最终找来了超哥,easywechat 的作者,在超哥的帮助下,定位到了错误。
从 wechat 的 log 日志中看,有收到硬件发送来的数据,但是收到的数据是这样的:
{ "device_id": "gh_e6a24fdc82b6_69b49a3ee626ee55", "device_type": "gh_e6a24fdc82b6", "msg_id": "524313758", "msg_type": "device_text", "create_time": "1516171166", "open_id": "o7iyW0sUwv4wH6PWhextVbtPkNVE", "session_id": "380219", "content": "AQAPAgATAwAWBAAA"}
而正常的文本消息数据包是这样的:
{ "ToUserName": "gh_e6a24fdc82b6", "FromUserName": "o7iyW0sUwv4wH6PWhextVbtPkNVE", "CreateTime": "1516171641", "MsgType": "text", "Content": "123", "MsgId": "6511907613782547557"}
MsgType
??
msg_type
??
WTF?微信开发的程序员们?你们是在逗我吗?
这个数据结构……
这个命名规范……
无力吐槽……
问题已经确认,微信的协议发生了变更,我调整了一下 easywechat 的变量命名和一些细节程序,感兴趣的小伙伴点击这里:
修改的部分已经提交 PR 到原先的 wechat 扩展包中,希望有开发微信硬件的小伙伴,不要重复入坑。
最后,感谢超哥的帮助!