微信上传临时素材的坑

时间:2024-03-15 09:55:34

客服系统用的是网易七鱼的系统,小程序内的客服需要和网易七鱼进行对接。网易七鱼现在只支持自动和微信公众号对接,小程序对它来说相当于一个第三方系统。

其中有这么一个场景,把七鱼发到我们服务器上的图片,当作临时素材上传到微信服务器上,此时微信服务器给我们返回素材对应的media_id,使用这个media_id我们可以讲图片推送给用户。微信官方api如下:点击打开链接

微信上传临时素材的坑


可以说这个文档写的是很垃圾,例子很不明确。按照文档的说明,拼接的请求体如下:

微信上传临时素材的坑


结果报的错误为:41005 media data missing. 在网上搜了教程有的说需要加上file_info, 于是我就这样:

微信上传临时素材的坑


然而并没有什么用,依旧报41005的错误

我post请求的地方是这么写的:

微信上传临时素材的坑


这个错误的根本原因就是微信根据post的media找不到上传的图片资源在哪。于是想肯定是这一行出问题了。去查看PHP官方文档(我用的PHP7)发现了:

微信上传临时素材的坑


还有:

微信上传临时素材的坑


所以PHP7和PHP5.5以后的版本都不能用微信官方例子中@的方式来引用资源。后来修改成了这样:

微信上传临时素材的坑


然后还是报错,说CURLFile,找不到这个类,几经折腾最后这样终于不报错了:这里一定要把相对路径转为绝对路径。

微信上传临时素材的坑


然后上传临时素材依旧是41005的错误码,感觉要炸了。后来发现,post中的请求体不能用json格式的,必须是array。最后这样终于可以了,body要像上面那么写,post请求CURLOPT_POSTFIELDS的内容必须是array,不需要json_encode()了。


其实,php有一个开源的与微信交互的SDK,easyWechat,这个SDK里面有个好用的接口叫

微信上传临时素材的坑


这个接口的参数是图片的相对路径,只需要这一个参数,很方便。不过使用过程中发现了一个问题,其timeout的时间设置的为5s,超过了这个时间没收到微信服务器的返回就会报错,我在测试过程中有些图片5s无法上传完成,就会导致系统异常,所以果断弃用这个接口。改为自己写的,curl中把超时设置的大一点,就好了。


提示:


1.微信上传临时素材的接口只支持本地文件的上传,不支持远程url上传方式,所以在收到七鱼发过来的图片地址的时候,需要用file_get_contents()和file_put_contents()存到本地,获取图片的本地地址,等上传成功后使用unlink()删除掉就好了。

2. 由于有时候图片上传的时间较长,无法在规定时间内给微信(5秒)、七鱼(10秒)服务器返回,可能触发它们的消息重发机制,这个时候需要会用MsgId进行消息排重,将MsgId存到redis中,每次消息处理的时候先检查,处理完毕后从redis中删除。


感慨:遇到问题去翻对应的官方文档(比如PHP官方文档)效率其实是最高的。