feat: add card rotation, customer lookup, and concurrent eligibility checks

Add encrypted card pool management, persisted card and outbound rotation, and per-card decline cooldowns. Improve customer and redemption-code lookup, recovery controls, and filtering; rebuild frontend assets and refresh mock screenshots.

Give read-only eligibility checks four independent slots so payment processing no longer blocks them. Cover concurrency, slot cleanup, card rotation, and lookup behavior with tests.
This commit is contained in:
mizorewww committed 2026-10-04 11:44:38 +08:00
1 parent 92f09423c3
commit 83ac3f00ae
47 files changed
+3033 -501

No files matched your search

+14 -3
View File
@@ -75,14 +75,25 @@ PY
包含 selector、urltest 等分组的订阅须先移除这些元素,仅保留独立代理节点。运行程序不自动拉取订阅,避免未经核验的订阅更新改变付款路径。
## 节点选择和订单绑定
## 卡池轮换、节点选择和订单绑定
付款卡保存在加密的 `cards` 数组(兼容旧的单张 `card` 记录),Stripe 付款按「卡 × 节点」组合随机轮换:
- 每 3 个连续付款订单使用同一组合(不按客户,按提交顺序)。第 4 个订单重新随机选择卡和可用节点;同一张卡不会连续被选为相邻组合(可用卡足够时)。
- 任一订单被银行拒付后,当前组合立即作废;下一次提交(包括管理员补单)自动换到另一张卡和一个可用节点。被拒的那张卡进入 30 分钟冷却,期间不再参与轮换;其他卡不够用时会自动回退重新启用。普通拒付不再因累计次数暂停全站,也不影响其他组合。
- 只有支付方明确返回 `do_not_try_again` 时才永久封锁对应那张卡;其余卡继续轮换,全部卡都被永久封锁才暂停全站,可用 `xgift cards unblock` 显式解除(同时清除拒绝冷却)。
- 旧单卡时代的已拒订单没有卡指纹记录,首次补单会按旧 `card` 记录给对应卡补上冷却,避免用旧卡反复重试。
- 补单与普通付款共用同一套轮换逻辑;已被拒订单不会重复使用原卡重试,而未提交付款的订单重复尝试会继续沿用已绑定的组合,不重复占用轮换名额。
- 卡池变化(增删卡)会形成新的集合指纹,自动重置支付保护状态和后台补单预览;仅轮换不会改变指纹。CLI 用 `xgift cards list|add|remove|unblock|rotate` 管理。
节点选择与旧版一致:
- 新绑定订单首次进入 Stripe 流程时,从未冷却的池内节点随机选择,`direct` 与代理均可参与。若有不同 `server` 的节点,会避开上一新订单的服务器;如果全部同服务器,则尽量避开上一节点。
- 一次批量补单中的不同客户分别选择。随机选择不保证各节点次数相等;不同协议节点也可能共享同一公网 IP。
- 选择发生在第一个 Stripe 请求前,所以“仅生成链接”中的 Stripe 核验也可能建立节点绑定。
- `stripe-route:<recipient_id>` 保存加密的节点配置快照、节点指纹和时间,正常情况下持续沿用。节点因连接故障进入冷却后,可原子归档到 `stripe-route-history:*` 并切换到可用出口。后台显示 `direct` 或 `node-` 加指纹前 12 位,完整凭据不返回网页。
- `stripe-route:<recipient_id>` 保存加密的节点配置快照、节点指纹、卡指纹和时间,正常情况下持续沿用。节点因连接故障进入冷却后,可原子归档到 `stripe-route-history:*` 并切换到可用出口;卡指纹保持不变。后台显示 `direct` 或 `node-` 加指纹前 12 位,完整凭据不返回网页。
- 以前没有节点绑定的待处理订单,在功能启用后首次访问 Stripe 时建立绑定。绑定不代表已付款。
- 明确银行卡拒付不会自动换节点重付。金额校验、幂等、付款间隔和支付方禁止重试指令继续生效;普通拒付不再因累计两次而触发全站暂停。
- 明确银行卡拒付不会在同一个组合上重复扣款。金额校验、幂等、付款间隔和支付方禁止重试指令继续生效。
## 网络重试与 6 小时冷却
Binary file not shown.

Before

Width:  |  Height:  |  Size: 215 KiB

After

Width:  |  Height:  |  Size: 238 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 214 KiB

After

Width:  |  Height:  |  Size: 238 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 64 KiB

After

Width:  |  Height:  |  Size: 93 KiB