银行扣款了天塌了也要记下来——回调接口的原子记账设计
银行扣款了天塌了也要记下来——回调接口的原子记账设计文章目录银行扣款了天塌了也要记下来——回调接口的原子记账设计一、银行扣款和普通业务不一样二、异常分类不是所有失败都能一样处理三、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/10/16 3:55:01 阅读更多 →
终极免费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/10/13 21:15:41 阅读更多 →
天赐范式第125天:大模型自指的算子流解析——从“执行推理“到“反思推理“

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

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

2026/10/3 4:55:46 阅读更多 →

最新新闻

Linux进程全解:从运行原理到线上排障实战手册

Linux进程全解:从运行原理到线上排障实战手册

做 Linux 运维和开发久了,你会发现系统里最绕不开、最常出问题、也最容易被讲得像玄学的东西,就是进程。很多人刚开始学的时候死记 PID、父子进程、僵尸进程,背得很辛苦,一上了生产环境还是不知道怎么用。我自己带过不少新人&…

2026/10/16 3:54:11 阅读更多 →
JavaScript作业生存指南:从需求拆解到调试提交的完整流程

JavaScript作业生存指南:从需求拆解到调试提交的完整流程

说实话,每隔一段时间就能看到各种 JavaScript 作业的求助帖,标题还都差不多。有人卡在“为什么我的按钮没反应”,有人卡在“数据渲染出来全是 undefined”,还有一类是“作业代码写完了,但不知道怎么确认对不对”。这些…

2026/10/16 3:54:11 阅读更多 →
从翻车到交付:复盘、拆解与验收驱动的项目管理实战

从翻车到交付:复盘、拆解与验收驱动的项目管理实战

1. 第一次作业的翻车现场:问题不是"人不行"1.1 一次"能跑但一跑就崩"的模拟项目我至今记得自己第一次负责带新人任务时的场景。事情很简单:给一组刚来的开发同学布置一个模拟项目X,目标是用三周时间做一个内部工具Demo&a…

2026/10/16 3:54:11 阅读更多 →
C++手写正则转最小化DFA:从Thompson构造到Hopcroft算法落地

C++手写正则转最小化DFA:从Thompson构造到Hopcroft算法落地

简介:本资源是一份面向计算机专业高年级学生、编译原理学习者及算法实践者的C工程实现,聚焦正则表达式到最小化DFA的完整自动机转换流程,解决文本模式匹配底层原理理解与代码落地难题。压缩包为单文件RAR格式(7KB)&…

2026/10/16 3:54:11 阅读更多 →
AVPlayer 构建音乐播放器实战:从选型到后台播放

AVPlayer 构建音乐播放器实战:从选型到后台播放

做音乐播放器这几年,AVPlayer 几乎成了我每次技术选型时绕不开的选项。它不像 AVAudioPlayer 那样一条 API 就能出声,但正因为它的能力边界足够宽,才让“歌单、进度条、缓冲、切歌、锁屏控制”这一整套需求都有了统一答案。这篇文章不是 API …

2026/10/16 3:54:11 阅读更多 →
移动端H5开发与PC端Web的核心差异及实战指南

移动端H5开发与PC端Web的核心差异及实战指南

移动端 H5 开发这个话题,我最早接触是在功能机向智能手机过渡那段时间。当时大家还在争论“移动端是不是要单独做一套网站”,后来从自适应到响应式再到各种混合开发方案,折腾了这么多年,我发现很多同学其实对“移动端 H5 开发和 P…

2026/10/16 3:53:10 阅读更多 →

日新闻

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 0:00:05 阅读更多 →
信号与系统频域分析作业解题指南

信号与系统频域分析作业解题指南

1. 作业背景与核心要求解析信号与系统作为电子信息类专业的核心基础课,其作业设计往往直接关联课程的核心知识框架。2026年春季第六次作业的布置,通常对应着课程进展到频域分析的关键阶段。根据常规教学进度推测,本次作业可能涉及以下核心内容…

2026/10/16 0:00:05 阅读更多 →
Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

1. 从一个"四不像"的练手项目说起如果你已经看完了Django的官方教程前几章,跟着敲完了投票应用,大概会有一种"我好像会了,又好像什么都不会"的割裂感。教程里每个知识点都是拆开的——这一章讲模型,下一章讲视…

2026/10/16 0:00:05 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/15 19:41:51 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →