Laravel定时任务调用Stripe支付报错:测试卡触发生产模式拒绝
问题回顾
手动使用同一张卡结账支付成功,CLI手动执行php artisan runReorder命令也能支付成功,但Laravel定时任务($schedule->command('runReorder')->dailyAt('00:00');)自动执行时,Stripe返回错误:
Your card was declined. Your request was in live mode,but used a known test card
已确认商户账户处于LIVE模式,且已清除缓存和配置。
核心排查方向
这类"手动执行正常、定时任务异常"的问题,绝大多数是运行环境不一致导致的,以下是具体排查步骤:
1. 强制指定定时任务的运行环境
Laravel定时任务默认使用系统全局的PHP环境,可能和你手动执行php artisan时的环境(比如虚拟环境、特定PHP版本)不一致,导致加载了错误的.env配置(比如测试环境的Stripe密钥)。
- 解决方法:在定时任务的CRON配置里明确指定项目目录和PHP路径,例如:
0 0 * * * cd /path/to/your/laravel-project && /usr/local/bin/php artisan runReorder >> /dev/null 2>&1 - 或者在
Kernel.php中直接指定运行环境:$schedule->command('runReorder')->dailyAt('00:00')->environment('production');
2. 验证Stripe密钥的加载正确性
在runReorder命令的handle()方法中添加日志,输出当前使用的Stripe密钥前缀(避免泄露完整密钥):
public function handle() { // 添加日志验证 \Log::info('Current Stripe Secret Key Prefix: ' . substr(config('services.stripe.secret'), 0, 10) . '...'); // 原有业务逻辑... }
执行定时任务后查看日志(storage/logs/laravel.log),确认密钥前缀是否和生产环境一致:
- 生产环境Stripe密钥前缀是
sk_live_ - 测试环境是
sk_test_
如果是测试密钥,说明定时任务加载了错误的环境配置,需要检查.env文件的读取权限或环境变量设置。
3. 确认定时任务使用的卡片信息
排查runReorder命令的逻辑,确保在定时任务执行时,使用的是生产环境的有效银行卡,而非Stripe测试卡(比如4242 4242 4242 4242这类测试卡号)。即使手动执行时逻辑正确,也要排除定时任务分支中是否因环境判断错误切换了卡片数据源。
4. 清除调度缓存
Laravel的调度配置可能存在缓存,导致新的环境配置未生效,执行以下命令清除缓存:
php artisan schedule:clear
之后重新部署定时任务。
总结
优先排查定时任务的运行环境和配置加载问题,这是此类问题最常见的根源。如果以上步骤都无法解决,可以尝试在定时任务执行时输出完整的环境变量信息,进一步定位差异。
内容的提问来源于stack exchange,提问作者StackOverFall

