微信 41005 php,PHP调用微信接口报{"errcode":41005,"errmsg":"media data missing"}错误

使用微信接口上传图片文件素材,老是报如下错误:

f2e08d8eecc759b25579aba9c4c15f02.png

网上搜了搜,遇到这个坑的人很多,自己捣鼓了一会儿,也终于解决了。

先贴一下构造的curl请求函数:

function _request($curl,$https=true,$method='GET',$data=null){

//1.创建一个新cURL资源

$ch = curl_init();

//2.设置URL和相应的选项

//要访问的网站

curl_setopt($ch, CURLOPT_URL, $curl);

//启用时会将头文件的信息作为数据流输出。

curl_setopt($ch, CURLOPT_HEADER, false);

//将curl_exec()获取的信息以字符串返回,而不是直接输出。

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

if($https){

//FALSE 禁止 cURL 验证对等证书(peer's certificate)。

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, true); //验证主机

}

if($method == 'POST'){

//发送 POST 请求

curl_setopt($ch, CURLOPT_POST, true);

//全部数据使用HTTP协议中的 "POST" 操作来发送。

curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

}

//3.抓取URL并把它传递给浏览器

$content = curl_exec($ch);

if ($content === false) {

return "网络请求出错: " . curl_error($ch);

exit();

}

//4.关闭cURL资源,并且释放系统资源

curl_close($ch);

return $content;

}

然后是上传函数:

/**

* 上传图片,本接口所上传的图片不占用公众号的素材库中图片数量的5000个的限制。

* 图片仅支持jpg/png格式,大小必须在1MB以下。 (认证后的订阅号可用)

* 注意:上传大文件时可能需要先调用 set_time_limit(0) 避免超时

* 注意:数组的键值任意,但文件名前必须加@,使用单引号以避免本地路径斜杠被转义

* @param array $data {"media":'@Path/filename.jpg'}

* @return boolean|array

*/

public function uploadImg($data){

if (!$this->_getAccessToken()) return false;

$curl = 'https://api.weixin.qq.com/cgi-bin/media/uploadimg?access_token='.$this->_getAccessToken();

$result = $this->_request($curl,true,'POST',$data);

if ($result){

$json = json_decode($result,true);

/* if (!$json || !empty($json['errcode'])) {

$this->errCode = $json['errcode'];

$this->errMsg = $json['errmsg'];

return false;

} */

return $json;

}

return false;

}

方法调用:

$wechat = new Wechat($appid,$appsecret,$token);

$data = array('media'=>'@images/3.jpg');

$result = $wechat->uploadImg($data);

print_r($result);

我的错误是上传文件路径之前忘了加‘@’符号,加上之后就没问题了。返回值如下

83ef9b6ed756c1360cdc491d8894d3cb.png

*另外,我这里PHP版本是php5.5.1,这样处理没问题,不过网上说从php5.6以后需要在curl请求函数加上curl_setopt ( $ch, CURLOPT_SAFE_UPLOAD, false);这行代码方可上传,否则取不到文件。(这个我木有试,php5.6以上的老铁可以试试)

94fa0ddc0e6f7d397ab957c5091bd1a8.png

注意:curl_setopt ( $ch, CURLOPT_SAFE_UPLOAD, false);这行代码必须放在下面这行代码之前curl_setopt ( $ch, CURLOPT_POSTFIELDS, $fields );否则上传错误。

下面这篇文章讲了如何在Php5.6中用@加文件名的方式传文件

参考:http://blog.csdn.net/ligaofeng/article/details/39291185

如果以上都不能解决,就要好好检查一下文件路径是否写对了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值