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

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


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

先贴一下构造的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);

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


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

PHP调用微信接口报{

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

下面这篇文章讲了如何在Php5.6中用@加文件名的方式传文件
参考:http://blog.csdn.net/ligaofeng/article/details/39291185

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

你可能感兴趣的:(PHP,微信开发)