news 2026/10/28 21:19:22

客服退款重试:幂等键必须与业务参数一起校验

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
客服退款重试:幂等键必须与业务参数一起校验

用户点击了两次、工具超时后自动重试、模型又发了一次同样请求,都可能让一笔售后动作被执行多次。校验金额正确,并不能解决重复执行。

一次请求只能有一个业务含义

幂等键应绑定可信主体、对象和关键参数。相同键携带不同金额时不能返回一个看似成功的旧结果,更不能重新执行。查询旧请求与插入新请求需要事务或等价的原子机制。

模型生成的请求编号不应是唯一依据。会话与业务服务可以分配稳定编号,重试继续使用它。若下游支付调用结果未知,先查询交易状态,不能直接再打款。

10月5日Google Research讨论了动作的上下文。这里的上下文还包括这项动作是否已经发生:同一句合法指令重复执行,结果也可能不再合适。

两张同一请求卡只产生一个结果;冲突参数必须拒绝,不进入“再试一次”的路径。

用事务演示幂等占位

以下是可离线运行的最小示例,使用Python标准库。输入均为教学构造,不连接业务系统。

import sqlite3 db = sqlite3.connect(":memory:", isolation_level=None) db.execute("CREATE TABLE requests (id TEXT PRIMARY KEY, amount INTEGER NOT NULL)") def reserve(key, amount): if type(amount) is not int or amount <= 0: raise ValueError("bad amount") db.execute("BEGIN IMMEDIATE") try: old = db.execute("SELECT amount FROM requests WHERE id=?", (key,)).fetchone() if old and old[0] != amount: raise ValueError("idempotency conflict") if not old: db.execute("INSERT INTO requests VALUES (?,?)", (key, amount)) db.execute("COMMIT") return "REPLAY" if old else "RESERVED" except Exception: db.execute("ROLLBACK") raise assert reserve("r-1", 100) == "RESERVED" assert reserve("r-1", 100) == "REPLAY" try: reserve("r-1", 200) except ValueError: pass else: raise AssertionError("conflict accepted") assert db.execute("SELECT COUNT(*) FROM requests").fetchone()[0] == 1 db.close() print("reservation/replay/conflict cases passed; no payment made")

两张同一请求卡只产生一个结果;冲突参数必须拒绝,不进入“再试一次”的路径。

本例仅在内存SQLite中做占位,没有扣款、退款或跨服务事务。真实交易需要处理请求已提交但响应丢失的未知状态。

把未知结果列为单独状态

不要把超时混进失败:失败可以被确认,超时只说明没有按时收到答复。记录下游交易号并查询,必要时进入人工处理,才能避免重复资金动作。

并发多连接、真实支付回执、数据库故障和灾难恢复均未测试。这个小例子验证的是唯一键和参数一致性,不是生产资金安全。

参考资料

  • Google contextual security
  • MCP authorization
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/28 21:18:36

智慧交通大脑:数字孪生与智能决策在大型枢纽的应用

1. 项目背景与核心价值大型综合交通枢纽作为城市交通网络的神经中枢&#xff0c;每天承载着数十万甚至上百万的客流吞吐量。我曾在某省会城市高铁站改造项目中亲历过这样的场景&#xff1a;早高峰时段&#xff0c;地铁、公交、出租车、网约车等多种交通方式集中到达&#xff0c…

作者头像 李华
网站建设 2026/10/28 21:17:27

如何把工作做到无可挑剔:从“不犯错”到可复制的交付标准

“impeccable”这个词&#xff0c;我第一次认真对待它&#xff0c;是在一次被否掉的汇报之后。当时我连续加班做了几十页PPT&#xff0c;自认为万无一失&#xff0c;可总监浏览完只问了一句&#xff1a;“第七页那个数据是哪来的&#xff1f;你标了吗&#xff1f;”我答不上来。…

作者头像 李华
网站建设 2026/10/28 21:10:39

T3 Stack 模板 t3code 全解析:类型安全全栈开发实战

第一次看到t3code这个项目名&#xff0c;我第一反应是&#xff1a;这又是一套 T3 Stack 模板吧。但真正把它跑起来之后&#xff0c;我意识到它并不是换了个名字的老套路。T3 Stack 这几年讨论度一直不低&#xff0c;核心就是拿 TypeScript 当底座&#xff0c;用 Next.js 扛应用…

作者头像 李华
网站建设 2026/10/28 21:10:38

AES加密算法工程实践:分组模式、密钥管理与GCM落地避坑

上周有个做后端的朋友半夜发消息过来&#xff0c;说他用 AES 加密的配置文件换台机器就解不开了&#xff0c;同一份代码、同一份密文&#xff0c;在新环境里直接抛InvalidTag。我让他把密钥的读取方式贴出来&#xff0c;果然是配置文件里写了个带引号的字符串&#xff0c;本土环…

作者头像 李华
网站建设 2026/10/28 21:10:37

ECC多义词拆解:椭圆曲线加密、P-384证书验证与OpenSSL实操

你输入“ECC”这三个字母&#xff0c;搜索引擎会同时跳出三种血缘完全不同的信息&#xff1a;一种是椭圆曲线密码学&#xff08;Elliptic Curve Cryptography&#xff09;的算法文档&#xff0c;一种是企业证书里常见的长名字“Trustwave Global ECC P384 Certification Author…

作者头像 李华