ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

SpringBoot电商收银台、支付网关、对账、退款整体方案设计与落地实施步骤

SpringBoot电商收银台、支付网关、对账、退款整体方案设计与落地实施步骤 SpringBoot电商收银台、支付网关、对账、退款整体方案设计与落地实施步骤一、方案整体概述本方案基于SpringBoot微服务技术栈搭建一套标准化、高可用、可扩展的电商支付体系核心覆盖收银台聚合支付、支付网关统一调度、交易全流程退款、日终/实时资金对账四大核心能力适配微信、支付宝、银联、数字人民币等主流支付渠道同时满足电商高并发、资金安全、账务一致、合规可追溯的业务要求。整体架构遵循前端收银台层、支付应用服务层、支付网关层、渠道适配层、数据对账层分层设计解耦业务交易与支付渠道逻辑支持多渠道支付、原路退款、自动对账、差错修复、交易溯源等核心场景适配电商订单支付、尾款支付、组合支付、全额/部分退款、超时关单等业务场景。二、核心模块方案设计2.1 整体架构分层设计SpringBoot微服务采用微服务拆分思想各服务独立部署、解耦协作核心服务拆分如下电商订单服务生成交易订单、锁定库存、触发支付、更新订单支付/退款状态收银台服务SpringBoot前端收银页面渲染、支付方式选择、交易参数组装、用户支付交互支付核心服务SpringBoot统一交易受理、支付/退款业务逻辑、事务控制、状态机流转支付网关服务SpringBoot多渠道适配、参数加密校验、渠道请求转发、异步通知处理、限流熔断对账清算服务SpringBoot交易数据归集、渠道流水对账、商户账务入账、差错记录与修复公共依赖组件Redis分布式锁、支付超时、限流、MQ异步通知、解耦削峰、MySQL交易账务库、Nacos配置注册中心、Sentinel熔断限流2.2 收银台模块方案设计2.2.1 核心业务场景支持订单全额支付、尾款补付、组合支付余额第三方支付、支付方式切换、超时取消支付、支付结果实时展示。2.2.2 核心功能设计订单信息校验接收订单ID校验订单状态待支付、有效期、金额合法性防止重复支付、过期支付。支付方式聚合统一展示支付宝、微信、银联等支付渠道根据配置动态展示可用渠道支持后台开关控制渠道上下线。支付参数预生成前端选择支付方式后调用支付核心服务生成唯一支付单号、支付令牌关联商户订单号、支付金额、商品信息、过期时间。支付状态轮询前端定时轮询支付结果接口结合网关异步通知实现支付成功/失败结果实时同步。超时自动关闭基于Redis设置支付超时时间默认15分钟超时未支付自动作废支付单据通知订单服务关闭支付状态、释放库存。2.2.3 核心数据表设计收银台支付单据表支付单号、商户订单号、支付金额、支付渠道、支付状态、过期时间、用户ID、创建时间、支付完成时间、作废状态。2.3 支付网关模块方案设计核心核心支付网关是整个支付体系的流量入口核心作用是统一接入多支付渠道、屏蔽渠道差异、保障交易安全、实现流量管控是解耦业务与第三方支付接口的关键层。2.3.1 核心能力多渠道统一适配封装支付宝、微信、银联等渠道的下单、查询、退款、撤销接口统一入参、出参格式业务层无需感知渠道差异。安全校验机制请求参数签名校验、防篡改、防重放请求唯一IDRedis幂等、敏感参数加密、商户权限校验。幂等性设计所有支付、退款接口实现幂等重复请求直接返回历史结果避免重复扣款、重复退款。限流熔断降级基于Sentinel实现接口限流、渠道故障熔断某一渠道异常时自动降级、切换备用渠道防止雪崩。异步通知处理统一接收第三方渠道异步回调校验回调签名、解析交易结果、更新交易状态、通过MQ同步至订单、账务服务。交易日志全埋点记录请求报文、响应报文、回调报文用于问题排查、对账溯源、合规审计。2.3.2 核心流程收银台发起支付请求 → 网关参数校验幂等判断 → 根据渠道类型路由至对应渠道适配器 → 调用第三方支付接口 → 接收渠道响应返回支付凭证二维码/跳转链接 → 第三方异步回调网关 → 网关校验结果 → 更新交易状态 → MQ通知业务服务。2.3.3 幂等与防重设计支付场景以商户订单号支付渠道为唯一键Redis缓存交易状态重复请求直接拦截。退款场景以原支付单号退款单号为唯一键防止重复退款。回调场景以渠道交易号为唯一标识处理完成后标记已处理避免重复回调。2.4 退款模块方案设计2.4.1 退款场景覆盖支持全额退款、部分退款、多次部分退款、超时自动退款、人工介入退款、退款失败重试、退款撤销。2.4.2 退款核心规则原路退回原则所有退款必须原路返回用户支付账户微信退微信、支付宝退支付宝不支持跨渠道退款。金额控制规则累计退款金额≤原支付金额部分退款后剩余金额可再次退款禁止超额度退款。状态前置校验仅支付成功、未关闭、未全额退款的订单可发起退款已退款、已关闭、交易失败订单禁止退款。事务一致性退款业务采用分布式事务业务状态更新与渠道退款请求保持一致避免业务退款成功、渠道退款失败的账务不一致问题。失败重试机制渠道网络异常、超时等临时失败支持定时任务自动重试永久失败进入人工差错处理队列。2.4.3 退款流程订单服务发起退款申请 → 支付核心服务校验退款权限、金额、状态 → 生成退款单号 → 调用支付网关退款接口 → 渠道执行退款 → 同步退款结果 → 更新订单、支付、退款单据状态 → 账务扣减记录 → 推送退款结果给用户。2.4.4 核心数据表退款退款单据表退款单号、原支付单号、商户订单号、退款金额、退款类型全额/部分、退款状态、渠道退款流水、失败原因、重试次数。2.5 对账模块方案设计资金核心对账核心目标保证平台交易数据与第三方渠道资金数据一致、账务无差异、资金流水可追溯、差错可修复分为交易对账、资金对账、账务入账三个核心环节。2.5.1 对账维度交易流水对账平台本地支付/退款记录 VS 第三方渠道交易流水核对订单、金额、状态、流水号。资金金额对账平台当日实收、实退金额 VS 渠道当日结算金额核对总金额一致性。状态对账处理单边账平台成功渠道失败、渠道成功平台未同步、重复交易、状态异常数据。2.5.2 对账模式实时对账交易完成后实时校验单条交易数据及时发现异常。日终自动对账每日凌晨定时任务拉取前一日全量渠道流水与平台本地流水批量比对生成对账报告。2.5.3 差错类型与处理方案平台有、渠道无平台标记支付成功渠道无流水 → 判定为虚假交易撤销平台交易回滚订单状态。渠道有、平台无渠道已扣款平台未同步状态 → 补录交易数据更新订单支付状态完成入账。金额不一致平台与渠道交易金额不符 → 标记差错人工核对订单与渠道流水修正账务。退款单边账平台退款成功渠道退款失败 → 重试退款渠道退款成功平台未更新 → 同步状态并入账。2.5.4 对账核心数据表对账流水表、对账差异表、日结汇总表、商户入账记录表。三、全套落地实施步骤可直接落地整体实施分为环境搭建→数据库设计→核心编码→渠道对接→功能测试→压测优化→灰度上线→运维监控8个阶段全程基于SpringBoot 微服务架构落地。3.1 阶段一基础环境搭建1-2天搭建微服务基础环境Nacos注册配置中心、Sentinel熔断限流、Redis、RocketMQ/Kafka、MySQL8.0。创建基础工程搭建收银台服务、支付核心服务、支付网关服务、对账清算服务四个SpringBoot项目统一依赖版本、全局异常处理、统一返回结果。配置基础组件分布式锁、Redis工具类、MQ生产者/消费者、日志框架、Swagger接口文档。3.2 阶段二数据库表结构设计与落地1天创建支付体系全套数据表核心包含订单支付表、支付单据表、退款单据表、渠道流水表、对账流水表、对账差异表、商户入账表、支付配置表。核心字段统一规范唯一业务单号、渠道流水号、金额、状态、创建/更新时间、关联订单号、备注、差错原因。3.3 阶段三收银台模块开发2天开发订单校验接口、支付方式查询接口、支付单据生成接口。实现支付超时控制、Redis缓存支付状态、前端收银页面联调。开发支付结果轮询接口、支付作废接口、超时自动关闭定时任务。3.4 阶段四支付网关核心开发3-4天设计渠道适配器模式定义统一支付、退款、查询接口编写支付宝、微信基础适配器。实现请求签名、防重放、幂等校验、参数加密功能。开发渠道下单、订单查询、退款、撤销接口封装第三方SDK。开发异步回调统一处理逻辑实现回调校验、状态更新、MQ消息推送。集成Sentinel限流熔断配置渠道异常降级策略。3.5 阶段五退款模块开发2天开发退款前置校验逻辑状态、金额、权限校验。实现全额退款、部分退款、多次退款核心逻辑。开发退款失败重试定时任务、退款状态同步接口。对接网关退款接口实现原路退款、退款结果回调处理。3.6 阶段六对账清算模块开发2-3天开发渠道流水拉取接口对接支付宝、微信对账文件/对账接口。实现日终自动对账定时任务批量比对交易、金额数据。开发差错数据识别、记录、人工处理后台功能。实现日结汇总、商户自动入账、对账报告生成功能。3.7 阶段七联调测试与问题修复3天功能测试正常支付、超时支付、重复支付、全额退款、部分退款、退款失败场景全覆盖测试。异常测试网络中断、渠道超时、回调重复、并发支付、并发退款场景测试。对账测试模拟单边账、金额差异、漏单场景验证对账差错识别与修复能力。幂等测试重复调用支付、退款接口验证无重复扣款、重复退款。3.8 阶段八性能压测与优化2天高并发压测模拟秒杀、大批量订单支付场景优化接口响应速度。优化点Redis缓存热点交易数据、MQ异步解耦、数据库索引优化、接口限流、超时时间统一配置。解决并发问题分布式锁防止超退、超付事务超时、锁等待问题优化。3.9 阶段九灰度上线与运维监控1天灰度发布先测试环境全量验证再线上小流量灰度最后全量上线。监控配置接入日志监控、接口告警、交易异常告警、对账差错告警、MQ消息堆积告警。兜底方案配置渠道故障降级、交易失败兜底、对账异常人工介入机制。四、核心落地注意事项避坑要点资金安全优先所有金额计算使用BigDecimal禁止double/float所有交易、退款操作必须有幂等和事务保障。异步最终一致性支付、退款结果全部依赖渠道异步回调配合定时任务主动查询兜底避免状态不一致。对账闭环必须做到每日自动对账差错数据可追溯、可修复杜绝长期账务差异。高可用保障支付网关必须支持熔断降级单一渠道故障不影响整体支付体系可用。合规可追溯全量交易报文、回调报文、操作日志永久留存满足资金合规审计要求。五、扩展能力预留方案预留多商户、多渠道、手续费拆分、分账、退款手续费、实时清算等扩展能力后续可快速迭代对接分账体系、财务结算体系、新支付渠道云闪付、数字人民币。电商支付全套 MySQL 建表语句技术说明金额统一使用DECIMAL(19,4)禁止使用 double/float所有业务单据号唯一索引保证幂等逻辑删除is_deleted资金类数据不做物理删除status 状态字段统一注释适配 SpringBoot MyBatis‑Plus核心表支付主表、退款表、渠道流水表、对账主表、对账差异表、支付渠道配置表。-- --------------------------- -- 1.支付单据表 pay_order -- 每一次支付行为一条记录一个商户订单可有多条支付组合支付 -- --------------------------- DROP TABLE IF EXISTS pay_order; CREATE TABLE pay_order ( id bigint NOT NULL AUTO_INCREMENT COMMENT 主键ID, pay_no varchar(64) NOT NULL COMMENT 平台支付单号【唯一】, out_order_no varchar(64) NOT NULL COMMENT 商户业务订单号(订单服务的订单号), user_id varchar(64) NOT NULL COMMENT 用户ID, total_amount decimal(19,4) NOT NULL DEFAULT 0.0000 COMMENT 支付总金额, pay_amount decimal(19,4) NOT NULL DEFAULT 0.0000 COMMENT 实付金额, channel_code varchar(32) NOT NULL COMMENT 支付渠道WECHAT/ALIPAY/UNION, channel_trade_no varchar(128) DEFAULT NULL COMMENT 第三方渠道交易号, status tinyint NOT NULL DEFAULT 0 COMMENT 0待支付 1支付成功 2支付失败 3已关闭 4已退款, expire_time datetime NOT NULL COMMENT 支付过期时间, pay_success_time datetime DEFAULT NULL COMMENT 支付成功时间, notify_content text COMMENT 渠道回调原始报文, remark varchar(512) DEFAULT NULL COMMENT 备注, is_deleted tinyint NOT NULL DEFAULT 0 COMMENT 0未删除 1已删除, create_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, update_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (id), UNIQUE KEY uk_pay_no (pay_no), KEY idx_out_order_no (out_order_no), KEY idx_channel_trade_no (channel_trade_no), KEY idx_status_expire (status,expire_time) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT支付单据表; -- --------------------------- -- 2.退款单据表 pay_refund -- 支持全额、部分退款一笔pay_order可以多条退款记录 -- --------------------------- DROP TABLE IF EXISTS pay_refund; CREATE TABLE pay_refund ( id bigint NOT NULL AUTO_INCREMENT COMMENT 主键ID, refund_no varchar(64) NOT NULL COMMENT 平台退款单号【唯一】, pay_no varchar(64) NOT NULL COMMENT 关联平台支付单号, out_order_no varchar(64) NOT NULL COMMENT 商户业务订单号, out_refund_no varchar(64) DEFAULT NULL COMMENT 外部业务退款单号, refund_amount decimal(19,4) NOT NULL DEFAULT 0.0000 COMMENT 本次退款金额, channel_code varchar(32) NOT NULL COMMENT 退款渠道 WECHAT/ALIPAY, channel_refund_no varchar(128) DEFAULT NULL COMMENT 第三方退款流水号, status tinyint NOT NULL DEFAULT 0 COMMENT 0退款中 1退款成功 2退款失败 3退款关闭, fail_reason varchar(1024) DEFAULT NULL COMMENT 失败原因, retry_count int NOT NULL DEFAULT 0 COMMENT 重试次数, refund_success_time datetime DEFAULT NULL COMMENT 退款成功时间, notify_content text COMMENT 退款回调原始报文, remark varchar(512) DEFAULT NULL, is_deleted tinyint NOT NULL DEFAULT 0, create_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, update_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (id), UNIQUE KEY uk_refund_no (refund_no), KEY idx_pay_no (pay_no), KEY idx_out_order_no (out_order_no), KEY idx_channel_refund_no (channel_refund_no) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT退款单据表; -- --------------------------- -- 3.渠道交互流水表 pay_channel_log -- 网关层记录和第三方所有请求、响应报文用于排查问题审计 -- --------------------------- DROP TABLE IF EXISTS pay_channel_log; CREATE TABLE pay_channel_log ( id bigint NOT NULL AUTO_INCREMENT, biz_type varchar(32) NOT NULL COMMENT PAY支付 REFUND退款 QUERY查询 NOTIFY回调, biz_no varchar(64) NOT NULL COMMENT 业务单号pay_no / refund_no, channel_code varchar(32) NOT NULL, channel_req_no varchar(128) DEFAULT NULL COMMENT 渠道请求ID, request_url varchar(512) DEFAULT NULL, request_body text COMMENT 请求报文, response_body text COMMENT 响应报文, elapsed_ms int DEFAULT NULL COMMENT 耗时ms, status tinyint NOT NULL DEFAULT 0 COMMENT 0成功 1失败, error_msg varchar(1024) DEFAULT NULL, create_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), KEY idx_biz_type_biz_no (biz_type,biz_no), KEY idx_create_time (create_time) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT渠道交互流水表; -- --------------------------- -- 4.支付渠道配置表 pay_channel_config -- 多渠道配置Nacos配置备选数据库存储用于后台管理 -- --------------------------- DROP TABLE IF EXISTS pay_channel_config; CREATE TABLE pay_channel_config ( id bigint NOT NULL AUTO_INCREMENT, channel_code varchar(32) NOT NULL COMMENT 渠道编码 WECHAT/ALIPAY, channel_name varchar(64) NOT NULL COMMENT 渠道名称, merchant_id varchar(128) NOT NULL COMMENT 商户号, config_json text NOT NULL COMMENT 渠道配置json(appid、密钥、证书路径等), status tinyint NOT NULL DEFAULT 1 COMMENT 0禁用 1启用, sort int NOT NULL DEFAULT 0 COMMENT 前端排序, remark varchar(512) DEFAULT NULL, create_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, update_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (id), UNIQUE KEY uk_channel_merchant (channel_code,merchant_id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT支付渠道配置表; -- --------------------------- -- 5.对账任务主表 pay_reconciliation_task -- 每日对账任务一天一条任务记录 -- --------------------------- DROP TABLE IF EXISTS pay_reconciliation_task; CREATE TABLE pay_reconciliation_task ( id bigint NOT NULL AUTO_INCREMENT, task_date date NOT NULL COMMENT 对账业务日期(前一日), task_no varchar(64) NOT NULL COMMENT 对账任务编号, channel_code varchar(32) NOT NULL COMMENT 渠道, total_platform_pay decimal(19,4) NOT NULL DEFAULT 0.0000 COMMENT 平台应付总金额, total_platform_refund decimal(19,4) NOT NULL DEFAULT 0.0000 COMMENT 平台应退总金额, total_channel_pay decimal(19,4) NOT NULL DEFAULT 0.0000 COMMENT 渠道实付总金额, total_channel_refund decimal(19,4) NOT NULL DEFAULT 0.0000 COMMENT 渠道实退总金额, diff_count int NOT NULL DEFAULT 0 COMMENT 差异笔数, status tinyint NOT NULL DEFAULT 0 COMMENT 0待执行 1执行中 2完成 3失败, file_path varchar(512) DEFAULT NULL COMMENT 渠道对账文件路径, remark text, create_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, update_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (id), UNIQUE KEY uk_task_date_channel (task_date,channel_code) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT对账任务主表; -- --------------------------- -- 6.对账差异表 pay_reconciliation_diff -- 所有单边账、金额不一致全部落在此表人工处理 -- --------------------------- DROP TABLE IF EXISTS pay_reconciliation_diff; CREATE TABLE pay_reconciliation_diff ( id bigint NOT NULL AUTO_INCREMENT, task_no varchar(64) NOT NULL COMMENT 关联对账任务号, biz_type varchar(32) NOT NULL COMMENT PAY / REFUND, pay_no varchar(64) DEFAULT NULL, refund_no varchar(64) DEFAULT NULL, channel_trade_no varchar(128) DEFAULT NULL COMMENT 渠道流水号, diff_type varchar(64) NOT NULL COMMENT PLATFORM_ONLY平台有渠道无CHANNEL_ONLY渠道有平台无AMOUNT_DIFF金额不一致, platform_amount decimal(19,4) DEFAULT NULL, channel_amount decimal(19,4) DEFAULT NULL, handle_status tinyint NOT NULL DEFAULT 0 COMMENT 0待处理 1已处理 2忽略, handle_result varchar(1024) DEFAULT NULL COMMENT 处理结果说明, handle_user varchar(64) DEFAULT NULL COMMENT 处理人, handle_time datetime DEFAULT NULL, create_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, update_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (id), KEY idx_task_no (task_no), KEY idx_handle_status (handle_status) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT对账差异表;状态码说明代码里枚举直接复用pay_order 支付单据 status0待支付 1支付成功 2支付失败 3已关闭超时未付 4已退款pay_refund 退款单据 status0退款中 1退款成功 2退款失败 3退款关闭pay_reconciliation_diff diff_typePLATFORM_ONLY平台有记录渠道无流水CHANNEL_ONLY渠道有流水平台无记录单边账AMOUNT_DIFF两边金额不一致pay_reconciliation_diff handle_status0待处理 1已处理 2忽略落地配套提示分库分表建议交易量大pay_channel_log、pay_order可按时间分表金额业务代码全部 BigDecimal禁止运算用 double幂等索引所有业务单号唯一索引防止重复落库对账数据禁止删除历史对账数据用于财务审计超时关单定时任务扫描pay_orderstatus0 and expire_time now ()关闭支付单。
返回列表