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');
- 若使用Apache,在项目根目录
强制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编码。
- 执行缓存清除命令时强制指定UTF-8环境变量:
排查Planethoster主机的特殊配置
部分共享主机会自动修改请求编码或通过安全模块干扰请求体解析,可联系主机客服确认:- 是否存在自动转码POST请求的配置
- 是否开启ModSecurity等安全模块影响了Webhook请求解析
- 确认主机PHP版本与本地/测试环境一致,避免版本差异导致的编码处理逻辑不同
内容的提问来源于stack exchange,提问作者Xavier Ribant
相关产品推荐
相关产品推荐

