小微商户进件之上传图片

本秂侑毒 提交于 2019-12-18 05:05:40

最近公司在开发一个项目,是从外面接回来的系统,涉及微信开发这块,由于系统已经集成了部分的微信接口,所以没有使用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);
}

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!