用 Surge 启用贝壳自定义房租金额支付问题

问题背景

我使用的 Pulse 卡在云闪付渠道有单笔 1,000 元的限额,当期房租账单总额超过该限额。为了完成支付,需要在贝壳账单页启用自定义金额,把房租拆成单笔不超过 1,000 元的金额支付。
实际遇到两个问题:自定义支付金额按钮无法点击;按钮启用后输入 800 元,进入收银台又恢复为完整账单金额。整个排查过程都通过 Surge 捕获本人手机上的请求、查看 JSON Body,并用临时 Rewrite 验证字段作用。

用 Surge 建立排障环境

手机上的 Surge 开启了远程控制、MITM 和 HTTP 捕获。电脑通过 surge-cli 连接手机:
排查时确认以下功能处于开启状态:
如果 HTTP 捕获会话已经结束,可以重新打开:
随后订阅实时请求,在手机上重新进入账单页并复现问题:
实时记录里出现了三条关键请求:
阶段
接口
Surge 中观察到的字段
加载账单
GET /chuzu/api/trusteeship/getBillDetail
allowminiPaypayingDetail.serialNum
提交支付金额
POST /chuzu/api/trusteeship/billLockPay
请求中的 priceserialNum,响应中的 payUrl
初始化收银台
GET /ecashier/v2/main/init/{rembId}
pendingPayAmount
通过 dump request 可以查看最近请求及其 ID:
再根据请求 ID 读取捕获的请求体或响应体:

在 getBillDetail 中开启自定义金额

账单详情接口为:
Surge 捕获的响应显示,shouldPayInfo.allow 控制前端的自定义支付金额按钮。原始值为 false 时,按钮无法点击。于是给这个响应添加 JSON Body Rewrite:
改写后重新进入账单页,自定义金额按钮已经可以点击。响应中的 miniPay500,因此本次输入的 800 元也满足最低支付金额限制。

用请求链定位 800 元为什么变回完整账单金额

在账单页输入 800 元并提交后,Surge 实时捕获到:
请求体里的关键字段为:
price 已经是 800,自定义金额确实传到了后端。getBillDetail 的响应同时带着一个旧的 payingDetail.serialNum,而且 payingCountdown 已经小于零。billLockPay 提交这个旧流水号后,服务端返回的 payUrl 仍然指向之前的收银台订单,URL 中的 rembId 没有变化。
进入收银台后,Surge 又捕获到初始化接口:
它的响应中包含:
收银台页面直接使用 pendingPayAmount 显示金额。请求链表明,账单页提交了 800,后端随后复用了绑定完整账单金额的旧支付单。

用 jq 删除 serialNum 的实验

为了验证旧流水号的作用,我在 billLockPay 请求上添加了临时 JSON Body Rewrite:
Surge 捕获到修改后的请求已经没有 serialNum。接口返回业务成功状态,响应中的结果为:
serialNum 同时用于锁定支付单和生成收银台订单。删除字段后,服务端没有生成可用的收银台链接。后续刷新 getBillDetail,接口仍然返回原来的过期流水号。

从请求中找到取消旧支付单的流程

继续检查账单页请求和前端逻辑后,确认页面在存在 payingDetail.serialNum 时会显示“取消本次支付”。这个操作调用:
它负责释放旧支付单。最终操作顺序为:
  1. 进入对应的房租账单。
  1. 点击“取消本次支付”,释放旧支付单和旧流水号。
  1. 刷新账单详情,确认支付中状态已经消失。
  1. 输入自定义金额 800 元。
  1. 再次提交并进入收银台。
  1. 核对收银台显示 800 元后,手动完成付款。
取消旧支付单后,billLockPay800 元创建了新的支付单,新的收银台初始化响应也返回对应金额。

排查结论

Surge 抓包确认了两段独立状态。getBillDetail 返回 allow=false,前端因此关闭自定义金额入口;过期的 payingDetail.serialNum 仍然绑定原来的完整金额支付单,后端继续复用旧收银台订单。
临时响应 Rewrite 将 allow 改为 true,解决了按钮状态。账单页的“取消本次支付”释放旧流水号,随后提交 800 元,解决了收银台金额复用。

注意事项

  • 这是一份针对本人账户和当次账单的排障记录,接口结构可能随贝壳版本变化。
  • 每次进入收银台都要人工核对金额,确认 pendingPayAmount 与输入金额一致。
  • price 需要满足接口返回的 miniPay,并低于支付渠道的单笔限额。
  • 调试完成后关闭临时 Rewrite 规则,避免影响后续账单请求。
  • 抓包内容包含 Cookie、令牌和订单标识,导出或分享文档前应完成脱敏。
Loading...

© Borui 2021-2026