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

直接说结论: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/wechatv7+ 支持 V3,但默认初始化仍走 V2 兼容模式,需显式指定'version' => 'v3' - 若你看到文档里还在用
UnifiedOrder::create()或依赖WxPayApi::unifiedOrder(),基本是 V2 套路,别照搬
Laravel 中配置 V3 微信支付(以 overtrue/wechat 为例)
安装后不要直接 new WeChatPayment() —— 它会按 V2 初始化。正确做法是用工厂构造 V3 实例:
use Overtrue\WeChat\Payment\Application;
$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_path 和 key_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 路由要关闭 CSRF(
except或中间件排除) - 验签+解密必须用
$payment->verify()->fromRequest(request()),它自动完成证书加载、AES 解密、签名比对;手动解析 raw body 会失败 - 成功处理后必须返回 HTTP 200 + 空 body,任何其他响应(包括 JSON
{"code":"SUCCESS"})都会被微信当作失败重推
最常被忽略的一点:微信 V3 的平台证书需要定期轮换(90 天),SDK 不自动更新,得自己监听 wechat.certificate.refreshed 事件并持久化新证书——否则某天突然所有回调验签失败,查日志只会看到「签名错误」,根本想不到是证书过期。











