微信支付 v3 : 特約商戶進件提交&&狀態查詢&&以及圖片上傳

snowlyg發表於2020-04-11

微信支付v3 介面-特約商戶進件提交,狀態查詢,以及圖片上傳 , 使用 github.com/snowlyg/wechatpay-guzzl... 實現微信簽名認證。

環境要求

  • PHP 5.5+ / PHP 7.0+
  • guzzlehttp/guzzle 6.0+

注意:PHP < 7.2 需要安裝 bcmath 擴充套件

安裝 composer
  composer require snowlyg/wechatpay-guzzle

使用方法

參考:github.com/wechatpay-apiv3/wechatp...

圖片資料獲取
     // $filepath 圖片地址
     $imginfo     = pathinfo($filepath);
     $picturedata = file_get_contents($filepath);
     $sign        = hash('sha256', $picturedata);
     $meta        = [
          "filename" => $imginfo['basename'],
           "sha256"   => $sign,
      ];

     $filestr = json_encode($meta);
圖片 body 生成
     public function getBody($filestr, array $imginfo, $picturedata)
     {
         $boundarystr = "--{$this->boundary}\r\n";
         $out         = $boundarystr;
         $out         .= 'Content-Disposition: form-data; name="meta";'."\r\n";
         $out         .= 'Content-Type: application/json; charset=UTF-8'."\r\n";
         $out         .= "\r\n";
         $out         .= "".$filestr."\r\n";
         $out         .= $boundarystr;
         $out         .= 'Content-Disposition: form-data; name="file"; filename="'.$imginfo['basename'].'";'."\r\n";
         $out         .= 'Content-Type: image/'.$imginfo['extension'].';'."\r\n";
         $out         .= "\r\n";
         $out         .= $picturedata."\r\n";
         $out         .= "--{$this->boundary}--\r\n";
         return $out;
     }
圖片簽名
 // 上傳圖片
    $resp = $client->request('POST', 'https://api.mch.weixin.qq.com/v3/...', [
        'body' =>\GuzzleHttp\Psr7\stream_for($body),
        // meta的json串 ,簽名使用
       "metaJson"     => '{ "filename": "filea.jpg", "sha256": " hjkahkjsjkfsjk78687dhjahdajhk " }',
        'headers' => [ 
               'Accept'       => 'application/json',
               "Content-Type" => " multipart/form-data;boundary=boundary",
            ]
    ]);
進件敏感資料加密
    public function getEncrypt($str)
    {
        $public_key = file_get_contents($this->wechat_public_cert);
        $encrypted = '';
        if (openssl_public_encrypt($str, $encrypted, $public_key, OPENSSL_PKCS1_OAEP_PADDING)) {
            $sign = base64_encode($encrypted);
        } else {
            throw new Exception('encrypt failed');
        }

        return $sign;
    }

開發插曲

寫此功能的時候,在微信開放社群找到一個寫過次功能的哥們聯絡方式。本來想向他請教一下,以免自己少走彎路。沒想到這哥們直接開口要 300 大洋….

看來沒法偷懶了,只能自己寫了。

在微信開放社群找到很多朋友分享的程式碼,非常感謝他們。

還有微信官方文件的微信簽名 sdk , github.com/snowlyg/wechatpay-guzzl...

聯絡交流

如果你發現了BUG或者有任何疑問、建議,請透過issue進行反饋。

也可以加 QQ 群交流:676717248

Iris-go

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章