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

Perl Dancer2 PSGI应用搭配Starman时Stripe支付请求失败排查

Stripe API在Starman环境下获取Checkout Session失败问题

问题背景

Web应用处于上线前最后测试阶段:

  • 单独运行命令 plackup -p 5000 bin/app.psgi 时,Stripe测试支付流程完全正常,无异常日志;
  • 使用Starman服务器运行命令 plackup -s Starman -a bin/app.psgi -l localhost:5000 时,支付流程可正常走到完成环节,但无法通过会话ID获取Checkout Session(对应Stripe API:GET /v1/checkout/sessions/:id)。

使用模块与失败代码

使用Perl模块Business::Stripe,相关代码如下:

#   my $session = $stripe->api( 'get', 'checkout/sessions', $session_id );
    my $session = $stripe->api( 'get', 'checkout/sessions', 'id' => $session_id );

注:注释的代码在非Starman环境可正常运行,按文档要求改为哈希形式后,两种写法在Starman环境下均无效。

错误日志

[HWCal:82368] error @2024-05-15 16:54:08> Route exception: malformed JSON string, neither array, object, number, string or atom, at character offset 0 (before "(end of string)") at /usr/share/perl5/vendor_perl/Business/Stripe.pm line 587. in /usr/local/share/perl5/5.36/Dancer2/Core/App.pm l. 1516

已确认信息与排查动作

  • Stripe对象和会话ID均有效;
  • 此前通过POST创建Checkout Session的操作在Starman环境下可成功完成;
  • 已按MDN文档检查JSON代码,去除trailing commas等格式问题,无效果。

排查思路建议

  • 检查Starman进程模型的状态问题:Starman是预fork多进程模型,可能存在Stripe对象(或其依赖的HTTP客户端连接)在进程间复用导致的状态异常。尝试在每次请求时重新初始化Stripe对象,而非复用全局实例。
  • 抓包对比API请求差异:用tcpdump、Wireshark等工具捕获两种运行模式下的Stripe API请求/响应,确认Starman环境下的GET请求是否发送了正确参数,以及Stripe返回的内容是否为空或非JSON格式——错误日志提示JSON解析失败,大概率是收到了异常响应内容。
  • 绕过模块封装直接测试:手动用LWP::UserAgent或HTTP::Tiny发送GET请求到Stripe API,绕过Business::Stripe的封装,验证是否能正常获取会话数据,排查模块本身的兼容性问题。
  • 调高Starman日志级别:运行Starman时添加--log-level debug参数,查看更详细的HTTP请求/响应细节,比如是否存在连接超时、重定向等未被捕获的异常。
  • 验证会话ID传递正确性:确认Starman环境下获取的会话ID与非Starman环境完全一致,排查是否因URL编码、会话存储(如Cookie/中间件)问题导致ID被篡改或丢失。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 00:42:47