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-11 10:05:24 +08:00
2026-09-11 10:05:24 +08:00
2026-09-11 10:05:24 +08:00
2026-09-11 10:05:24 +08:00
2026-09-10 22:10:29 +08:00
2026-09-11 03:18:00 +08:00
2026-09-11 10:05:24 +08:00
2026-09-11 15:57:09 +08:00
2026-09-11 14:19:23 +08:00
2026-09-11 17:29:54 +08:00
2026-09-15 10:42:29 +08:00
2026-09-15 10:42:29 +08:00
2026-09-11 10:05:24 +08:00
2026-09-11 16:42:05 +08:00
2026-09-13 17:23:24 +08:00
2026-09-13 17:23:24 +08:00
2026-09-10 21:17:42 +08:00
2026-09-13 17:23:24 +08:00
2026-09-23 01:24:59 +08:00
2026-09-23 01:24:59 +08:00
2026-09-15 15:10:45 +08:00
2026-09-15 15:10:45 +08:00
2026-09-13 03:40:47 +08:00
2026-09-10 16:41:58 +08:00
2026-09-10 16:41:58 +08:00
2026-09-10 16:41:58 +08:00
2026-09-10 16:41:58 +08:00
2026-09-10 16:41:58 +08:00
2026-09-12 09:06:33 -04:00
2026-09-12 09:06:33 -04:00
2026-09-10 16:41:58 +08:00
2026-09-10 22:10:29 +08:00
2026-09-10 22:10:29 +08:00
2026-09-11 15:57:09 +08:00
2026-09-08 20:42:45 +08:00
2026-09-09 20:02:25 +08:00
2026-09-09 20:02:25 +08:00
2026-09-09 20:02:25 +08:00
2026-09-11 10:05:24 +08:00
2026-09-12 15:30:43 +08:00
2026-09-11 10:05:24 +08:00
2026-09-11 10:05:24 +08:00
2026-09-11 10:05:24 +08:00
2026-09-17 01:22:22 +08:00
2026-09-11 10:05:24 +08:00
2026-09-11 10:05:24 +08:00
2026-09-10 22:10:29 +08:00
2026-09-11 16:42:05 +08:00
2026-09-11 19:19:40 +08:00
2026-09-10 15:48:17 +08:00
2026-09-11 18:44:41 +08:00
2026-09-10 15:48:17 +08:00
2026-09-10 15:48:17 +08:00
2026-09-11 18:44:41 +08:00
2026-09-10 22:10:29 +08:00
2026-09-11 18:44:41 +08:00
2026-09-10 15:48:17 +08:00
2026-09-10 02:59:15 +08:00
2026-09-10 02:59:15 +08:00
2026-09-15 16:50:46 +08:00
2026-09-11 17:06:01 +08:00
2026-09-11 17:06:01 +08:00
2026-09-11 17:06:01 +08:00
2026-09-11 19:19:40 +08:00
2026-09-08 20:47:07 +08:00
2026-09-08 20:47:07 +08:00
2026-09-13 11:49:03 +08:00
2026-09-13 11:49:03 +08:00
2026-09-11 15:57:09 +08:00
2026-09-08 20:42:45 +08:00
2026-09-13 10:41:47 +08:00
2026-09-13 10:41:47 +08:00
2026-09-13 10:41:47 +08:00
2026-09-13 10:41:47 +08:00
2026-09-13 10:41:47 +08:00
2026-09-08 20:46:07 +08:00
2026-09-08 20:46:07 +08:00
2026-09-12 09:06:33 -04:00
2026-09-12 09:03:52 -04:00
2026-09-15 16:17:37 +08:00
2026-09-16 16:11:43 +08:00
2026-09-16 16:11:43 +08:00
2026-09-11 21:56:25 -07:00
2026-09-10 03:18:31 +08:00
2026-09-11 21:56:25 -07:00
2026-09-16 06:15:31 +00:00
2026-09-16 06:15:31 +00:00
2026-09-15 10:42:29 +08:00
2026-09-14 11:45:53 +08:00
2026-09-14 11:45:53 +08:00
2026-09-14 11:45:53 +08:00
2026-09-11 21:16:12 +08:00
2026-09-11 21:16:12 +08:00
2026-09-11 10:05:24 +08:00
2026-09-11 10:05:24 +08:00
2026-09-16 16:11:43 +08:00
2026-09-11 15:39:13 +08:00
2026-09-11 15:39:13 +08:00
2026-09-11 15:39:13 +08:00
2026-09-11 21:16:12 +08:00
2026-09-08 20:47:25 +08:00
2026-09-11 15:39:13 +08:00
2026-09-11 15:39:13 +08:00
2026-09-11 15:07:43 +08:00
2026-09-11 10:05:24 +08:00
2026-09-11 16:30:32 +08:00
2026-09-17 01:22:22 +08:00
2026-09-15 18:44:50 +08:00
2026-09-11 10:05:24 +08:00
2026-09-12 09:06:33 -04:00
2026-09-15 18:44:50 +08:00
2026-09-11 17:29:54 +08:00
2026-09-11 17:29:54 +08:00
2026-09-10 22:10:29 +08:00
2026-09-11 15:57:09 +08:00
2026-09-11 15:57:09 +08:00
2026-09-11 16:30:32 +08:00
2026-09-11 16:30:32 +08:00
2026-09-11 15:57:09 +08:00
2026-09-11 16:44:56 +08:00
2026-09-11 16:30:32 +08:00
2026-09-11 15:57:09 +08:00
2026-09-11 16:30:32 +08:00
2026-09-11 15:39:13 +08:00
2026-09-15 10:42:29 +08:00
2026-09-15 10:42:29 +08:00
2026-09-11 03:18:00 +08:00
2026-09-11 03:18:00 +08:00
2026-09-13 07:13:31 +08:00
2026-09-11 15:39:13 +08:00
2026-09-11 15:39:13 +08:00
2026-09-11 18:10:15 +08:00
2026-09-11 18:10:15 +08:00
2026-09-14 11:46:41 +08:00
2026-09-14 11:35:03 +08:00
2026-09-14 11:35:03 +08:00
2026-09-11 15:57:09 +08:00
2026-09-10 03:18:31 +08:00
2026-09-08 20:46:07 +08:00
2026-09-10 20:35:53 +08:00
2026-09-11 13:37:59 +08:00
2026-09-11 13:37:59 +08:00
2026-09-11 10:25:50 +08:00
2026-09-10 20:35:53 +08:00
2026-09-11 13:56:52 +08:00
2026-09-10 20:35:53 +08:00
2026-09-11 10:25:50 +08:00
2026-09-11 11:36:29 +08:00
2026-09-11 13:56:52 +08:00
2026-09-14 11:45:53 +08:00
2026-09-10 20:35:53 +08:00
2026-09-12 20:13:03 +08:00
2026-09-12 20:13:03 +08:00
2026-09-11 13:37:59 +08:00
2026-09-11 13:37:59 +08:00
2026-09-11 10:05:24 +08:00
2026-09-11 10:05:24 +08:00
2026-09-10 21:13:17 +08:00
2026-09-08 20:43:54 +08:00
2026-09-10 02:59:15 +08:00
2026-09-11 14:51:34 +08:00
2026-09-11 14:51:34 +08:00
2026-09-23 01:24:59 +08:00
2026-09-09 01:49:32 +08:00
2026-09-11 15:57:49 +08:00
2026-09-11 10:05:24 +08:00
2026-09-13 10:41:47 +08:00
2026-09-13 10:41:47 +08:00
2026-09-11 15:57:09 +08:00
2026-09-13 10:41:47 +08:00
2026-09-16 13:19:15 +08:00
2026-09-11 10:05:24 +08:00
2026-09-11 10:05:24 +08:00
2026-09-11 21:16:12 +08:00
2026-09-11 00:50:17 +08:00
2026-09-11 00:50:17 +08:00
2026-09-11 00:50:17 +08:00
2026-09-10 16:41:58 +08:00
2026-09-11 00:50:17 +08:00
2026-09-11 21:16:12 +08:00
2026-09-13 12:33:35 +08:00
2026-09-13 12:33:35 +08:00
2026-09-13 11:49:03 +08:00
2026-09-13 12:33:35 +08:00
2026-09-13 12:33:35 +08:00
2026-09-13 03:45:12 +08:00
2026-09-13 03:40:47 +08:00
2026-09-15 10:00:26 -04:00
2026-09-11 10:05:24 +08:00
2026-09-11 10:05:24 +08:00
2026-09-11 21:56:25 -07:00
2026-09-10 16:41:58 +08:00
2026-09-10 16:41:58 +08:00
2026-09-13 10:41:47 +08:00