一直是结合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);