最近公司在开发一个项目,是从外面接回来的系统,涉及微信开发这块,由于系统已经集成了部分的微信接口,所以没有使用EasyWechat,自己手写小微商户进件功能,今天写了上传图片功能,说说我遇到的坑吧
图片上传接口
https://api.mch.weixin.qq.com/secapi/mch/uploadmedia
请求参数
用的是tp5.0框架,上传图片一开始用的是
Request::instance()->file();
不过不大清楚用法,打印出的数据无法获取,因此调试阶段直接采用原生写法
$file = $_FILES;
这里个人感觉最大的坑是media参数,一直不太懂,按照文档的请求示例
请求示例:
curl --cert ./apiclient_cert.pem --key ./apiclient_key.pem -F 'mch_id=1000000000' -F 'media_hash=709d1e858d2ef9d0501cc053668b2872' -F 'sign=D675A1E471DBF7C0B1AC5883B5BDA9EF' -F 'media=@test.jpg' https://api.mch.weixin.qq.com/secapi/mch/uploadmedia
我觉得media应该是要上传的文件前面加’@'
$data['media'] = '@'.$path;
结果返回Empty reply from server,百度找答案,看到一个网友说要上传的不是文件地址,是文件本身,于是按照该网友的写法
$data['media'] = fopen($path, 'r');
结果依然返回Empty reply from server
后来想到new \CURLFile这个方法,于是用这个方法
$data['media'] = new \CURLFile($path);
提交后返回我想要的结果
刚才查了下,说是php5.5以下版本使用
$data['media'] = '@'.$path;
高于php5.5用
$data['media'] = new \CURLFile($path);
目前除了老项目,新项目基本都是php7以上了,掉一次坑,希望以后长记性,同样的坑别再掉
附上完整调试代码
$file = $_FILES;
$filename = $_FILES['file']['name'];
$arr = pathinfo($filename);
$ext_suffix = $arr['extension'];
$new_file_name = time() . '.' . $ext_suffix;
move_uploaded_file($_FILES["file"]["tmp_name"], "uploads/" . $new_file_name);
$data = $this->getConfig();
$media = new UploadMedia($data);
$res = $media->uploadImage($new_file_name);
dump($res);
public function uploadImage($file)
{
$path = $_SERVER['DOCUMENT_ROOT'].'/uploads/'.$file;
$data = [
'mch_id' => $this->mch_id,
'sign_type' => self::SIGN_TYPE,
'media_hash' => strtolower(md5_file($path))
];
$data['sign'] = $this->getSign($data);
//$data['media'] = '@'.$file;
$data['media'] = new \CURLFile($path);
//$data['media'] = $args['media'] = fopen($path, 'r');
$header = [
"content-type:multipart/form-data",
];
$res = $this->httpsRequest(self::UPLOAD_MEDIA, $data, $header, true);
}
来源:CSDN
作者:dicky航
链接:https://blog.csdn.net/u010402609/article/details/103580743