Shopify Payment App支付会话URL收到空POST请求排查
问题根因
不存在Shopify发送空请求、链路数据丢失的情况,从服务端打印的头信息可以直接验证请求携带了完整业务数据:
CONTENT_LENGTH值为874,说明请求体实际有874字节的内容CONTENT_TYPE值为application/json,说明Shopify是按JSON格式传输支付参数的
你读不到参数的核心原因是参数读取方式错误:PHP原生的$_POST超全局变量仅会自动解析application/x-www-form-urlencoded、multipart/form-data格式的POST请求体,完全不会处理application/json类型的请求,所以打印$_POST只能得到空数组。
配置问题说明
你当前将支付会话URL指向了服务器上独立部署的原生PHP文件,该文件使用$_POST获取参数的逻辑不符合JSON请求的读取要求,和Shopify端配置、传输链路没有关系。
修复方法
- 若保留独立PHP文件的接收方式,不要读取
$_POST,直接获取PHP原始输入流解析JSON即可,参考代码:
// 读取原始请求体 $rawContent = file_get_contents('php://input'); // 解析为关联数组 $paymentParams = json_decode($rawContent, true); // 此时$paymentParams内就包含所有支付相关字段:交易金额、订单信息、回调地址、店铺标识等
- 若使用Laravel框架开发,建议直接将支付会话URL配置为Laravel框架内的路由地址,不要指向独立PHP文件:Laravel的请求处理层已经自动完成了JSON请求体的解析,控制器内直接调用
$request->all()就能拿到全部支付参数,无需手动处理输入流。
额外验证提示
你当前使用的ngrok隧道本身没有出现请求体丢失问题:头信息里的CONTENT_LENGTH正常透传,Shopify侧的请求标识、API版本头也都完整接收,不需要排查链路层面的问题。接收参数后记得按支付接口要求返回对应格式的响应,避免Shopify判定请求失败。
内容的提问来源于stack exchange,提问作者shababhsiddique
相关产品推荐
相关产品推荐

