银行扣款了天塌了也要记下来——回调接口的原子记账设计
银行扣款了天塌了也要记下来——回调接口的原子记账设计文章目录银行扣款了天塌了也要记下来——回调接口的原子记账设计一、银行扣款和普通业务不一样二、异常分类不是所有失败都能一样处理三、BaoPanTimer的教训先判断是否已处理四、TRADE_LOG的思路不删数据插一条负数五、异常的优先级先落地再处理六、扣款序号 回执确认 对账三道防线七、银行扣款和医保结算的区别八、结语一、银行扣款和普通业务不一样普通的接口调用请求来了→处理→返回。失败了可以重试重试失败了可以告警告警了可以人工介入。整个过程是可逆的——在最终确认之前一切都可以回滚。银行扣款不一样。银行告诉你扣了150.36元这150.36元已经从参保人的银行卡里划走了。你不能跟银行说我这边出错了你把钱退回去——退钱要走退费流程不是回调失败就能自动撤销的。所以回调接口的设计原则不是成功了才记而是任何情况下都要记下来。二、异常分类不是所有失败都能一样处理银行回调过来的信息通常是一条报文批次号、扣款明细列表、总金额、回执时间。处理这条报文时可能遇到的异常异常类型场景能不能重试记不记账网络超时报文到了但响应没返回能银行会重发先记重试成功后状态改已确认金额不一致银行扣的金额和社保算的不一样不能要人工核对记标记待核对报文格式错误能读但字段对不上不能要人工核对记存原始报文错误原因数据库挂了处理到一半写不进去能恢复后重放记重放时判断是否已记重复回调银行发了两次不用处理查回执确认表已处理则跳过关键点除了重复回调可以跳过其余所有情况都必须先把原始报文存下来。存下来之后能不能自动处理、要不要人工核对——那是第二步的事。第一步不能丢数据。三、BaoPanTimer的教训先判断是否已处理银行回调不是每次都准时到。有时候网络通了报文才到有时候银行系统重发。社保系统里的BaoPanTimer就是干这个的——定时检查银行回执到了没没到就重发请求到了就处理。处理之前有一个铁律先查回执确认表判断这批数据是否已经处理过。银行的扣款报文里每笔都有唯一的扣款序号这个序号就是天然的幂等键——同一笔扣款不会重复入账。查回执确认表只是多一层保险序号匹配上了就跳过匹配不上才是新数据。四、TRADE_LOG的思路不删数据插一条负数银行的扣款记录入库后万一发现某笔扣错了——比如同一个人被扣了两次——怎么办不是delete。是插入一条金额取负的记录同时把原记录的 TRADE_LOG 标记为已冲正。原记录: batchNo20260521, personId10001, amount150.36 冲正记录: batchNo20260521, personId10001, amount-150.36 TRADE_LOG: 原记录状态3(已冲正)新记录冲正流水号为什么delete不行因为审计的时候审计员要看的不只是现在的余额是多少还要看这150.36是什么时候扣的、谁的卡、后来为什么退了。TRADE_LOG表不是给程序员用的——是给审计查账用的。银行对账单过来了社保这边给你一张清单每一笔扣款、每一笔冲正、每一条对账结果。差一分钱都能定位到具体哪笔记录。五、异常的优先级先落地再处理回到最初的场景——银行回调接口收到了扣款报文处理流程应该是这样的收到报文 ├── ① 原始报文写入日志表无论后续发生什么这步必须完成 │ 字段批次号、报文原文、接收时间、处理状态待处理 ├── ② 解析报文校验格式和金额 │ ├── 格式错误 → 日志表状态格式错误结束 │ └── 格式正确 → 继续 ├── ③ 查询回执确认表判断是否重复 │ ├── 已处理 → 日志表状态重复报文结束 │ └── 未处理 → 继续 ├── ④ 金额校验银行扣款金额 vs 社保应扣金额 │ ├── 一致 → 状态自动处理 │ └── 不一致 → 状态待人工核对结束 ├── ⑤ 写入扣款记录到业务表更新个人账户余额 └── ⑥ 回执确认表标记已处理每一步都可以失败但第①步不能失败。如果连第①步都失败了——数据库连不上、磁盘满了——那回调接口应该返回失败让银行重发。这和你之前的BaoPanTimer配合起来社保这边没收到就重发收到了就一定落地。六、扣款序号 回执确认 对账三道防线银行回调处理有三层保障第一层扣款序号。银行报文中每笔扣款有唯一序号入库时它就是主键。同一笔扣款银行重发了插入直接报主键冲突——物理上不可能重复入账。第二层回执确认表。比主键约束多一层业务语义——不仅知道这条数据见过了还知道这批数据整个处理完了。第三层每日对账。就算前两层都没拦住的异常对账会兜底。每天银行给社保发对账文件社保系统做两件事按批次对总数银行批次总金额 - 社保系统该批次已入账总金额 0不等就查差异按个体对明细把银行报文里的每笔扣款和社保系统里的入账记录逐条比对任何人被扣了社保没记、或者社保记了银行没扣都能定位到具体的人对账不是在自动化处理的链路里——它是异步的、离线的、独立的。正因为它不在处理链路里它才能作为最终兜底。前面的序号冲突、回执确认都是实时防御对账是事后校验。三道防线合在一起才敢说银行扣了的钱社保一定记了。七、银行扣款和医保结算的区别银行扣款记录的只是钱被划走了不涉及业务规则校验。医保结算复杂得多——账户余额够不够、统筹支付封顶了没有、大病补充怎么算——算错了一个比例就出财务事故。所以银行回调的记账是无条件记录医保结算的记账是规则校验后记录。前者是只要发生了就要记后者是满足条件才能记。但两者有一个共同点记下来就不能删只能冲正。这是TRADE_LOG设计贯穿所有资金类业务的根本原因——不管钱是怎么动的动了就要留痕。八、结语银行扣款回调接口的设计核心不是怎么写代码是**“异常情况下的数据不丢失”**。网络超时、金额不一致、数据库挂了、银行重发了——每一种情况都有一个最低要求原始报文必须先落地。落地了后面的事可以慢慢处理——格式错了人工修正金额不对人工核对重复了跳过。但没有落地这一步后面的所有处理都没有依据。财务对账的时候问这笔钱银行说扣了社保这边怎么没有你拿不出任何记录——这就是事故。

相关新闻

JSON数组解析全攻略:从基础概念到高性能实战

JSON数组解析全攻略:从基础概念到高性能实战

1. 项目概述:从“Json数组解析”说起 如果你是一名开发者,无论是前端、后端还是移动端,几乎每天都要和Json数据打交道。而Json数组,作为承载列表数据最普遍的结构,其解析的效率和正确性,直接关系到应用的稳…

2026/8/5 10:27:42 阅读更多 →
终极免费PlantUML在线编辑器:5分钟从代码到专业UML图

终极免费PlantUML在线编辑器:5分钟从代码到专业UML图

终极免费PlantUML在线编辑器:5分钟从代码到专业UML图 【免费下载链接】plantuml-editor PlantUML online demo client 项目地址: https://gitcode.com/gh_mirrors/pl/plantuml-editor 还在为绘制复杂的UML图而头疼吗?PlantUML在线编辑器为你带来了…

2026/8/5 10:27:42 阅读更多 →
天赐范式第125天:大模型自指的算子流解析——从“执行推理“到“反思推理“

天赐范式第125天:大模型自指的算子流解析——从“执行推理“到“反思推理“

天赐范式第125天:大模型自指的算子流解析——从"执行推理"到"反思推理"副标题:技术协议v0.1首次科技前沿实战——当LLM面对"这句话是假的"📌 本文是天赐范式系列第125天,前置阅读:第124…

2026/8/5 10:27:42 阅读更多 →

最新新闻

实用指南:如何让老旧电视重获新生 - MyTV-Android电视直播应用详解

实用指南:如何让老旧电视重获新生 - MyTV-Android电视直播应用详解

实用指南:如何让老旧电视重获新生 - MyTV-Android电视直播应用详解 【免费下载链接】mytv-android 使用Android原生开发的视频播放软件 项目地址: https://gitcode.com/gh_mirrors/my/mytv-android 你是否有一台老旧智能电视,因为系统版本太低无法…

2026/8/5 11:23:08 阅读更多 →
Mysql 内置函数

Mysql 内置函数

日期函数函数名称描述current_date()当前日期current_time()当前时间current_timestamp()当前时间戳date(datetime)返回 datetime 参数的日期部分date_add(date, interval d_value_type)在 date 中添加日期或时间interval 后的数值单位可以是:year minute second da…

2026/8/5 11:23:08 阅读更多 →
HTML网页效果图制作全流程与核心技巧

HTML网页效果图制作全流程与核心技巧

1. HTML网页效果图制作全流程解析作为一名从业十年的前端开发者,我经常需要将设计稿转化为HTML网页效果图。这个过程看似简单,实则包含许多容易被忽视的细节。今天我将分享从零开始制作专业级HTML效果图的完整工作流。效果图制作不同于最终网页开发&…

2026/8/5 11:23:08 阅读更多 →
OpenDRIVE路网导入Unity:Arc曲率、车道宽度与交叉口Mesh生成实战

OpenDRIVE路网导入Unity:Arc曲率、车道宽度与交叉口Mesh生成实战

1. 项目概述:从OpenDRIVE到Unity的“最后一公里”如果你正在做自动驾驶仿真、数字孪生城市或者高精地图的可视化,那么OpenDRIVE这个路网描述标准你一定不陌生。它就像一张精准的“施工蓝图”,用XML格式定义了道路的几何形状、车道连接关系、交…

2026/8/5 11:23:08 阅读更多 →
PDF 色彩保真工程实践【1】:聊聊 CMYK 色彩损失:为什么你的 PDF 图片“变色”了?

PDF 色彩保真工程实践【1】:聊聊 CMYK 色彩损失:为什么你的 PDF 图片“变色”了?

大家好,这是我这个系列的第 1 篇。我会用 C、福昕 PDF SDK、libtiff 和 zlib,从零做一个小工具:把带 ICC Profile 的 CMYK TIFF 图像写进 PDF,并通过数据校验证明 CMYK 采样值和 ICC Profile 内容没有被修改。整个过程会用 AI 辅助…

2026/8/5 11:23:08 阅读更多 →
Unity Playable Graph监控器:可视化调试动画与Timeline性能

Unity Playable Graph监控器:可视化调试动画与Timeline性能

1. 项目概述:为什么我们需要一个Playable Graph监控器?如果你在Unity里做过动画、Timeline或者Audio相关的开发,那你大概率已经和Playable API打过交道了。这东西是Unity底层用来管理各种可播放内容(动画、音频、脚本逻辑&#xf…

2026/8/5 11:22:08 阅读更多 →

日新闻

Java缓存框架:JetCache

Java缓存框架:JetCache

TOC 一、简介 JetCache 是一个 Java 缓存抽象框架,为不同的缓存解决方案提供了统一的使用方式。 它提供的注解比 Spring Cache 更加强大。 JetCache 的注解支持原生 TTL、两级缓存以及在分布式环境中的自动刷新功能,同时你也可以通过代码直接操作 Cach…

2026/8/5 0:00:43 阅读更多 →
AD 铺铜设置十字连接,过孔全连接,新版AD的简单设置

AD 铺铜设置十字连接,过孔全连接,新版AD的简单设置

需求:通孔焊盘 十字花;过孔 Via 实心直连;贴片焊盘按需设置 AD 测试版本AD24 很多工程师踩坑:全部统一十字,导致接地过孔阻抗高、大电流发热! 一、快捷键打开规则 PCB 界面按下:D R 展开…

2026/8/5 0:00:43 阅读更多 →
AI素描转换技术深度拆解(2024最新论文+工业级落地代码):从Stable Diffusion ControlNet到LoRA微调全链路解析

AI素描转换技术深度拆解(2024最新论文+工业级落地代码):从Stable Diffusion ControlNet到LoRA微调全链路解析

更多请点击: https://kaifayun.com 第一章:AI生成素描效果 AI生成素描效果是计算机视觉与风格迁移技术融合的典型应用,其核心在于将彩色照片或RGB图像转换为具有手绘质感、明暗对比强烈、边缘清晰的单色素描图像。该过程通常依赖于深度学习模…

2026/8/5 0:00:43 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/4 13:24:41 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/4 11:41:39 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/5 10:20:36 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/4 13:38:24 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/4 11:09:16 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/4 13:38:40 阅读更多 →