用 Surge 启用贝壳自定义房租金额支付问题
问题背景
我使用的 Pulse 卡在云闪付渠道有单笔 1,000 元的限额,当期房租账单总额超过该限额。为了完成支付,需要在贝壳账单页启用自定义金额,把房租拆成单笔不超过 1,000 元的金额支付。
实际遇到两个问题:自定义支付金额按钮无法点击;按钮启用后输入
800 元,进入收银台又恢复为完整账单金额。整个排查过程都通过 Surge 捕获本人手机上的请求、查看 JSON Body,并用临时 Rewrite 验证字段作用。用 Surge 建立排障环境
手机上的 Surge 开启了远程控制、MITM 和 HTTP 捕获。电脑通过
surge-cli 连接手机:排查时确认以下功能处于开启状态:
如果 HTTP 捕获会话已经结束,可以重新打开:
随后订阅实时请求,在手机上重新进入账单页并复现问题:
实时记录里出现了三条关键请求:
阶段 | 接口 | Surge 中观察到的字段 |
加载账单 | GET /chuzu/api/trusteeship/getBillDetail | allow、miniPay、payingDetail.serialNum |
提交支付金额 | POST /chuzu/api/trusteeship/billLockPay | 请求中的 price、serialNum,响应中的 payUrl |
初始化收银台 | GET /ecashier/v2/main/init/{rembId} | pendingPayAmount |
通过
dump request 可以查看最近请求及其 ID:再根据请求 ID 读取捕获的请求体或响应体:
在 getBillDetail 中开启自定义金额
账单详情接口为:
Surge 捕获的响应显示,
shouldPayInfo.allow 控制前端的自定义支付金额按钮。原始值为 false 时,按钮无法点击。于是给这个响应添加 JSON Body Rewrite:改写后重新进入账单页,自定义金额按钮已经可以点击。响应中的
miniPay 为 500,因此本次输入的 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 时会显示“取消本次支付”。这个操作调用:它负责释放旧支付单。最终操作顺序为:
- 进入对应的房租账单。
- 点击“取消本次支付”,释放旧支付单和旧流水号。
- 刷新账单详情,确认支付中状态已经消失。
- 输入自定义金额
800元。
- 再次提交并进入收银台。
- 核对收银台显示
800元后,手动完成付款。
取消旧支付单后,
billLockPay 按 800 元创建了新的支付单,新的收银台初始化响应也返回对应金额。排查结论
Surge 抓包确认了两段独立状态。
getBillDetail 返回 allow=false,前端因此关闭自定义金额入口;过期的 payingDetail.serialNum 仍然绑定原来的完整金额支付单,后端继续复用旧收银台订单。临时响应 Rewrite 将
allow 改为 true,解决了按钮状态。账单页的“取消本次支付”释放旧流水号,随后提交 800 元,解决了收银台金额复用。注意事项
- 这是一份针对本人账户和当次账单的排障记录,接口结构可能随贝壳版本变化。
- 每次进入收银台都要人工核对金额,确认
pendingPayAmount与输入金额一致。
price需要满足接口返回的miniPay,并低于支付渠道的单笔限额。
- 调试完成后关闭临时 Rewrite 规则,避免影响后续账单请求。
- 抓包内容包含 Cookie、令牌和订单标识,导出或分享文档前应完成脱敏。
Loading...