因为懒所以不打算更新项目中的微信支付相关 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);

创建微信支付分订单请求后处理返回数据