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

Symfony 6生产环境Stripe Webhook报503错误:无效编码ISO-8859-1

解决Symfony+Stripe生产环境Webhook 503编码错误问题
  • 排查PHP默认编码配置
    Planethoster主机可能强制将PHP默认编码设为ISO-8859-1,而Stripe Webhook请求体采用UTF-8编码,导致解析失败。

    • 若使用Apache,在项目根目录.htaccess中添加/修改:
      php_value default_charset "UTF-8"
      php_value mbstring.internal_encoding "UTF-8"
      
    • 若使用Nginx,在站点配置中加入:
      fastcgi_param PHP_VALUE "default_charset=UTF-8; mbstring.internal_encoding=UTF-8";
      
    • 也可在public/index.php开头强制设置编码:
      ini_set('default_charset', 'UTF-8');
      mb_internal_encoding('UTF-8');
      
  • 强制Stripe Webhook解析用UTF-8
    Symfony请求解析可能受全局编码影响,直接在Webhook控制器中读取原始请求体并转码:

use Symfony\Component\HttpFoundation\Request;

public function handleStripeWebhook(Request $request)
{
    // 获取原始二进制请求内容,强制转成UTF-8
    $rawContent = $request->getContent(false);
    $utf8Content = mb_convert_encoding($rawContent, 'UTF-8', 'ISO-8859-1');
    
    // 用转码后的内容初始化Stripe事件
    $event = \Stripe\Event::constructFrom(json_decode($utf8Content, true));

    // 后续业务逻辑...
}

注意:不要使用$request->getContent()(默认按当前编码解析),必须传false获取原始未处理的内容。

  • 解决缓存生成的编码一致性问题
    清缓存后暂时正常,大概率是缓存生成时的编码环境与运行时不一致:

    • 执行缓存清除命令时强制指定UTF-8环境变量:
      LC_ALL=en_US.UTF-8 php bin/console cache:clear --env=prod
      
    • 确认主机终端环境编码为UTF-8,避免缓存文件生成时采用ISO-8859-1编码。
  • 排查Planethoster主机的特殊配置
    部分共享主机会自动修改请求编码或通过安全模块干扰请求体解析,可联系主机客服确认:

    • 是否存在自动转码POST请求的配置
    • 是否开启ModSecurity等安全模块影响了Webhook请求解析
    • 确认主机PHP版本与本地/测试环境一致,避免版本差异导致的编码处理逻辑不同

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 03:05:04