php://input始终返回NULL,Stripe Webhook无法获取Payload求助
解决Stripe Webhook中
php://input返回NULL的问题 针对你遇到的TypeError: array_keys(): Argument #1 ($array) must be of type array, null given错误,核心原因是php://input流被提前消耗或无法读取,下面是针对性的解决方案:
1. 替换file_get_contents('php://input')的读取方式(针对Drupal场景)
你在Drupal自定义模块中引入Webhook代码时,Drupal的请求生命周期会提前读取php://input流,导致后续调用file_get_contents返回NULL。直接用Drupal的Request对象获取原始请求体即可:
// 替换原来的$payload = @file_get_contents('php://input'); $payload = \Drupal::request()->getContent();
2. 检查PHP与服务器配置
- 确认PHP的
post_max_size配置足够大(至少1M以上,Stripe Webhook Payload通常远小于这个值),可在php.ini中修改或通过.htaccess设置:php_value post_max_size 8M - 若使用Nginx,检查
client_max_body_size配置,确保不小于post_max_size:client_max_body_size 8M; - Apache用户检查
LimitRequestBody,设置为0(无限制)或足够大的值:LimitRequestBody 0
3. 调整Webhook的实现方式
不要通过require 'webhook.php'的方式在模块文件中引入Webhook逻辑,应为Webhook创建独立路由:
- 在自定义模块的
routing.yml中添加路由:custom_module.stripe_webhook: path: '/stripe-webhook' defaults: _controller: '\Drupal\custom_module\Controller\StripeWebhookController::handle' _title: 'Stripe Webhook' requirements: _access: 'TRUE' methods: [POST] - 创建对应的控制器类
src/Controller/StripeWebhookController.php,在handle方法中编写Webhook处理逻辑,确保请求直接到达端点,不会被模块其他逻辑提前消耗输入流。
4. 验证Webhook端点
用Stripe CLI快速测试端点是否正常接收Payload:
stripe listen --forward-to http://your-domain/stripe-webhook stripe trigger payment_intent.succeeded
内容的提问来源于stack exchange,提问作者dawa
相关产品推荐
相关产品推荐

