Laravel如何集成微信支付_Laravel 支付SDK调用流程【教程】

2次阅读

laravel 不内置微信支付,必须用支持v3的sdk(如overtrue/wechat v7+),且需显式配置’version’ => ‘v3’;v3使用sha256-rsa签名、aes加密回调、平台证书轮换机制,与v2完全不兼容。

Laravel如何集成微信支付_Laravel 支付SDK调用流程【教程】

直接说结论:Laravel 本身不内置微信支付支持,必须通过第三方 SDK(如 payjs/wechat-pay 或官方推荐的 overtrue/wechat)集成;但别急着装包——微信支付 V3 API 已全面取代 V2,新项目必须用 V3,而多数老教程仍基于 V2,踩坑率极高。

确认你用的是微信支付 V3 API(不是 V2)

微信已于 2023 年底正式下线 V2 接口的新增商户申请,V3 是强制要求。V2 和 V3 的签名机制、证书处理、回调验签、接口路径完全不同:

  • V2 使用 MD5 + key 签名,notify_url 明文传参,验签靠 sign 字段
  • V3 使用 SHA256-with-RSA 签名,所有请求必须带 Authorization 头,回调体是 AES-256-GCM 加密,必须用平台证书解密后才能验签
  • overtrue/wechat v7+ 支持 V3,但默认初始化仍走 V2 兼容模式,需显式指定 'version' => 'v3'
  • 若你看到文档里还在用 UnifiedOrder::create() 或依赖 WxPayApi::unifiedOrder(),基本是 V2 套路,别照搬

Laravel 中配置 V3 微信支付(以 overtrue/wechat 为例)

安装后不要直接 new WeChatPayment() —— 它会按 V2 初始化。正确做法是用工厂构造 V3 实例:

use OvertrueWeChatPaymentApplication;  $config = [     'app_id' => config('wechat.payment.app_id'),     'mch_id' => config('wechat.payment.mch_id'),     'key' => config('wechat.payment.key'), // V3 不再用这个!删掉或留空     'cert_path' => storage_path('app/cert/apiclient_cert.pem'), // 必须是 PEM 格式私钥     'key_path' => storage_path('app/cert/apiclient_key.pem'),     // 必须配对     'version' => 'v3', // 关键:强制启用 V3 模式 ];  $app = new Application($config); $payment = $app->payment;

注意:cert_pathkey_path 必须指向从微信商户平台下载的「APIv3 密钥」生成的证书文件(不是 ssl 证书),且私钥不能有密码;若报 Unable to load private key,大概率是格式不对或含密码。

统一下单与异步通知处理的关键差异

V3 下单返回的是 json,不是 xml;通知不再是明文 POST,而是加密 payload:

  • 下单调用:$result = $payment->transaction->native(['out_trade_no' => $orderNo, 'amount' => ['total' => 100], 'description' => 'test']); —— 返回数组含 code_url,不是 prepay_id
  • 通知地址必须在商户平台配置为 httpS,且 Laravel 路由要关闭 csrfexcept中间件排除)
  • 验签+解密必须用 $payment->verify()->fromRequest(request()),它自动完成证书加载、AES 解密、签名比对;手动解析 raw body 会失败
  • 成功处理后必须返回 HTTP 200 + 空 body,任何其他响应(包括 JSON {"code":"SUCCESS"})都会被微信当作失败重推

最常被忽略的一点:微信 V3 的平台证书需要定期轮换(90 天),SDK 不自动更新,得自己监听 wechat.certificate.refreshed 事件并持久化新证书——否则某天突然所有回调验签失败,查日志只会看到「签名错误」,根本想不到是证书过期。

text=ZqhQzanResources