关于微信上传素材碰到的curl上传问题---{"errcode":41005,"errmsg":"media data missing"}

一直是结合easywechat来做微信开发的,这两对微信卡劵进行测试,需要先调用接口上传logo

先说一下,我的开发环境vagrant,lnmp环境。php版本7.0以后

http请求方式:POST/FORM,使用https
https://api.weixin.qq.com/cgi-bin/media/upload?access_token=ACCESS_TOKEN&type=TYPE
调用示例(使用curl命令,用FORM表单方式上传一个多媒体文件):
curl -F [email protected] "https://api.weixin.qq.com/cgi-bin/media/upload?access_token=ACCESS_TOKEN&type=TYPE"

于是在网上随意拷贝了一分curl的post上传,结果就一直报如标题错误

于是狂搜一顿,结果都是报错。

心平气和下来,找到了一篇文章:https://segmentfault.com/a/1190000000725185

微信这个在@test.jpg用法,在linux命令行使用完全没有问题,但是在php5.5以后就给废掉了,所以网上查了很多都被误导!

大坑,大坑,大坑!

PHP 5.5另外引入了CURL_SAFE_UPLOAD选项,可以强制PHP的cURL模块拒绝旧的@语法,仅接受CURLFile式的文件。5.5的默认值为false,5.6的默认值为true。

所以参考改篇文章以后,应该改为CURLFile方式,curl封装函数改为如下:

//http请求
function http_request($url, $data = null)
{
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
    if (!empty($data)){
        foreach ($data as &$val) {
            if(is_file($val)){
                $val = new CURLFile($val);
            }
        }
        curl_setopt($curl, CURLOPT_POST, 1);
        curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
    }
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    $output = curl_exec($curl);
    curl_close($curl);
    return $output;
}

控制器代码如下:

        $accessToken = $app->access_token;    //使用的是easywechat开发框架,没有复制全部
        $token = $accessToken->getToken();
        $url = "https://api.weixin.qq.com/cgi-bin/media/upload?access_token={$token['access_token']}&type=image";
        $data['media'] = '/usr/share/nginx/html/dianzi/public/static/211412eysbf000f20qcqjy.jpg';
        $res = http_request($url,$data);
        halt($res);

猜你喜欢

转载自blog.csdn.net/myarche/article/details/80180182