自定义交易组件上传图片问题

最近的发现微信小程序的自定义交易组件的添加商品总是提示:请使用自定义交易组件图片上传接口换取临时链接后再上传图片,修改完成前请重试 的字样,然后通过查看微信的文档发现,文档多了一条规则,就是第七条:

微信的自定义交易组件添加商品的文档

在这之前,文档没有明确的指出商品等图片需换取临时链接才可以进行上传,然后在微信开放社区发现官方在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)

这样处理之后就可以正常的上传商品数据到微信端了

本博客所有文章如无特别注明均为原创。作者:止语复制或转载请以超链接形式注明转自 止语
原文地址《自定义交易组件上传图片问题

相关推荐

网友评论(0)