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 统一下单签名错误

不知道是什么原因小程序里就是签名失败

overtrue/laravel-wechat 统一下单签名错误

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 5

找下 overtrue/laravel-wechat 的 request 对象, 打印下 head 和请求参数(post 和 get)

用的是 guzzle
找到这个
EasyWeChat\Kernel\Traits\HasHttpRequests::request(),把参数全部打印到文件,看看有没有错误

3年前 评论

重置了密钥可以了

3年前 评论

这种支付签名检查工具通过,但是小程序里不通过的,就是和key有关系,不管对不对重置一下。

3年前 评论

获取支付类我用的第二种(而且配置信息必须在上下文,从配置文件里取也不行),其它三种都是签名失败,不知道为什么?

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!