Composer install支付插件报“package not found”主因是包名错误或未配置国内镜像源;支付宝应使用alipay/easysdk,微信推荐wechatpay/wechatpay-guzzle-middleware;autoload失效需执行dump-autoload;回调验签失败多因参数格式或密钥混淆;Laravel中两类微信SDK不可共存。

composer install 支付插件时提示 “package not found”
不是插件不存在,而是你搜错了包名,或者没加正确的仓库源。国内很多支付 SDK 不在 Packagist 官方源里,比如支付宝官方 PHP SDK alipay-sdk-php 已停止维护,现在主流用的是社区维护的 alipay/easysdk;微信支付则是 wechatpay/wechatpay-guzzle-middleware(官方推荐)或 overtrue/wechat(Laravel 场景多)。
实操建议:
- 先确认你要集成的是「支付宝当面付/手机网站支付」还是「微信 JSAPI/扫码支付」——不同场景依赖的包和初始化方式差异很大
- 支付宝新版 SDK 必须用
composer require alipay/easysdk,旧版alipay-sdk-php会报 404 或安装后调用失败 - 微信官方 SDK 需要额外配置 Guzzle 中间件,直接
composer require wechatpay/wechatpay-guzzle-middleware后还得手动注册中间件,否则签名总不通过 - 如果公司内网或 CI 环境拉包慢/失败,别硬等,改用
composer config -g repos.packagist composer https://packagist.phpcomposer.com切镜像源(注意:PHP Composer 官方镜像已停,推荐用阿里云或腾讯云镜像)
vendor/autoload.php 引入后调用 Alipay\EasySDK\Kernel\Factory::payment()->common()->pageExecute() 报错 Class not found
这是自动加载失效的典型表现,根本原因不是代码写错,而是 composer autoload 没刷新,或 PSR-4 命名空间和实际路径对不上。
实操建议:
- 每次增删包后必须运行
composer dump-autoload,尤其在 Docker 环境里,如果 vendor 是挂载卷,宿主机改了 composer.json 但容器没重装,autoload 就不会更新 -
alipay/easysdk的类路径是AlipayEasySDKKernelFactory,注意大小写 —— Windows 开发机可能不报错,Linux 上直接 fatal error - 检查
composer.json里有没有意外覆盖了"autoload"字段,比如加了自定义 PSR-4 映射却没包含 vendor 目录,会导致整个第三方包无法加载 - 用
composer show alipay/easysdk确认安装版本,v2.3.0+ 才支持pageExecute(),旧版只有execute(),参数结构也不同
支付宝回调验签始终失败,日志显示 sign check fail
不是密钥配错了,大概率是原始请求参数没按规范排序拼接 —— SDK 内部验签逻辑严格依赖“参数升序 + 去空 + URL decode 后拼串”,而你传进去的 $_POST 或 file_get_contents('php://input') 可能混着 JSON、表单、query string 多种格式。
实操建议:
- 支付宝回调必须用
$_POST(表单提交),不能用json_decode(file_get_contents('php://input')),否则验签必挂 —— 官方文档写得隐晦,但 SDK 源码里明确只从$_POST取参 - 验签前先调
Alipay\EasySDK\Kernel\Factory::payment()->common()->verifyNotify(),它内部会自动过滤空值、排序、URL decode,别自己拼字符串再 hash - 私钥用的是应用私钥(
app_private_key.pem),不是支付宝公钥;验签用的是支付宝公钥(alipay_public_key.pem),不是你的公钥 —— 这两个文件名极易搞混 - 如果你用 Nginx + PHP-FPM,确保
fastcgi_param PHP_VALUE "always_populate_raw_post_data=-1";没被注释掉,否则$_POST在某些 PHP 版本下为空
Laravel 项目里 overtrue/wechat 和微信官方 SDK 冲突
两者都绑定了 wechatpay 命名空间,且都试图接管 wechat.pay 这个服务名,运行时会报 Target [Overtrue\WeChat\Payment\PaymentServiceProvider] is not instantiable 或方法找不到。
实操建议:
- 二选一:业务轻量用
overtrue/wechat(封装好、文档全);需要对接微信分账、电子发票、先享后付等新能力,必须切到官方wechatpay/wechatpay-guzzle-middleware - 如果已装
overtrue/wechat又想临时试用微信官方 SDK,先composer remove overtrue/wechat,再composer require wechatpay/wechatpay-guzzle-middleware guzzlehttp/guzzle:^7.5—— 注意 Guzzle 版本,官方 SDK 要求 ^7.5,和 Laravel 9+ 默认的 ^8.0 不兼容 - 不要在 config/app.php 里同时注册两个微信服务提供者,哪怕用了别名,Laravel 的容器解析机制会在第一次 resolve 时缓存结果,后续调用永远走第一个注册的
timestamp 是否在 15 分钟窗口内,服务器时间快 20 分钟,回调就永远过不了。











