您当前的位置:首页 > 建站知识 > 编程知识

对微信公众号【上传图文消息内的图片获取URL】的补充说明

发布时间: 2020-05-02 │ 浏览:4515 

微信公众号接口,上传素材图片时用到【上传图文消息内的图片获取URL】,官方网址:
https://developers.weixin.qq.com/doc/offiaccount/Asset_Management/Adding_Permanent_Assets.html

初一看,官方文档很少,应该不难吧,于是试一下。

参数media,按其它公众号接口的惯例,写成Json格式,结果返回:
{"errcode":41005,"errmsg":"media data missing"}

在百度上一搜,碰到这个41005错误的人还真不少,问题都指到图片路径上。
有的说不能写成URL,有的说要在相对路径前加@符号,有的说要写成绝对路径,都试了,为什么到我身上就无法解决?!

因为是看一点改一点,没个中心思想,代码也越改越乱,还是再回去看官方的文档吧:

使用curl命令,用FORM表单方式上传一个图片
这句话提醒了我。原来本质上还是模拟 multipart/form-data 形式的 form 上传图片啊。
这样就可以确定:不是传Json数据。
既然是form,那么文件路径自然是本地电脑的图片路径,我们的php文件运行在服务器上,所以准确的图片路径是服务器上的图片路径。要是你还没把图片上传到你的服务器,那请先上传。
接下来就是图片路径前要不要加@,原来加@是PHP5.5版本之前的用法,现在主流的PHP是7.0以上了,大部分人都可略过这个问题。对于已弃用的东西,我们没必要再学。
有了以上的认识,再来看下面的完整代码:

$access_token="你公众号的access_token,自己获取";
$url="https://api.weixin.qq.com/cgi-bin/media/uploadimg?access_token=".$access_token;
$path = "D:/site/ny1.jpg";//这是我服务器上的图片路径,需换成你的

header('Content-type:text/html; charset=utf-8');

$curl = curl_init();
curl_setopt($curl, CURLOPT_SAFE_UPLOAD, true);
$data = array('media' => new \CURLFile(realpath($path)));//注意media取名与官方一致
//var_dump($data);
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST,2);
curl_setopt($curl, CURLOPT_POST, 1 );
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);

$result = curl_exec($curl);
var_dump($result);

终于成功了。对于懂的人,简单提一下即可,但对于不懂的人,就要详细说明,比如我。