Files
biz-api-cloud-zax/pjcloud-wallet/docs/checkout-transfer.md
T
2026-11-10 21:58:15 +08:00

92 lines
9.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 酒店结账全部结算接入
## 启用和发布
全部结算直接启用,预检、受理及后台执行由业务流程和权限控制。完成迁移、第三方及钱包全部实例部署、前端和角色授权后即可使用。
酒店结账结果默认回传 `pjcloud-wallet-biz`,thirdparty 已内置 `hotel-checkout` 对应的钱包接收目标。下面的配置用于覆盖部署中的服务名。当前支付宝付款应用使用 `ali-pay-config` 的证书配置。
```yaml
app-plus:
transfer:
notify-targets:
hotel-checkout:
service-id: pjcloud-wallet-biz
```
覆盖服务名时按实际注册名核对,显式空值或非法地址会阻止付款预检。更新内置目标解析代码后须重新部署并启动 thirdparty,钱包及前端使用已更新的结账版本。预检通过后显示确认选项及确认转账按钮,操作员确认后才异步受理真实付款。转账场景固定为“业务结算”,背景类型为“结算款项名称”,内容包含原酒店结账单号。先在支付宝完成转账产品签约、场景申报和 `alipay.fund.trans.order.changed` 应用网关订阅。
发布前先核实历史登记清单。停止钱包旧实例和受理任务、隔离回调写入后,完成外部一致性备份及迁移,再发布钱包与前端、核对权限并恢复任务。第三方通知增加付款 AppID 快照,可先发布 thirdparty,钱包兼容旧通知时通过受保护查询核实应用。钱包转账扫描统一由 sys_job 触发,初始每5秒最多100条,保留4个Worker和120秒数据库租约。第三方提交、查单、通知任务同样通过任务管理页维护。
首次接入需要 `db/20261110_add_mch_checkout_bill_transfer.sql` 创建批次与付款尝试表。本轮新增 `db/20261110_mch_checkout_alipay_only.sql`,按独立阶段核实历史数据、恢复明确误登记、保留审计依据并删除商户表7个登记字段及其约束/索引。脚本编写和数据库执行分别安排。
## 历史数据迁移与发布
1. 在同一钱包库连接执行新脚本的默认 `PREFLIGHT`,导出历史清单。`HCO2120097438306938882` 是首批待核实账单,脚本未预置任何未实付结论。
2. 停止全部旧钱包实例及受理任务,隔离第三方回调写入,完成外部一致性备份。写入阶段还会保留账单、商户、订单、占用、事件、批次、付款尝试七张首次只读副本。
3. 财务确认未通过其他渠道实付后,在脚本的 `tmp_checkout_verified_unpaid` 中逐明细填写租户、明细ID、当前版本、原请求号、应付分金额、核实人及依据。同一连接设置阶段为 `REPAIR`,并将脚本列明的停机及备份确认变量置1后执行。
4. 核对恢复的待付款状态、递增版本、订单复核调度和 `MANUAL_PAYMENT_RESTORED` 审计。成功、在途、资金异常、版本或请求号不匹配均拒绝恢复。同阶段重跑保持幂等。
5. 所有历史已付款均已核实后执行 `MIGRATE`。已实付或未核实的手工登记仍会阻止删列,需单独完成资金对账。原依据保存在事件与备份中,7列和依赖在一个原子ALTER中移除。
6. 发布新钱包与前端,手动退役 `wallet_mchCheckoutBill_pay`,授权 `wallet_mchCheckoutBill_transfer`。完成核对后恢复任务,操作员重新预览并确认真实转账。
迁移后重复执行直接返回已完成。旧钱包代码依赖已删除列,恢复旧版本需先在停机窗口按备份制定对应数据回退方案。
## 默认收款配置
使用商户当前支付宝支付配置的唯一默认关系。默认关系中的接收方类型、完整标识及可选实名作为转账依据。关闭分账时仍可维护收款字段,实际转账前统一校验。
| 关系接收方类型 | 转账身份 | 必要条件 |
| --- | --- | --- |
| `userId` | `ALIPAY_USER_ID` | 有效接收方标识 |
| `openId` | `ALIPAY_OPEN_ID` | 有效标识,关系所属应用与付款应用一致 |
| `loginName` | `ALIPAY_LOGON_ID` | 有效标识及收款实名 |
| `cardAliasNo` | 预检异常 | 改配当前产品支持的身份 |
原始账号仅通过受保护的Feign获取,在钱包和第三方各自使用项目统一加密器保存固定指令。管理端展示脱敏账号及实名。分账开关、绑定结果和分佣比例不参与转账资格判断。
## 付款及恢复规则
- “全部结算”读取整张账单所有待付款明细,商户行“支付宝转账”仅选择该商户。两个入口都校验整张账单的历史数据权限。预检令牌属于当前用户,有效十分钟,提交前重新读取酒店订单及收款配置。
- 已付款、已作废及无订单明细自动跳过。有订单且应付为零的商户记录确认结清事件。
- 正金额须在10~10000000000分之间。低于最低金额及超过单笔上限时阻止本次付款范围提交。0.01~0.09元保留待付款,可经确认作废原明细、调整抽成配置后重新结账。
- 同一账单批次的请求号和预检令牌在超时重试时保持原值。已受理结果优先从数据库恢复,预检缓存到期后也可恢复原批次。
- 全量参与名单通过后原子保存付款授权。真实渠道执行允许部分成功。转账中明细使用 `PAYING`,待付款汇总包含这一状态。
- 仅支付宝SUCCESS且金额、业务归属、原指令和付款AppID核对一致才回写已付。实付金额只读汇总成功付款指令,重复查询和一对多展示不会增加实付。付款时间采用渠道事实,未回传时显示“待渠道核实”,后台安排原单复核补齐。
- 明确失败释放当前付款尝试。再次付款先同步核对原单,再重新预检并由操作员确认。原单被明确拒绝且渠道确认无单时允许重新授权,其他未知结果继续保留转账中。
- 资金终态与订单差异分别记录。迟到成功按原付款尝试落账,存在后续付款尝试或终态冲突时冻结新付款并记录审计。
- 原任务失败退避最长5分钟,累计100次领取后暂停任务,保留原资金状态。在详情中“核对并恢复原单”后继续同号执行。
- 详情每5秒更新进度,跨批次尚有未收敛付款也持续刷新。详情提供历史批次分页查询、逐商户最近尝试和第三方转账记录入口。等待第三方受理时显示“待受理”,不提前显示已付款。
## 历史误登记重新转账
商户付款明细在“历史手工PAY审计完整、请求号与原应付相符、没有任何平台付款尝试”时显示“核对并重新转账”。原账单及订单占用持续保留,确认后在同一事务中追加纠正事件、创建首笔付款指令并将商户改为PAYING,只有渠道成功才重新记为PAID。
预检、确认和提交均绑定指定商户、账单/商户版本及原PAY事件。直接API提交也必须明确提供 `legacyPaymentConfirmedUnpaid=true`。这一确认只适用于旧登记,普通结算默认false并沿用原请求摘要。
没有平台指令时无法按转账号向支付宝查单,界面明确显示该事实,并要求操作员确认没有其他渠道实付。已有失败指令继续通过原单Feign同步查询,成功、在途、未知结果或查询异常都会阻止生成新的付款。重复点击及超时重试沿用原请求,原账本锁和版本检查防止并发纠正。
本功能沿用 `wallet_mchCheckoutBill_transfer` 权限与完整历史账单数据权限,部署钱包代码并刷新前端后使用。数据库结构沿用现有账单与转账表。
## 手工配置权限
| 名称 | 类型 | 父级菜单及真实ID | 权限标识 | 页面路由 | 组件路径 |
| --- | --- | --- | --- | --- | --- |
| 支付宝转账(整单及单商户) | 按钮 | 商户结账记录,ID待确认 | `wallet_mchCheckoutBill_transfer` | 沿用商户结账记录菜单 | `mch/checkout/record/index` |
已有 `wallet_mchCheckoutBill_view` 负责查看历史转账进度。新的转账权限控制预检、真实付款受理和业务侧原单恢复。每个入口均校验整张账单完整历史归属权限。
## 验证边界
开发阶段使用源码语法、接口及状态路径核对。已补充单商户范围、付款应用与指令核对、成功资金合计、跨批次轮询、历史迟到成功冻结、迁移白名单及重复删列的针对性回归源码。测试执行、隔离数据库并发验证和受控支付宝联调留在集中验证阶段。
集中验证时执行钱包与第三方测试及编译、前端检查及构建,使用隔离MySQL验证请求唯一约束、事务回滚、租约恢复及单商户/整单转账与作废竞争。真实支付宝联调与数据库迁移执行单独安排。
隔离数据库用例读取 `CHECKOUT_BILL_TEST_JDBC_URL`、`CHECKOUT_BILL_TEST_JDBC_USER`、`CHECKOUT_BILL_TEST_JDBC_PASSWORD`,数据库名必须以 `_checkout_bill_test` 结尾,只创建和清理随机后缀测试表。
## 统一任务管理
钱包结账转账受理扫描与订单复核统一由 `sys_job` 触发,页面入口为 `/tools/job-manage/index`。初始任务分别为“酒店结账转账受理扫描”和“酒店结账订单复核”,执行 Bean 为 `mchCheckoutTask`,无参方法分别为 `dispatchTransfers`、`recheckOrders`。前者初始每5秒,后者初始每分钟,周期和启停由页面维护。
先停止旧钱包与 Quartz 实例,执行任务库脚本 `db/20261110_migrate_business_jobs_to_sys_job.sql`,再部署钱包和 Quartz。脚本仅包含这两项钱包结账任务及三项支付宝转账任务。钱包任务内部沿用跨租户扫描,只保留一份调度。重启钱包仅恢复执行入口,Quartz 需加载对应 `sys_job` 行后才会周期扫描。单轮调度成功表示业务服务接受执行,资金结果继续查看逐商户付款尝试及第三方转账流水。