關於微信支付V3 更新《企業打款到零錢》至《商戶轉賬到零錢》

hard發表於2022-06-17

如題,大概是今年4、5月份開通“微信代付”也就是商戶平臺的錢通過介面轉賬到使用者餘額裡這個功能,更新了一版,更新完之後接入方式與之前完全分離,也就是完全不一樣了。本文主要詳細介紹下關於官方推薦的包 wechatpay 具體如果使用,官方文件有些腦殘,讓人猜來猜去。

首先我們進入商戶平臺 賬戶中心 -> API安全

關於微信更新《企業打款到零錢》至《商戶轉賬到零錢》
如果此處顯示未申請,先按照步驟申請,申請完之後你會獲取到一個壓縮包,壓縮包中會有兩個檔案
一個 apiclient_cert.pem 為了防止亂這裡給他起別名 “檔案A” , 另外一個 apiclient_key.pem 檔案起別名 “檔案B”

如果已申請則是下方圖片,去程式裡找這兩個檔案

關於微信更新《企業打款到零錢》至《商戶轉賬到零錢》

然後我們去設定 apiv3 祕鑰,一個32位隨機數,按照指示設定即可,我們這個這個祕鑰起別名 “字串A”

關於微信更新《企業打款到零錢》至《商戶轉賬到零錢》

然後點選 賬戶中心 -> 商戶資訊 獲取商戶號 我們起別名 “字串B”

關於微信更新《企業打款到零錢》至《商戶轉賬到零錢》

然後下一步來閱讀以下官方推薦的輪子 wechatpay(叫啥無所謂,我叫習慣了),然後我們安裝上 composer require wechatpay/wechatpay
注意這個輪子要求:
Guzzle 7.0,PHP >= 7.2.5
Guzzle 6.5,PHP >= 7.1.2
安裝完之後其他不用看,先去看下載平臺證照,點進去

關於微信更新《企業打款到零錢》至《商戶轉賬到零錢》

然後到這個頁面,點選這裡

關於微信更新《企業打款到零錢》至《商戶轉賬到零錢》

然後進入下一個頁面,介紹工具如果使用,使用工具之前確定你已經安裝好這個輪子,他生成的方式有很多我採用的是第二個
關於微信更新《企業打款到零錢》至《商戶轉賬到零錢》
詳細介紹下生成方式,首先我們切換到我們專案的 vendor/bin 資料夾下,你會看到一個 CertificateDownloader.php 這個檔案,說明剛輪子就安裝對了。
執行命令之前我們還需要獲取另外一個字串 商戶API證照序列號 執行以下程式碼即可獲得,我們起名:“字串C”

$str = openssl_x509_parse(file_get_contents(檔案B的相對路徑或是絕對路徑));
return $str['serialNumberHex'];

然後切換到 vendor/bin 資料夾下 執行

php -f CertificateDownloader.php -- -k  祕鑰A -m 字串B -f 檔案B絕對路徑 -s 字串C -o 要生成的證照位置的絕對路徑

執行之後我們會在剛才設定的路徑上獲得一個.pem結尾的檔案,這裡起名 “檔案C”,至此我們的準備工作已全部做完,然後我們去看輪子的接入文件 如下圖

關於微信更新《企業打款到零錢》至《商戶轉賬到零錢》

詳情解析,如下

<?php

require_once('vendor/autoload.php');

use WeChatPay\Builder;
use WeChatPay\Crypto\Rsa;
use WeChatPay\Util\PemUtil;




$merchantId = '字串B';

//注意此處一定要按照“file:///www/wwwroot/...pem”這種格式寫,不然報錯
$merchantPrivateKeyFilePath = 'file://'.'檔案B的絕對路徑'; 
$merchantPrivateKeyInstance = Rsa::from($merchantPrivateKeyFilePath, Rsa::KEY_TYPE_PRIVATE);


$merchantCertificateSerial = '字串C';

//注意此處一定要按照“file:///www/wwwroot/...pem”這種格式寫,不然報錯
$platformCertificateFilePath = 'file://'.'檔案C的絕對路徑';
$platformPublicKeyInstance = Rsa::from($platformCertificateFilePath, Rsa::KEY_TYPE_PUBLIC);


$platformCertificateSerial = PemUtil::parseCertificateSerialNo($platformCertificateFilePath);

// 構造一個 APIv3 客戶端例項
$instance = Builder::factory([
    'mchid'      => $merchantId,
    'serial'     => $merchantCertificateSerial,
    'privateKey' => $merchantPrivateKeyInstance,
    'certs'      => [
        $platformCertificateSerial => $platformPublicKeyInstance,
    ],
]);

//然後構建代付,下方詳細引數說明詳見 [發起商家轉賬API](https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter4_3_1.shtml "發起商家轉賬API")
$resp = $instance->chain('v3/transfer/batches')->post(['json' => [
    'appid' => '小程式appid', //因為我這裡接的是小程式業務繫結的使用者
    'out_batch_no' => '訂單號',
    'batch_name' => '佣金提現',
    'batch_remark' => '佣金提現',
    'total_amount' => '訂單金額' * 100,
    'total_num' => 1,
    'transfer_detail_list' => [
       [
           'out_detail_no' =>'子訂單號',
           'transfer_amount' => '訂單金額' * 100,
           'transfer_remark' => '佣金提現',
           'openid' => '使用者openid',
       ]
    ],
]]);

if($resp->getStatusCode() != 200){
    throw new RequestException("稽核提現失敗,請聯絡技術人員");
}

至此算是完成了,本人草草整理了個文件,方便被微信官方文件看的頭疼的大家也方便自己看,如有錯誤或者哪裡不清楚感謝留言指出

本作品採用《CC 協議》,轉載必須註明作者和本文連結
從來不存在被埋沒的努力。

相關文章