应直接安装 easywechat/pay 独立包(v4.x,PHP≥8.0),手动传入含证书与私钥的绝对路径、app_id、mch_id 等必填参数初始化 Pay 实例,确保 openid 来自当前公众号且匹配 app_id。

EasyWeChat 的支付功能已从主包拆出,easywechat/pay 是独立的 Composer 包,不能通过安装 overtrue/wechat 或旧版 easywechat/easywechat 获得支付能力。
确认你要用的是 EasyWeChat v5(Laravel/Lumen 友好)还是 v6(纯 PHP)
v5 和 v6 的包名、命名空间、配置方式完全不同,选错会导致 Class not found 或 Call to undefined method:
- v5:包名是
overtrue/laravel-wechat(Laravel 项目)或easywechat/easywechat(非 Laravel),但不包含支付类;支付需额外 requireeasywechat/pay - v6:包名是
easywechat/pay,且仅含支付相关代码,不依赖框架,也不含公众号/小程序等其他模块
如果你只是做微信支付(如 JSAPI/H5/APP 支付),直接装 easywechat/pay 即可,无需装完整版 EasyWeChat。
执行 composer require easywechat/pay
在项目根目录运行:
composer require easywechat/pay
该命令会自动拉取最新稳定版(目前为 v4.x,对应微信支付 APIv3)。注意以下几点:
- PHP 版本需 ≥ 8.0(v4.x 不再支持 PHP 7.x)
- 若报错
Root composer.json requires easywechat/pay ^4.0, found easywechat/pay[v4.0.0, ..., v4.2.0] but these were not loaded,说明你本地有旧版 lock 文件冲突,先运行composer update或删掉composer.lock再试 - 安装后不会自动发布配置文件(因为 v4.x 是无框架设计),你需要手动创建配置数组传入
Pay::instance()
初始化 Pay 实例时别漏掉 merchant_cert_path 和 private_key
微信支付 APIv3 强制要求双向证书认证,easywechat/pay v4.x 不再自动读取环境变量或 config 文件,所有参数必须显式传入:
$pay = \EasyWeChat\Pay\Pay::instance([
'app_id' => 'wxd678efh567hg6787',
'mch_id' => '1900009876',
'mch_secret_key' => 'your-v3-api-key-here',
'merchant_cert_path' => '/path/to/apiclient_cert.pem', // 注意:必须是 PEM 格式,且含私钥
'private_key' => '/path/to/apiclient_key.pem', // 实际上就是上面 cert 文件里的私钥部分(v4.1+ 支持合并写法)
]);
常见坑:
-
merchant_cert_path指向的文件必须同时包含证书和私钥(即微信商户平台下载的apiclient_cert.pem原始文件),不能只放公钥 - 如果用的是微信支付平台新下发的「APIv3 密钥」+「平台证书」分离模式,需配合
easywechat/payv4.2+ 并使用platform_certificate参数加载平台证书 - 路径必须是绝对路径(可用
__DIR__ . '/certs/apiclient_cert.pem')
调用 JSAPI 支付前先确保 openid 已获取且与 appid 匹配
JSAPI 支付必须传 openid,这个 openid 必须来自当前 app_id 对应的公众号(不是开放平台 unionid),否则微信会返回 "errcode":40164,"errmsg":"invalid ip" 或更隐蔽的签名失败。
- 不要复用其他公众号或小程序的 openid
- 不要把网页授权拿到的
code直接丢给支付 SDK——必须先用code换取当前公众号下的openid - 调试时可用
curl -X POST https://api.mch.weixin.qq.com/v3/pay/transactions/jsapi -H "Authorization: ..." -d '{"..."}'手动验签,确认参数结构是否符合微信要求
证书路径、API 版本、openid 来源这三项出错,占实际接入失败的 80% 以上。别急着查文档,先核对这三个点。











