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
相关产品推荐
相关产品推荐

