最近的发现微信小程序的自定义交易组件的添加商品总是提示:请使用自定义交易组件图片上传接口换取临时链接后再上传图片,修改完成前请重试 的字样,然后通过查看微信的文档发现,文档多了一条规则,就是第七条:
微信的自定义交易组件添加商品的文档
在这之前,文档没有明确的指出商品等图片需换取临时链接才可以进行上传,然后在微信开放社区发现官方在6月份发布了一篇公告:小商店/交易组件图片上传优化 ,这样的话就很让烦人,┗|`O′|┛草 !!!(一种植物),做这个功能的时候,时间是10月份,当时文档还没有特别说明需要转临时链接,然而公告时间是6月份….心累
上传图片的文档指出:
https://api.weixin.qq.com/shop/img/upload?access_token=xxxxxxxxx
给的请求示例为:
curl -F media=@test.jpg "https://api.weixin.qq.com/shop/img/upload?access_token=xxxxxxxxx" -F resp_type=0
根据目前客户的实际情况来看,传递图片链接的方式是稳妥的,于是我按照已封装好的请求接口进行图片的上传:
## 忽略方法的命名 protected static function postDataUrl($data, $method) { $accessToken = self::getAccessToken(); $url = self::WECHAT_URL . $method . '?access_token=' . $accessToken; $ch = curl_init(); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data, JSON_UNESCAPED_UNICODE)); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5); $rs = curl_exec($ch); curl_close($ch); // 记录日志 WechatVideoApiLog::addLog($method, json_encode($data, JSON_UNESCAPED_UNICODE), $rs); $res = json_decode($rs, true); if($res['errcode'] == 40001){ self::cacheRedis()->delete('wechat_access_token:'); return self::postDataUrl($data, $method); } return $res; }
然后发现接口返回了{"errcode":1070001,"errmsg":"文件\/图片为空"}
,尝试了多次,也都是这样的返回结果,于是我尝试使用postman进行请求处理,发现将参数放入form中可以正常的请求,置换回临时链接,但是我将参数放入raw选项时使用text/json格式进行请求时,返回就是我上述的错误结果,然后将代码改造一下:
protected static function postDataUrl($data, $method, $post_type = 'json') { $accessToken = self::getAccessToken(); $url = self::WECHAT_URL . $method . '?access_token=' . $accessToken; $ch = curl_init(); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $post_type == 'json' ? json_encode($data, JSON_UNESCAPED_UNICODE) : $data); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5); $rs = curl_exec($ch); curl_close($ch); // 记录日志 WechatVideoApiLog::addLog($method, json_encode($data, JSON_UNESCAPED_UNICODE), $rs); $res = json_decode($rs, true); if($res['errcode'] == 40001){ self::cacheRedis()->delete('wechat_access_token:'); return self::postDataUrl($data, $method); } return $res; }
这样改造之后就可以正常的使用图片链接进行上传图片了
其中值得一提的是最初的添加商品时,只要商品存在中文字符上传就会失败,然后发现在提交数据的时候,json_encode
会将中文字符转换为Unicode的编码,这个是需要使用JSON_UNESCAPED_UNICODE
来对要转换的数据进行处理,不将中文字符转换为Unicode编码,即:json_encode($data, JSON_UNESCAPED_UNICODE)
这样处理之后就可以正常的上传商品数据到微信端了