You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel定时任务调用Stripe支付报错:测试卡触发生产模式拒绝

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 22:21:02