feeeei
c19204289d
fix(affiliate): 线下提现登记按 Idempotency-Key 幂等
登记请求只有金额,提交成功但响应丢失时,管理员重试会把同一笔站外打款再扣
一次返利额度。现在一次登记由 Idempotency-Key 标识,数据库在同一事务内以唯一
约束去重:
- user_affiliate_ledger 新增 operation_id(幂等键派生的 SHA-256)与部分唯一
索引(迁移 240);接口要求 Idempotency-Key,缺失或非法返回 400
- 事务内先以 operation_id 写入占位流水,再解冻、扣减并补写额度快照;同键
重试返回首笔流水的结果并带 X-Idempotency-Replayed,不重复扣减;同键换了
用户或金额返回 409 IDEMPOTENCY_KEY_CONFLICT;额度不足时占位随事务回滚
- 并发的同键请求在唯一索引上等待先到者:先到者提交则返回同一条流水,回滚
则自行登记
- 弹窗在网络错误、超时、5xx、408/409 时锁定用户与金额,重试沿用同一请求与
幂等键;幂等键按管理员、用户、金额暂存于 sessionStorage,登记有确定结果后
释放
2026-09-23 01:24:59 +08:00
..
2026-09-23 01:24:59 +08:00
2026-09-11 16:34:46 +08:00
2026-08-09 22:42:51 +08:00
2026-08-09 22:42:51 +08:00
2026-09-05 16:05:17 +08:00
2026-09-23 01:24:59 +08:00
2026-08-09 15:53:40 +08:00
2026-08-24 12:02:53 +08:00
2026-09-07 10:11:07 +08:00
2026-09-07 10:11:07 +08:00
2026-09-05 16:05:17 +08:00
2026-08-18 04:14:15 +00:00
2026-08-30 09:28:40 +08:00
2026-08-30 09:28:40 +08:00
2026-09-08 18:50:06 +08:00
2026-09-02 20:16:57 +08:00
2026-09-03 12:48:02 +08:00
2026-09-03 12:48:02 +08:00
2026-09-11 10:05:24 +08:00
2026-09-11 10:05:24 +08:00
2026-08-20 18:16:38 -07:00
2026-08-20 18:16:38 -07:00
2026-08-25 15:10:52 +08:00
2026-09-03 12:48:02 +08:00
2026-09-11 16:42:05 +08:00
2026-09-08 19:12:37 +08:00
2026-09-08 19:12:37 +08:00
2026-09-15 16:50:46 +08:00
2026-09-10 15:57:17 +08:00
2026-09-10 22:10:29 +08:00
2026-08-13 07:49:19 +08:00
2026-09-15 16:50:46 +08:00
2026-09-15 16:50:46 +08:00
2026-09-15 16:50:46 +08:00
2026-08-13 08:38:10 +08:00
2026-08-20 09:50:23 -07:00
2026-09-05 20:25:08 +08:00
2026-08-07 16:29:57 +08:00
2026-09-05 20:25:08 +08:00
2026-08-24 09:03:37 +08:00
2026-09-08 13:37:53 +08:00
2026-09-08 13:37:53 +08:00
2026-09-01 15:18:30 +08:00
2026-09-01 15:18:30 +08:00
2026-08-19 23:13:40 -07:00
2026-09-09 12:48:57 +08:00
2026-09-03 10:51:12 +08:00
2026-08-31 21:04:29 +08:00
2026-09-07 19:44:03 +08:00
2026-09-05 19:58:47 +08:00
2026-09-03 11:39:23 +08:00
2026-09-03 10:51:12 +08:00
2026-09-11 15:39:13 +08:00
2026-08-14 18:18:53 +08:00
2026-08-14 18:18:53 +08:00
2026-08-20 22:01:20 -07:00
2026-09-06 20:38:17 +08:00
2026-09-05 15:32:29 +08:00
2026-09-08 20:42:45 +08:00
2026-09-11 16:42:05 +08:00
2026-08-19 18:51:21 +08:00
2026-09-05 16:05:17 +08:00
2026-09-11 15:57:09 +08:00
2026-08-20 18:16:38 -07:00
2026-08-19 04:40:32 +00:00
2026-08-19 04:40:32 +00:00
2026-09-07 18:33:39 +08:00
2026-09-10 15:57:17 +08:00
2026-08-14 16:23:52 +08:00
2026-09-07 17:58:20 +08:00
2026-08-20 22:01:20 -07:00
2026-09-04 10:14:29 +08:00
2026-08-28 13:17:43 +08:00
2026-08-17 19:45:07 +08:00
2026-08-27 21:50:53 +08:00
2026-08-13 08:37:57 +08:00
2026-08-13 08:37:57 +08:00
2026-08-20 22:01:20 -07:00
2026-09-10 02:59:15 +08:00
2026-09-10 02:59:15 +08:00
2026-08-19 23:13:40 -07:00
2026-09-16 13:19:15 +08:00
2026-09-16 13:19:15 +08:00
2026-08-19 09:03:37 -07:00
2026-08-19 09:03:37 -07:00
2026-08-11 11:56:46 +08:00
2026-08-11 11:56:46 +08:00
2026-09-11 00:50:17 +08:00
2026-09-14 11:45:53 +08:00
2026-09-14 11:45:53 +08:00
2026-08-28 23:32:11 +08:00
2026-08-28 23:32:11 +08:00
2026-08-07 17:58:23 +08:00
2026-08-19 23:13:40 -07:00
2026-09-06 08:10:41 +08:00