微信公众号上传图片的PHP7适用代码片段

通过微信公众平台API进行推送的第一步就是上传文章(图文素材),而上传图文素材的第一步就是上传预览图(thumb)。而这个预览图的上传则困扰了我一昼夜,一直回显:

string(70) "{"errcode":41005,"errmsg":"media data missing hint: [BHVBhA03833064]"}"

也就是缺少资源文件。不过好在,问题最终顺利解决了。现将代码进行记录

开发环境:CentOS 7.4 + Apache 2.4 + PHP 7.1.13(php_mod)

cUrl上传代码如下,要注意的是,由于插件的关系,代码中的”//”实际为”h-t-t-p-s://”,请自行补全,以免功能出错:

 function http_post($url,$param){           
 $oCurl = curl_init();           
 if(stripos($url,"https://")!==FALSE){                   
 curl_setopt($oCurl, CURLOPT_SSL_VERIFYPEER, FALSE);                   
 curl_setopt($oCurl, CURLOPT_SSL_VERIFYHOST, false);           
 }          
 $strPOST = $param;          
 curl_setopt($oCurl, CURLOPT_URL, $url);           
 curl_setopt($oCurl, CURLOPT_RETURNTRANSFER, 1 );           
 curl_setopt($oCurl, CURLOPT_POST,true);           
 curl_setopt($oCurl, CURLOPT_POSTFIELDS,$strPOST);          
 $sContent = curl_exec($oCurl);
 curl_close($oCurl);
 return $sContent;
 }

然后是调用:

$access_token = 'https://ihongchao.com';
$url = 'https://api.weixin.qq.com/cgi-bin/material/add_material?access_token='.$access_token.'&type=thumb';
$path = '../img/test.jpg';
$data = array('media' => new \CURLFile(realpath($path)));
var_dump(http_post($url,$field));

以上可以说就是一个完整的实现,运行结果如下:

string(208) "{"media_id":"*******","url":"*******"}"

具体的我也不是很懂,只知道PHP从5.5开始对curl上传做出了调整,增加了CURLFile类,并从PHP5.6开始移除了@方法。然而网上的文章都是复制粘贴,大部分是老代码,新版本的PHP根本不能用,部分适用新版本的代码又或多或少存在错误。最后终于在sf中找到了比较详细的解释,于是上传请求就得到了正常的响应。

P.S.:因为我用的是接口测试平台,所以没有群发权限,上传后只能通过预览接口推送至手机,每天100次,坑爹▄█▀█●