微信公众号后台PHP开发,用api上传临时素材,因为使用PHP7.1,所以使用了CURLFile的方式上传,但一直报错,错误代码为13001,描述为 http get api error.
服务器nginx的error log中如下:
2017/09/06 21:26:52 [error] 11636#0: 24 FastCGI sent in stderr: "PHP message: {"ToUserName":"g0d5","FromUserName":"oMzDEwXXXXXXXwM4Lnog","CreateTime":"1504704409","MsgType":"image","PicUrl":"http://mmbiz.qpic.cn/mmbiz_jpg/JGPb7l14faUTFq22LmkBBSOXIAXXXXXLsZ0icnBQ/0","MsgId":"6462656227226399272","MediaId":"S-P1j9nuD0mh4hnF5ZJXXXXXXXh481CL5Nh"}
PHP message: <xml><ToUserName><![CDATA[oMzDEwQXXXXXXXXpkwM4Lnog]]></ToUserName><FromUserName><![CDATA[gh_XXXXXXXXe0d5]]></FromUserName><CreateTime>1504704412</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[http get api error.]]></Content></xml>" while reading response header from upstream, client: 103.7.30.104, server: wechat.XXXXXXX.site, request: "POST /main.php?signature=a2b6983c8e781f738cddfb54dd6b1a0416a6cf13×tamp=1504704409&nonce=1401047094&openid=oMzDEwQF*wM4Lnog HTTP/1.1", upstream: "fastcgi://unix:/tmp/php-71-cgi.sock:", host: "funwitXXXXXXXc"
php代码如下:
public function upload_media($type, $path)
{
$url = self::API_DOMAIN . 'cgi-bin/media/upload?access_token=' . $this->get_access_token() . '&type=' . $type;
//$res = HttpCurl::post($url, array('media' => '@'.$path), 'json');
$res = HttpCurl::post($url, array('media' => new \CURLFile(realpath($path))), 'json');
// 异常处理: 获取时网络错误
if ($res === false) {
return Error::code('ERR_GET');
}
// 判断是否调用成功
if (isset($res->media_id)) {
return array(null, $res);
} else {
return array($res, null);
}
}
其中post方法:
static public function post($url, $fields, $data_type='text')
{
$cl = curl_init();
if (version_compare(phpversion(), '5.6') >= 0 && version_compare(phpversion(),'7.0')<0) { // for php verseion >=5.6 && <7.0 ,2017/9/6
curl_setopt($ch, CURLOPT_SAFE_UPLOAD, false);
}
if(stripos($url, 'https://') !== FALSE) {
curl_setopt($cl, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($cl, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($cl, CURLOPT_SSLVERSION, 1);
}
curl_setopt($cl, CURLOPT_URL, $url);
curl_setopt($cl, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt($cl, CURLOPT_POST, true);
curl_setopt($cl, CURLOPT_POSTFIELDS, $fields);
$content = curl_exec($cl);
$status = curl_getinfo($cl);
curl_close($cl);
if (isset($status['http_code']) && $status['http_code'] == 200) {
if ($data_type == 'json') {
$content = json_decode($content);
}
return $content;
} else {
return FALSE;
}
}
调用(当用户发送相关消息时候调用,如果直接回复文本没问题):
list($err, $res) = $api->upload_media('image', $filename);
return $err->{'errmsg'};
//return $res->{'media_id'};
$filename 的格式大概是"./image/XXXX.jpg"
access token的获取后台可以看到成功记录,应该没问题。
感觉应该是服务器的问题,求助!
图片路径采用绝对路径 $param ['media'] = new CURLFile(dirname(__FILE__)."/a.jpg");