1. 獲取商戶API證書
登錄商戶平臺(tái)【API安全】->【API證書】->【查看證書】,可查看商戶API證書序列號(hào)。
商戶API證書和微信支付平臺(tái)證書均可以使用第三方的證書解析工具,查看證書內(nèi)容?;蛘呤褂胦penssl命令行工具查看證書序列號(hào)。
/*
* 加載私鑰
* Read private key from file
*
* @param string $filepath PEM encoded private key file path
*
* @return resource|bool Private key resource identifier on success, or FALSE on error
*/
public static function getPrivateKey($filepath) {
return openssl_get_privatekey(file_get_contents($filepath));
}
2. 調(diào)用支付API生成簽名生成
商戶可以按照下述步驟生成請(qǐng)求的簽名。
1. 構(gòu)造簽名串
我們希望商戶的技術(shù)開發(fā)人員按照當(dāng)前文檔約定的規(guī)則構(gòu)造簽名串。微信支付會(huì)使用同樣的方式構(gòu)造簽名串。如果商戶構(gòu)造簽名串的方式錯(cuò)誤,將導(dǎo)致簽名驗(yàn)證不通過。下面先說明簽名串的具體格式。
簽名串一共有五行,每一行為一個(gè)參數(shù)。行尾以 \n
(換行符,ASCII編碼值為0x0A)結(jié)束,包括最后一行。如果參數(shù)本身以\n
結(jié)束,也需要附加一個(gè)\n
。
HTTP請(qǐng)求方法\n
URL\n
請(qǐng)求時(shí)間戳\n
請(qǐng)求隨機(jī)串\n
請(qǐng)求報(bào)文主體\n
第一步,獲取HTTP請(qǐng)求的方法(GET
,POST
,PUT
)等
GET
第二步,獲取請(qǐng)求的絕對(duì)URL,并去除域名部分得到參與簽名的URL。如果請(qǐng)求中有查詢參數(shù),URL末尾應(yīng)附加有'?'和對(duì)應(yīng)的查詢字符串。
/v3/certificates
第三步,獲取發(fā)起請(qǐng)求時(shí)的系統(tǒng)當(dāng)前時(shí)間戳,即格林威治時(shí)間1970年01月01日00時(shí)00分00秒(北京時(shí)間1970年01月01日08時(shí)00分00秒)起至現(xiàn)在的總秒數(shù),作為請(qǐng)求時(shí)間戳。微信支付會(huì)拒絕處理很久之前發(fā)起的請(qǐng)求,請(qǐng)商戶保持自身系統(tǒng)的時(shí)間準(zhǔn)確。
$ date +%s
1554208460
第四步,生成一個(gè)請(qǐng)求隨機(jī)串,可參見生成隨機(jī)數(shù)算法。這里,我們使用命令行直接生成一個(gè)。文章來源:http://www.zghlxwxcb.cn/news/detail-676056.html
$ hexdump -n 16 -e '4/4 "%08X" 1 "\n"' /dev/random
593BEC0C930BF1AFEB40B4A08C8FB242
第五步,獲取請(qǐng)求中的請(qǐng)求報(bào)文主體(request body)。文章來源地址http://www.zghlxwxcb.cn/news/detail-676056.html
- 請(qǐng)求方法為GET時(shí),報(bào)文主體為空。
- 當(dāng)請(qǐng)求方法為POST或PUT時(shí),請(qǐng)使用真實(shí)發(fā)送的JSON報(bào)文。
- 圖片上傳API,請(qǐng)使用meta對(duì)應(yīng)的JSON報(bào)文。
- 接口參數(shù) json格式
-
$url3 = "https://api.mch.weixin.qq.com/v3/refund/domestic/refunds"; // 微信 V3 退款 $mch_private_key = openssl_get_privatekey(file_get_contents($api_key));//私鑰 $serial_no = '**************************'; // 序列號(hào) // 生成token 驗(yàn)簽 $http_method = 'POST'; $timestamp = time();//時(shí)間戳 $nonce = $str_32;//隨機(jī)串 $body = json_encode($data_record2); // 接口參數(shù) $url_parts = parse_url($url3); # 接口地址 $canonical_url = ($url_parts['path'] . (!empty($url_parts['query']) ?"?${url_parts['query']}" : "")); $message = $http_method."\n". $canonical_url."\n". $timestamp."\n". $nonce."\n". $body."\n";
3.計(jì)算簽名值
openssl_sign($message, $raw_sign, $mch_private_key, 'sha256WithRSAEncryption');
$sign = base64_encode($raw_sign);
$schema = 'WECHATPAY2-SHA256-RSA2048';
$token =sprintf('mchid="%s",nonce_str="%s",timestamp="%d",serial_no="%s",signature="%s"',
$mch_id, $nonce, $timestamp, $serial_no, $sign);
$headerArray = [
'Accept: application/json',
'User-Agent: */*',
'Content-Type: application/json; charset=utf-8',
"Authorization: {$schema} {$token}",
"Wechatpay-Serial:{$serial_no}"
];
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url3);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST,FALSE);
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data_record2));
curl_setopt($curl,CURLOPT_HTTPHEADER,$headerArray);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$output3 = curl_exec($curl);
$output3 = json_decode($output3,true);
到了這里,關(guān)于微信支付 API v3的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!