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

问题描述

目前我已经将 omnipay/stripe 集成到我的 Laravel 项目中,在我的本地没问题,但是当我在服务器上测试时它返回 "Invalid request: unsupported Content-Type 。如果错误仍然存​​在并且你需要帮助,请联系 support@stripe.com。”尝试发送请求时,请帮助。

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

解决方法

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

您可以尝试从您的服务器进行基本的 curl 调用(如下所示),以帮助确定这是网络级干扰还是应用程序堆栈中的干扰。

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'

您可以尝试使用和不使用显式标头,看看这是否有所不同。

,

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

Stripe 支持人员发现的原因/问题: 发送的请求带有一个空的 Content-Type 标头。

我已经浏览了库并尝试调试正在发送的请求标头,但实际上在日志中发现它只是默认的“授权”标头,不知道如何添加内容类型在,因此根据他们的回应,我在 'Content-Type' => 'application/x-www-form-urlencoded' 处将 omnipay/stripe/src/Message/AbstractRequest.php 添加到 sendData($data)。当然你也可以用比我更结构化的方式来放置它。

令人惊讶的是它有效!

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

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...