几个月前,我开发了一个微信硬件相关的项目。它的业务相对简单。它是一个微信蓝牙硬件设备,通过微信硬件JSAPI向我们的服务器传输一些数据。开发过微信硬件的朋友应该都知道。过程大致如下:但是最近有客户反映收不到硬件发来的信息。这怎么可能,代码和服务器都没变,怎么会出问题呢?但毕竟客户是上帝,这个问题还是需要检查的。怀着忐忑的心情,看了看服务器的日志。看到这个日志,更奇怪easywechat的扩展包一直没有升级过,这个版本是3.1。怎么会有这样的问题?我打开了Guard.php文件的代码:/***Handlemessage。**@paramarray$message**@returnmixed*/protectedfunctionhandleMessage(array$message){$handler=$this->messageHandler;}if(!is_callable($handler)){Log::debug('没有启用处理程序。');返回空值;}Log::debug('消息详细信息:',$message);$message=newCollection($message);$type=$this->messageTypeMapping[$message->get('MsgType')];$响应=空;如果($this->messageFilter&$type){$response=call_user_func_array($handler,[$message]);}返回$响应;}第393行的代码是这一行:$type=$this->messageTypeMapping[$message->get('MsgType')];从日志看,错误很明显,我打印$message->get('MsgType')后,结果为null。各种google都失败了,终于找到了easywechat的作者超哥。在超哥的帮助下,我定位到了错误。根据微信的日志,有硬件发送的数据,但是接收到的数据是这样的:{"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”:“文本”,“内容”:“123”,“MsgId”:“651190761357825”}MsgType??msg_type??WTF?微信开发的程序员?你在开玩笑吧?这数据结构……这命名规范……无可奉告……问题已经确认,微信的协议变了。我调整了easywechat的变量命名和一些详细流程。感兴趣的朋友点这里:https://github.com/todayqq/we...修改部分已经作为PR提交到原微信扩展包。希望有开发微信硬件的朋友,不再赘述。最后感谢超哥的帮助!
