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

部署至Heroku后Laravel Cashier向Stripe发送POST请求无请求体问题

解决Laravel Cashier在Heroku Staging环境下POST请求无请求体的问题

看起来你遇到的问题确实挺棘手——本地跑起来一切正常,到了Heroku预发布环境就出现Stripe请求丢失请求体的情况。结合你已经排查过的API凭据、依赖版本这些点,我给你几个具体的排查方向试试:

1. 强制开启Stripe请求日志,锁定问题根源

你说找不到 outgoing API请求的日志,其实Stripe PHP SDK本身支持输出详细请求日志,你可以在Laravel的AppServiceProvider里配置一下,把Stripe的请求细节绑定到Laravel的日志系统:

use Stripe\Stripe;
use Illuminate\Support\Facades\Log;

public function boot()
{
    // 给Stripe SDK指定Laravel日志实例
    $stripeLogger = Log::getMonolog()->withName('stripe-api');
    Stripe::setLogger($stripeLogger);
    // 开启DEBUG级别日志,能看到完整的请求/响应内容
    Stripe::setDebug(true);
}

部署这个修改后触发订阅创建操作,然后去Heroku日志里找[stripe-api]相关的条目,就能明确是Stripe SDK没构造出请求体,还是发送过程中丢失了,这一步能帮你快速缩小问题范围。

2. 核对Heroku环境变量的完整性

你的代码里用了env('STRIPE_SUBSCRIPTION_NAME')和env('STRIPE_PLAN_ID'),虽然本地正常,但一定要确认Heroku上这两个变量是否正确设置——有没有拼写错误、值为空的情况?如果其中一个变量缺失,Cashier构造订阅请求时可能会缺失关键参数,导致请求体异常。

你可以在终端执行heroku config命令,直接核对这些变量的值是否和本地完全一致。

3. 直接在Heroku实例里测试Stripe API请求

为了排除Heroku网络层的问题,你可以直接在运行的Dyno里用curl发一个测试请求到Stripe:

# 替换成你的Stripe测试密钥
heroku run curl -X POST https://api.stripe.com/v1/customers -u sk_test_your_stripe_key: -d "email=test-staging@example.com&name=Test User"

然后去Stripe Dashboard的日志里看这个请求是否有完整的请求体。如果这个请求正常,说明问题出在Laravel/Cashier的代码逻辑里;如果还是没有请求体,那可能是Heroku的网络配置(比如第三方插件、防火墙)拦截了请求体,这时候需要联系Heroku支持排查。

4. 绕开Cashier,直接用Stripe SDK测试

你可以写一段简单的测试代码,绕开Cashier的订阅逻辑,直接用Stripe SDK创建一个客户,看是否能正常发送请求体:

try {
    $customer = \Stripe\Customer::create([
        'email' => $this->email,
        'name' => $this->fullname,
    ]);
    Log::debug('Stripe Customer Created', ['customer_id' => $customer->id]);
} catch (\Exception $e) {
    Log::debug('Stripe Request Error', ['message' => $e->getMessage()]);
}

如果这个请求在Stripe日志里有完整请求体,说明问题出在Cashier的订阅创建逻辑里;如果还是没有,那就是Stripe SDK在Heroku环境下的配置有问题。

5. 检查Heroku的PHP配置

有时候Heroku的PHP默认配置会影响HTTP请求,比如curl的证书设置或者请求限制。你可以在项目根目录创建php.ini文件,添加以下配置:

curl.cainfo = "/app/vendor/heroku/heroku-buildpack-php/assets/lib/ca-certificates/cacert.pem"
allow_url_fopen = On

重新部署到Heroku后,看看是否能解决问题。

希望这些方法能帮你定位到问题!

内容的提问来源于stack exchange,提问作者Purplenimbus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 16:12:47