Laravel Omnipay/Stripe 无法在 linux 上发送请求

Laravel Omnipay/Stripe unable to send request on linux

目前我已经将 omnipay/stripe 集成到我的 laravel 项目中,在我的本地没有问题,但是当我在服务器上测试它时它返回 “无效请求:不支持Content-Type 。如果错误仍然存​​在并且您需要帮助,请联系支持@stripe.com。 尝试发送请求时,请帮助。

$response = $gateway->purchase([
'amount' => $amount,
'currency' => $currency,
'token' => $token,
'confirm' => true,
'description' => auth()->user()->name
])->send();

错误的确切文本 Content-Type . 表明请求有一个 empty Content-Type header(该值包含在句点之前).虽然我无法解释为什么会发生这种情况,但有些东西干扰了请求。

您可以尝试从您的服务器进行基本 curl 调用(如下所示),以帮助隔离这是 network-level 干扰还是在应用程序堆栈中。

curl --request POST \
  --url 'https://api.stripe.com/v1/customers' \
  -u sk_test_123: \
  --header 'Content-Type: application/x-www-form-urlencoded' \
  --data 'description=test cust'

您可以尝试使用和不使用显式 header 看看这是否会有所不同。

我终于找到了解决方法,我将 post 放在这里以备将来参考。 我咨询了 Stripe 的技术支持,他们的回答给了我一个想法。

Stripe 支持发现的causes/issue: 正在发送空请求 Content-Type header。

我浏览了库并尝试调试正在发送的请求 header 但实际上在日志中发现它只是默认的“授权” header,有不知道 Content-Type 是如何添加的,所以根据他们的回应,我在 sendData($data) 处添加了 'Content-Type' => 'application/x-www-form-urlencoded'omnipay/stripe/src/Message/AbstractRequest.php。当然你也可以把它放在比我做的更有条理的方式。

令人惊讶的是它有效!

他们还建议了一种你也可以尝试的方法,但我没有。

$request = $gateway->purchase([
'headers' => ['Content-Type' => 'application/x-www-form-urlencoded'],
'amount' => $amount,
'currency' => $currency,
'token' => $token,
'confirm' => true,
'description' => auth()->user()->name
])->send();