基础支付
JSAPI支付
APP支付
H5支付
Native支付
小程序支付
合单支付
付款码支付
经营能力
微信支付分(公共API)
微信支付分(免确认预授权模式)
微信支付分(需确认模式)
支付即服务
行业方案
智慧商圈
微信支付分停车服务
电子发票
营销工具
代金券
商家券
委托营销
支付有礼
小程序发券插件
H5发券
图片上传(营销专用)
现金红包
资金应用
商家转账到零钱
分账
风险合规
消费者投诉2.0
其他能力
清关报关
图片上传
视频上传
微信支付平台证书

图片上传API

最新更新时间:2019-12-06 版本说明

通过本接口上传图片后可获得图片url地址。图片url可在微信支付营销相关的API使用,包括商家券、代金券、支付有礼等。

接口说明

适用对象:直连商户

请求URL:https://api.mch.weixin.qq.com/v3/marketing/favor/media/image-upload

请求主体类型:multipart/form-data

请求方式:POST


path 指该参数为路径参数

query 指该参数需在请求URL传参

body 指该参数需在请求JSON传参


请求参数

参数名 变量 类型[长度限制] 必填 描述
图片文件 file message body 将媒体图片进行二进制转换,得到的媒体图片二进制内容,在请求body中上传此二进制内容。媒体图片只支持JPG、BMP、PNG格式,文件大小不能超过2M。
示例值:pic1
+媒体文件元信息 meta Object body 媒体文件元信息,使用json表示,包含两个对象:filename、sha256。
参数名 变量 类型[长度限制] 必填 描述
文件名称 filename string[1,128] 商户上传的媒体图片的名称,商户自定义,必须以JPG、BMP、PNG为后缀。
示例值:filea.jpg
文件摘要 sha256 string[1,256] 图片文件的文件摘要,即对图片文件的二进制内容进行sha256计算得到的值。
示例值:hjkahkjsjkfsjk78687dhjahdajhk

各语言请求示例


String filePath = "/your/home/hellokitty.png";
URI uri = new URI("https://api.mch.weixin.qq.com/v3/marketing/favor/media/image-upload");
File file = new File(filePath);

try (FileInputStream ins1 = new FileInputStream(file)) { 
  String sha256 = DigestUtils.sha256Hex(ins1);
  try (InputStream ins2 = new FileInputStream(file)) {
    HttpPost request = new WechatPayUploadHttpPost.Builder(uri)
        .withImage(file.getName(), sha256, ins2)
        .build();
    CloseableHttpResponse response1 = httpClient.execute(request);
  }
}
    

// 参考上述指引说明,并引入 `MediaUtil` 正常初始化,无额外条件
use WechatPay\GuzzleMiddleware\Util\MediaUtil;
// 实例化一个媒体文件流,注意文件后缀名需符合接口要求
$media = new MediaUtil('/your/file/path/with.extension');

// 正常使用Guzzle发起API请求
try {
    $resp = $client->request('POST', 'https://api.mch.weixin.qq.com/v3/marketing/favor/media/image-upload', [
        'body'    => $media->getStream(),
        'headers' => [
            'Accept'       => 'application/json',
            'content-type' => $media->getContentType(),
        ]
    ]);
    // POST 语法糖
    $resp = $client->post('merchant/media/upload', [
        'body'    => $media->getStream(),
        'headers' => [
            'Accept'       => 'application/json',
            'content-type' => $media->getContentType(),
        ]
    ]);
    echo $resp->getStatusCode().' '.$resp->getReasonPhrase()."\n";
    echo $resp->getBody()."\n";
} catch (Exception $e) {
    echo $e->getMessage()."\n";
    if ($e->hasResponse()) {
        echo $e->getResponse()->getStatusCode().' '.$e->getResponse()->getReasonPhrase()."\n";
        echo $e->getResponse()->getBody();
    }
    return;
}
    

JAVA详细请求示例详见:wechatpay-apache-httpclient

PHP详细请求示例详见:wechatpay-guzzle-middleware

返回参数

参数名 变量 类型[长度限制] 必填 描述
媒体文件URL地址 media_url string[1,256] 微信返回的媒体文件标识url。有效期为永久
示例值:https://qpic.cn/xxx

返回示例


{
"media_url": "https://qpic.cn/xxx"
}
                                

    http://2323weixin.qq.com
                                

请求步骤

图片上传步骤:

1.创建一个POST的方法请求/upload URI


例如: POST https://api.mch.weixin.qq.com/v3/marketing/favor/media/image-upload HTTP/1.1


2.将文件的数据添加到请求主体


2.1 图片文件file参数的获取方式说明:
媒体图片二进制内容,放在请求http的body中。


2.2 媒体文件元信息meta参数的获取方式说明:
媒体文件元信息,使用json表示,包含两个对象:filename、sha256。
● filename参数获取方式说明:
商户上传的媒体图片的名称,商户自定义,必须以JPG、BMP、PNG为后缀。
● sha256参数获取方式说明:
图片文件的文件摘要,即对图片文件的二进制内容进行sha256计算得到的值。


2.3 签名计算说明:
签名生成
参与签名计算的请求主体为meta的json串:
{ "filename": "filea.jpg", "sha256": "hjkahkjsjkfsjk78687dhjahdajhk" }


待签名串示例:

POST
/v3/marketing/favor/media/image-upload
1566987169           //时间戳
12ced2db6f0193dda91ba86224ea1cd8   //随机数
{"filename":"filea.jpg","sha256":"hjkahkjsjkfsjk78687dhjahdajhk"}

3.添加HTTP头:


Content-Type:multipart/form-data.设置为要上载的对象的MIME媒体类型。
Authorization: WECHATPAY2-SHA256-RSA2048 mchid="1900231671",
nonce_str="PCHK6HSOEDTACETP6P3AL7DWPHTBKIAT",timestamp="1567067659",
serial_no="1FB89742D19F2BD30B69948D16DECA0FCB4481EB",
signature="PB6M7+3JL7TSCl5zqD1sdWVypOIEQsD4dgOU+vPiVM6GMRo2qYSWKf8u46i9ZJFhyZTBdZ7SFR+BjDZh6
89hFgN8LZL+QWTvq3cse/FEUFYyOLN7L/2IZX4GA4cWInuJ2MpOhZRMpm+emrcn42gTMKAPNQ7dBLO7ux6MoSuQp69
PW+p1ogmkER68exTVUXYqA5P3vITlWNr++RDy2+ExvB7qVISOKW0vBkxUxN9e7hwUbDwGln170ZXomoO1KpQSbw3f1u
WUCx/IlWJhJIun7rUMtVT+kfijNUqcILtSfE4hWKKVaZn9j5CX8M7aKbbDOFy3SvbSJ3WQgRnRbgog5w=="
Content-Type: multipart/form-data;boundary=boundary

4.添加body:


// 以下为body的内容
--boundary  // boundary为商户自定义的一个字符串
Content-Disposition: form-data; name="meta";
Content-Type: application/json
//此处必须有一个空行
{ "filename": "filea.jpg", "sha256": "hjkahkjsjkfsjk78687dhjahdajhk" }
--boundary
Content-Disposition: form-data; name="file"; filename="filea.jpg";
Content-Type: image/jpg
//此处必须有一个空行
pic1  //pic1即为媒体图片的二进制内容
--boundary--

说明:请求包体每行结尾都需要包含\r\n(空行也需要)。


5.发送请求


POST /v3/marketing/favor/media/image-upload HTTP/1.1
Host: api.mch.weixin.qq.com
Authorization: WECHATPAY2-SHA256-RSA2048 
mchid="1900231671",nonce_str="PCHK6HSOEDTACETP6P3AL7DWPHTBKIAT",
timestamp="1567067659",
serial_no="1FB89742D19F2BD30B69948D16DECA0FCB4481EB",
signature="PB6M7+3JL7TSCl5zqD1sdWVypOIEQsD4dgOU+vPiVM6GMRo2qYSWKf8u46i9ZJFhyZTBdZ7
SFR+BjDZh689hFgN8LZL+QWTvq3cse/FEUFYyOLN7L/2IZX4GA4cWInuJ2MpOhZRMpm+emrcn42gTMKAPN
Q7dBLO7ux6MoSuQp69PW+p1ogmkER68exTVUXYqA5P3vITlWNr++RDy2+ExvB7qVISOKW0vBkxUxN9e
7hwUbDwGln170ZXomoO1KpQSbw3f1uWUCx/IlWJhJIun7rUMtVT+kfijNUqcILtSfE4hWKKVaZn9j5CX8M
7aKbbDOFy3SvbSJ3WQgRnRbgog5w=="
Content-Type: multipart/form-data;boundary=boundary

--boundary  
Content-Disposition: form-data; name="meta";
Content-Type: application/json

{ "filename": "filea.jpg", "sha256": "hjkahkjsjkfsjk78687dhjahdajhk" }
--boundary
Content-Disposition: form-data; name="file"; filename="filea.jpg";
Content-Type: image/jpg

pic1
--boundary--

错误码公共错误码

状态码 错误码 描述 解决方案
400

PARAM_ERROR

图片文件为空 商户更换文件后,重新调用
403 REQUEST_BLOCKED 未知图片类型 图片类型必须为JPG、BMP、PNG
图片meta信息不一致 请检查meta信息是否正确
签名信息不匹配 请检查签名信息


技术咨询

文档反馈