通过微信公众平台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次,坑爹▄█▀█●