前几个月的时候,开发了一个微信硬件相关的项目,其业务相对比较简单,就是一个微信的蓝牙硬件设备,通过微信硬件 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 扩展包中,希望有开发微信硬件的小伙伴,不要重复入坑。

最后,感谢超哥的帮助!


今朝
2.2k 声望132 粉丝

左手代码,右手吉他,一台 Mac 走天下