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

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创建独立路由:

  1. 在自定义模块的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]
    
  2. 创建对应的控制器类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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 22:07:19