overtrue/laravel-wechat 统一下单签名错误
第一次用 overtrue/laravel-wechat 做微信小程序支付功能,网上查了一下获取支付类有好几种写法。
第一种:
$payment = \EasyWeChat::payment();
第二种:
use EasyWeChat\Factory;
$config = [
'app_id' => '',
'key' => '', // API 密钥
// 如需使用敏感接口(如退款、发送红包等)需要配置 API 证书路径(登录商户平台下载 API 证书)
'key_path' => '',
'cert_path'=> '',
'mch_id' => '',
'notify_url' => '',// 你也可以在下单时单独设置来想覆盖它
];
$payment = Factory::payment($config);
或者用写好的配置:
$payment = Factory::payment(config("wechat.payment.default"));
第三种:
$payment = app('wechat.payment');
第四种:
use Overtrue\LaravelWeChat\Facade as EasyWeChat;
$app = new EasyWeChat();
$payment = $app->payment();
于是选中其中一个后再调用统一支付接口
$result = $payment->order->unify([
'body' => 'test',
'openid' => $user->openid, // 这里的openid为付款人的openid
'out_trade_no' => $order_no,
'total_fee' => 100, // 总价
'trade_type' => 'JSAPI', // 必须为JSAPI
]);
结果是签名失败,日志内容如下(隐私数据用xxxxxx代替):
2020-08-05T00:10:17.881890+08:00] EasyWeChat.INFO: >>>>>>>>
POST /pay/unifiedorder HTTP/1.1
Content-Length: 536
User-Agent: GuzzleHttp/6.5.5 curl/7.61.0 PHP/7.2.9
Host: api.mch.weixin.qq.com
<xml><mch_id>xxxxxx</mch_id><nonce_str><![CDATA[5f2988699ef84]]></nonce_str><body><![CDATA[test]]></body><openid><![CDATA[oojOP4mRvC6V7Rupy6_r7oEPj_es]]></openid><out_trade_no>20200804173133172087</out_trade_no><total_fee>100</total_fee><trade_type><![CDATA[JSAPI]]></trade_type><spbill_create_ip><![CDATA[36.57.176.243]]></spbill_create_ip><appid><![CDATA[xxxxxx]]></appid><notify_url><![CDATA[https://xxxxx.cn/api/orders/notify]]></notify_url><sign><![CDATA[A2A6A6B6C38C8A808C0AC8270CFDFC3D]]></sign></xml>
<<<<<<<<
HTTP/1.1 200 OK
Server: nginx
Date: Tue, 04 Aug 2020 16:10:17 GMT
Content-Type: text/plain
Content-Length: 105
Connection: keep-alive
Keep-Alive: timeout=8
Request-ID: 08E990A6F905109A0618B6D9EEA30620B36328D333-77523001
<xml><return_code><![CDATA[FAIL]]></return_code>
<return_msg><![CDATA[签名错误]]></return_msg>
</xml>
然后我把中间的xml内容和商户支付key放到微信官方的支付签名检查工具里显示没有错误,已通过。
不知道是什么原因小程序里就是签名失败
找下 overtrue/laravel-wechat 的 request 对象, 打印下 head 和请求参数(post 和 get)
用的是 guzzle
找到这个
EasyWeChat\Kernel\Traits\HasHttpRequests::request()
,把参数全部打印到文件,看看有没有错误去 github 提
重置了密钥可以了
这种支付签名检查工具通过,但是小程序里不通过的,就是和key有关系,不管对不对重置一下。
获取支付类我用的第二种(而且配置信息必须在上下文,从配置文件里取也不行),其它三种都是签名失败,不知道为什么?