通过微信公众平台API进行推送的第一步就是上传文章(图文素材),而上传图文素材的第一步就是上传预览图(thumb)。而这个预览图的上传则困扰了我一昼夜,一直回显:
1 |
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://”,请自行补全,以免功能出错:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
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;
}
|
然后是调用:
1
2
3
4
5
|
$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));
|
以上可以说就是一个完整的实现,运行结果如下:
1 |
string(208) "{"media_id":"*******","url":"*******"}"
|
具体的我也不是很懂,只知道PHP从5.5开始对curl上传做出了调整,增加了CURLFile类,并从PHP5.6开始移除了@方法。然而网上的文章都是复制粘贴,大部分是老代码,新版本的PHP根本不能用,部分适用新版本的代码又或多或少存在错误。最后终于在sf中找到了比较详细的解释,于是上传请求就得到了正常的响应。
P.S.:因为我用的是接口测试平台,所以没有群发权限,上传后只能通过预览接口推送至手机,每天100次,坑爹▄█▀█●