作者:取个名字忒难le | 来源:互联网 | 2023-07-24 16:51
一直是结合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 media=@test.jpg "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);