参考的文档地址: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter2_1_1.shtml
按照文档要求
请求主体类型:multipart/form-data
请求方式:POST
看了api文档后我的第一版本代码是这样的:
$instance = $function->getInstance();
$rs = $instance->chain('v3/merchant/media/upload')
->post([
'debug' => true,
'headers' => [
'Content-Type' => 'multipart/form-data',
],
'multipart' => [
[
'name' => 'file',
'contents' => fopen($uploadedFile, 'r'),
],
[
'name' => 'meta',
'contents' => json_encode([
'filename' => $this->time . '.jpeg',
'sha256' => hash_file('sha256', $uploadedFile),
], JSON_THROW_ON_ERROR),
]
],
'expect' => 2*1024*1024+1
]); // dd($rs) 各种 sign 出错~
然后我换成了第二种:
// 实例化一个媒体文件流,注意文件后缀名需符合接口要求
// !!!??? 有个问题,这种写法就可以忽略掉文档提出的 meta 和 file 等参数了嘛?
$media = new MediaUtil($uploadedFile);
$instance = $function->getInstance();
$rs = $instance->chain('v3/merchant/media/upload')
->post([
'debug' => true,
'body' => $media->getStream(),
'headers' => [
'Accept' => 'application/json',
'content-type' => $media->getContentType(),
]
]);
// "code": "PARAM_ERROR", "message": "图片文件名称不正确,请检查后重新提交 我上传的文件是 demo.png 不清楚哪里出现了问题?
我的 instance 是来自 参考地址: https://github.com/wechatpay-apiv3/wechatpay-php#%E7%A4%BA%E4%BE%8B%E7%A8%8B%E5%BA%8F%E5%BE%AE%E4%BF%A1%E6%94%AF%E4%BB%98%E5%B9%B3%E5%8F%B0%E8%AF%81%E4%B9%A6%E4%B8%8B%E8%BD%BD
// 构造一个 APIv3 客户端实例
$instance = Builder::factory([
'mchid' => $merchantId,
'serial' => $merchantCertificateSerial,
'privateKey' => $merchantPrivateKeyInstance,
'certs' => [
$platformCertificateSerial => $platformPublicKeyInstance,
],
]);
问题一: 两种写法都是对的吗?以哪个为准?
问题二:问什么我上传的图片要求符合“商户上传的媒体图片的名称,商户自定义,必须以JPG、BMP、PNG为后缀。示例值:filea.jpg”,但是仍然不对?
$rs = $instance->chain('v3/merchant/media/upload') ->post([ 'debug' => true, 'body' => $media->getStream(), 'headers' => [ 'Accept' => 'application/json', 'content-type' => $media->getContentType(), ] ]);
这种方法我调试通了,但是还是不明白第一种写法,难道不是按照文档的要求来写的吗? 为什么会有问题