收藏
回答

wechatpay-guzzle-middleware如何上传图片?

如何使用这个sdk上传图片。我是用如下代码,无法通过验签

$wechatPayMiddleware = WechatPayMiddleware::builder()
    ->withMerchant(CommonData::MCH_ID, CommonData::SERIAL_NUMBER, CommonData::getPrivateKey())
    ->withWechatPay([ CommonData::getCertificate() ]) // 可传入多个微信支付平台证书,参数类型为array
    ->withValidator(new NoValidator())
    ->build();

// 将WechatPayMiddleware添加到Guzzle的HandlerStack中
$stack = HandlerStack::create();
$stack->push($wechatPayMiddleware, 'wechatpay');

// 创建Guzzle HTTP Client时,将HandlerStack传入
$client = new \GuzzleHttp\Client(['handler' => $stack, 'verify' => false]);
$url = 'https://xxx.com/'.$object;
// 接下来,正常使用Guzzle发起API请求,WechatPayMiddleware会自动地处理签名和验签
$resp = $client->request('POST', CommonData::URL . $this->getUri(), [
    'headers' => [ 'Accept' => 'application/json' ],
    'multipart' => [
        [
            'name'=>'file',
            'contents'=>fopen($url, 'r')
        ], [
            'name'=>'meta',
            'contents'=>json_encode([
                'filename'=>basename($url),
                'sha256'=>hash('sha256', (new Oss())->downloadFile('hic-image', $object)),
            ])
        ]
    ],
]);
$result = json_decode($resp->getBody()->getContents(), true);
回答关注问题邀请回答
收藏

2 个回答

  • 微信支付技术助手1
    微信支付技术助手1
    2019-12-23

    你这边具体调用的是哪个接口?验签过不了,一般是你的签名参数有问题,仔细核对参数。

    2019-12-23
    有用
    回复 4
    • 易进
      易进
      2019-12-23
      调用的是图片上传接口。主要是存在图片上传同时还要上传filename和sha256等参数。现在不清楚怎么同时传,我看社区里面的demo都是自己写拼接然后发起请求的,没找到有基于sdk的demo
      2019-12-23
      回复
    • 刘帅
      刘帅
      2020-03-21回复易进
      问题解决了吗?
      2020-03-21
      回复
    • 飞⃰哥⃰
      飞⃰哥⃰
      2020-03-22回复刘帅
      这个问题我解决了,其实官方的SDK不支持图片上传的,导致一直返回401签名错误,只要修改一下SDK的签名验证,把图片上传的签名body传过去,就可以了,另外楼主request中,header数组需要按官方图片的的header要求,还要图片上传不是multipart,而是body,body值按官方拼接好。就可以了,希望大家早点跳过坑
      2020-03-22
      1
      回复
    • 刘帅
      刘帅
      2020-03-22回复飞⃰哥⃰
      谢谢 坑太多了。  有种西天取经的感觉
      2020-03-22
      回复
  • 北望沣渭
    北望沣渭
    2020-06-01

    https://github.com/wechatpay-apiv3/wechatpay-guzzle-middleware/pull/16 已0侵入解决图片上传问题,不用再花精力拼接body体了,用法见 commit 说明。

    use WechatPay\GuzzleMiddleware\Util\MediaUtil;
    // 实例化一个媒体文件流,注意文件后缀名需符合接口要求
    $media = new MediaUtil('/your/file/path/with.extension');
    // POST 语法糖
    $resp = $client->post('merchant/media/upload', [
      'body'    => $media->getStream(),
      'headers' => [
      	'Accept'       => 'application/json',
      	'content-type' => $media->getContentType(),
      ]
    ]);
    
    2020-06-01
    有用 1
    回复 3
    • 圣经上的几弹
      圣经上的几弹
      2020-09-11
      老哥我比较菜,想请教一下这个with.extension是什么东西啊?我如何把图片转换成这个呢?
      2020-09-11
      回复
    • 北望沣渭
      北望沣渭
      2020-09-11回复圣经上的几弹
      /your/file/path/with.extension 这个是伪文件路径,即类似 /tmp/hellowechatpay.jpg, `with.extension` 就是 hellowechatpay.jpg 的意思。
      2020-09-11
      回复
    • 圣经上的几弹
      圣经上的几弹
      2020-09-11
      我脑子瓦特了,忽略我,感谢大佬~
      2020-09-11
      回复
登录 后发表内容
问题标签