前几个月的时候,开发了一个微信硬件相关的项目,其业务相对比较简单,就是一个微信的蓝牙硬件设备,通过微信硬件 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 的变量命名和一些细节程序,感兴趣的小伙伴点击这里:https://github.com/todayqq/we...
修改的部分已经提交 PR 到原先的 wechat 扩展包中,希望有开发微信硬件的小伙伴,不要重复入坑。
最后,感谢超哥的帮助!
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。