手动构建 PHP 微信支付 API v3 接口生成签名请求
因为懒所以不打算更新项目中的微信支付相关 API,考虑到接微信支付分,需要手动构建请求。
然而在构建了创建微信支付分订单之后,却接连报错:微信创建支付分订单报错:“Http头缺少Accept或User-Agent” 解决。经过一番探索,最后找到了原由:API v3 接口推荐(强制)使用 json 格式的请求参数,并返回 json 格式参数(之前是 xml),且 签名生成 方式和位置发生了变化。
按照文档的指示构建获取 Authorization
值的方法:
private function getAuthorization($url, $body, $http_method = "POST")
{
// Authorization: <schema> <token>
$url_parts = parse_url($url);
$canonical_url = ($url_parts['path'] . (!empty($url_parts['query']) ? "?${url_parts['query']}" : ""));
$timestamp = Formatter::timestamp();
$nonce = Formatter::nonce();
$message = Formatter::request($http_method, $canonical_url, $timestamp, $nonce, $body);
$priKey = Formatter::getPrivateKey($this->priKeyFilePath);
openssl_sign($message, $raw_sign, $priKey, 'sha256WithRSAEncryption');
$sign = base64_encode($raw_sign);
return Formatter::authorization($this->mch_id, $nonce, $sign, $timestamp, $this->$serial);
}
其中 Formatter 类属于 API v3 中的工厂类,可以直接从 wechatpay-php/src/Formatter.php 下载使用。
请求主体:
$queryUrl = 'https://api.mch.weixin.qq.com/v3/payscore/serviceorder';
$authorization = $this->getAuthorization($queryUrl, $param);
$headers = [
'Authorization:' . $authorization,
'Accept:application/json',
'Content-Type:application/json;charset=utf-8',
'User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36',
];
$result = Http::PostWithHeaders($param, $headers, $queryUrl);