Zion通过内置幂等机制防止重复支付,但需正确配置:引入zion-spring-boot-starter-idempotent模块、添加@EnableIdempotent注解、确保@Idempotent键表达式健壮(避免空值)、Redis可用,且前端与网关不绕过Zion防护链路。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

用函子Zion处理重复支付,不会扣两次——它底层已内置幂等性防护机制,但前提是正确配置幂等键且前端不绕过防重逻辑。
确认Zion是否启用幂等拦截器
打开项目依赖配置文件(如pom.xml或build.gradle),检查是否引入了zion-spring-boot-starter-idempotent模块。若仅引入core或web模块,【幂等切面不会生效】。
在启动类或配置类上添加@EnableIdempotent注解;未加该注解时,所有@Idempotent方法将被完全忽略。
验证幂等键是否能稳定生成
方法一:检查@Idempotent注解中的key表达式
例如 @Idempotent(key = "#payReq.orderId + '_' + #payReq.channel") —— 若payReq为null,整个SpEL表达式求值失败,返回空字符串,导致幂等键为空,Zion日志会输出“幂等键为空,直接放行”,请求直通业务逻辑。
方法二:在Controller入参处加@Validated并确保payReq非空,或改用#root.args[0].orderId这类更健壮的写法。
注意:Zion默认使用Redis存储幂等记录,若Redis连接异常或超时,当前请求会被放行,但会记录WARN日志“idempotent cache unavailable”,【这不是静默失败,而是明确降级】。
确保前端未跳过Zion防护链路
第一步:确认支付按钮在提交后立即置灰,且禁用JavaScript重复触发submit事件。
第二步:检查是否所有支付入口(H5、小程序、APP内嵌WebView)都走同一套Zion网关代理;若APP直连订单服务绕过Zion网关,【这部分流量完全不受幂等保护】。
第三步:查看Nginx或API网关层是否有重试策略(如proxy_next_upstream error timeout),若开启且重试间隔短于Zion的幂等窗口期(默认60秒),可能造成重复请求在窗口期内抵达,被判定为不同请求。

















