1. 引言1.1 聚合支付定义聚合支付Aggregate Payment又称“第四方支付”是指通过一个平台整合多家第三方支付机构、银行、以及其他支付渠道的支付能力为商户提供统一的支付接口和结算服务。商户无需逐个对接不同的支付渠道只需接入聚合支付平台即可实现微信支付、支付宝、银联云闪付、银行卡等多种支付方式的收单。1.2 项目背景与目标随着移动支付的普及商户面临的支付渠道日益增多对接多个渠道的研发成本、维护成本、对账成本居高不下。聚合支付系统旨在解决这一痛点提供统一接口一套API对接所有主流支付方式。智能路由根据费率、成功率、渠道稳定性等因素动态选择最优渠道。统一对账自动汇总各渠道交易生成统一对账单。资金结算支持TN结算到商户银行账户。增值服务如营销工具、会员管理、数据报表等。1.3 适用范围本设计方案适用于金融科技公司、SaaS服务商、电商平台等需要构建聚合支付能力的企业。系统设计需满足高并发、高可用、数据一致性和安全性要求。2. 需求分析2.1 功能性需求商户接入支持商户入驻、资质审核、费率配置、API密钥生成。支付能力涵盖公众号支付、APP支付、扫码支付、H5支付、小程序支付、刷脸支付等。交易管理订单查询、退款、关闭、撤销等操作。渠道路由根据规则金额、商户、渠道权重、成本自动选择支付渠道。对账清算每日自动拉取渠道对账单与系统交易记录进行勾兑生成差异报表。结算管理计算商户应收净额生成结算单通过银行或第三方代付到商户银行卡。风控管理交易监控、黑名单、限频、限额、反洗钱筛查。通知系统向商户服务器发送支付结果、退款结果等异步通知。报表统计交易趋势、渠道分析、商户营收报表。2.2 非功能性需求高并发峰值TPS 5000系统可水平扩展。高可用99.99%可用性核心链路无单点故障。数据一致性支付状态最终一致避免资金损失。安全性符合PCI DSS标准数据传输加密敏感信息脱敏。可扩展性支持快速接入新支付渠道。可维护性完善的日志、监控、链路追踪。2.3 用户角色商户使用聚合支付服务的商家。终端用户实际付款的消费者。运营人员管理商户、渠道、风控规则。财务人员处理对账、结算、差错。系统管理员系统配置、监控、运维。3. 总体架构设计3.1 架构原则微服务化按业务域拆分服务独立部署、独立扩展。分层架构接入层、业务层、核心层、基础设施层。异步化长耗时操作如对账、结算通过消息队列异步处理。数据最终一致性采用TCC、本地消息表等保证分布式事务。开放封闭原则对扩展开放对修改封闭渠道接入通过插件化实现。3.2 逻辑架构图text------------------- ------------------- ------------------- | 接入层 (API Gateway) | | 商户控制台 (Web) | | 运营后台 (Admin) | ------------------- ------------------- ------------------- | | | v v v ----------------------------------------------------------------------- | 业务服务层 | | ------------- ------------- ------------- ------------- | | | 商户服务 | | 订单服务 | | 支付服务 | | 路由服务 | | | ------------- ------------- ------------- ------------- | | ------------- ------------- ------------- ------------- | | | 渠道适配器 | | 对账服务 | | 结算服务 | | 风控服务 | | | ------------- ------------- ------------- ------------- | ----------------------------------------------------------------------- | | | v v v ----------------------------------------------------------------------- | 核心服务层 | | ------------- ------------- ------------- ------------- | | | 账户服务 | | 记账服务 | | 资金服务 | | 通知服务 | | | ------------- ------------- ------------- ------------- | ----------------------------------------------------------------------- | | | v v v ----------------------------------------------------------------------- | 基础设施层 | | (MySQL, Redis, RocketMQ, Elasticsearch, MinIO, Prometheus, etc.) | -----------------------------------------------------------------------3.3 技术栈选择开发语言Java 11 (Spring Boot 2.x, Spring Cloud Alibaba)服务注册与发现Nacos配置中心NacosAPI网关Spring Cloud Gateway SentinelRPC框架Dubbo / Spring Cloud OpenFeign消息队列RocketMQ (支持事务消息)分布式事务Seata (AT模式)数据库MySQL 8.0 (分库分表: ShardingSphere)缓存Redis 6.x (Cluster模式)搜索引擎Elasticsearch (用于日志和交易查询)对象存储MinIO (对账单文件存储)监控Prometheus Grafana链路追踪SkyWalking容器化Docker KubernetesCI/CDGitLab CI Jenkins4. 核心模块详细设计4.1 商户管理模块功能商户入驻申请、资料提交营业执照、法人信息、结算账户。资质审核人工或自动。商户信息维护费率、结算周期、API密钥、IP白名单。商户状态管理启用、禁用、冻结。关键设计商户表merchantid,merchant_no,name,contact,status,fee_rate,settle_cycle,api_key,secret_key,ip_whitelist,created_at,updated_at采用雪花算法生成唯一商户号。API密钥使用HS256或RSA商户请求需签名响应也需加密可选。费率支持阶梯费率、按渠道定制费率可配置在merchant_channel_rate表中。4.2 渠道管理模块功能维护支付渠道信息微信、支付宝、银联等。渠道参数配置AppID、商户号、API密钥、证书。渠道开关控制上下线、维护状态。渠道权重、优先级配置用于路由。关键设计渠道表channelid,channel_code,channel_name,status,weight,priority,fee_rate(渠道成本费率)渠道参数表channel_configid,channel_id,param_key,param_value,encrypted(是否加密)敏感信息如证书、密钥需加密存储使用AES-256或HSM。4.3 订单管理模块功能接收商户下单请求生成聚合订单。订单状态流转待支付 - 支付中 - 支付成功/失败 - 已退款/部分退款。提供订单查询接口。关键设计订单表payment_orderorder_no(聚合订单号),merchant_order_no(商户订单号),merchant_idamount,currency,subject,bodystatus(0-待支付,1-支付成功,2-支付失败,3-已退款,4-关闭)channel_code,channel_order_no(渠道订单号)notify_url,return_urlexpire_time,created_at,updated_at订单号生成使用雪花算法保证全局唯一。为防止订单号重复需在数据库对merchant_id merchant_order_no建立唯一索引。订单超时处理使用Redis延迟队列或RocketMQ定时消息超时后自动关闭订单。4.4 路由引擎模块功能根据商户、金额、渠道状态、费率、成功率等动态选择最优渠道。支持规则配置如金额100元优先使用微信100元优先使用银联。支持渠道降级当主渠道失败时自动切换备用渠道。关键设计规则引擎可采用 Drools 或自研简单规则链。路由因子商户指定渠道可选、渠道状态在线/离线、渠道权重、渠道成本、历史成功率、时间段、金额区间、卡类型借贷记。路由结果缓存避免每次计算。可配置渠道探针定时检测渠道可用性动态调整权重。4.5 支付核心模块功能调用渠道适配器发起支付请求。处理同步响应如二维码链接和异步通知支付结果。幂等处理防止重复通知。记录支付流水。关键设计支付流水表payment_flowflow_no,order_no,channel_code,request_amount,response_amountstatus(0-处理中,1-成功,2-失败),error_code,error_msgrequest_time,response_time,notify_time异步通知处理当收到渠道异步通知时更新订单状态并触发商户通知。幂等设计使用Redis分布式锁根据channel_order_no或order_no保证同一通知只处理一次。支付结果需通过消息队列广播供其他服务如风控、积分消费。4.6 渠道适配器模块功能封装各支付渠道的接口差异提供统一调用方式。每个渠道一个适配器实现ChannelAdapter接口。支持热插拔新渠道只需新增适配器无需修改核心代码。关键设计接口定义javapublic interface ChannelAdapter { PayResponse pay(PayRequest request); RefundResponse refund(RefundRequest request); QueryResponse query(QueryRequest request); CloseResponse close(CloseRequest request); NotifyResult parseNotify(MapString, String params); // 解析异步通知 }适配器内部实现HTTP请求、签名、验签、异常处理。渠道返回的原始数据需完整保存至channel_raw_data表用于对账和排查。4.7 对账模块功能定时拉取各渠道的对账单文件通常为T1。解析对账单与系统交易流水进行逐笔勾对。生成对账差异报告长款、短款、金额不一致等。自动处理部分差异如手续费差异人工介入处理无法自动处理的。关键设计对账任务调度使用XXL-JOB或Quartz。对账单文件存储MinIO按日期/渠道组织。对账流程下载渠道对账单。解析为内部对账记录。将系统交易流水昨日成功订单与对账记录进行匹配。匹配字段订单号、金额、时间、状态。生成差异记录表reconciliation_diff。自动调账例如手续费差异生成调账流水长款/短款需人工审核。对账完成后更新订单的对账状态。4.8 结算模块功能根据商户的结算周期T1、D1、D0生成结算单。计算商户应收金额交易金额 - 手续费 - 其他费用。通过银行或第三方代付接口打款至商户结算账户。生成结算记录供商户查询。关键设计结算表settlementsettle_no,merchant_id,start_date,end_datetotal_amount,fee_amount,net_amount,status(0-待结算,1-结算中,2-已结算,3-失败)bank_card_no,bank_name,settle_time,fail_reason结算任务每日定时汇总商户昨日成功交易已对账一致生成结算单。结算打款通过对接银行代付接口需考虑重试、幂等。结算失败需告警人工介入。4.9 风控模块功能实时风控交易前检查黑名单、限频、限额、IP风险。事后风控交易监控大额交易、频繁交易、反洗钱规则。黑白名单管理。风险交易拦截或人工审核。关键设计风控规则引擎可使用EasyRules或自研支持动态配置。实时风控点下单前、支付前、退款前。风控因子商户历史交易、用户设备指纹、IP地理位置、交易金额、时间。风控结果记录表risk_check_result。与支付核心集成支付核心调用风控服务若风控拒绝则返回失败。4.10 用户中心终端用户功能管理终端用户信息可选用于绑定支付方式、查询订单等。提供用户支付记录查询。关键设计如果聚合支付需要用户体系可设计用户表user与商户订单关联。通常聚合支付不存储用户敏感信息只保留openid等渠道用户标识。4.11 通知模块功能向商户服务器发送异步通知支付结果、退款结果。支持重试机制最多重试N次间隔递增。记录通知日志。关键设计通知表notify_taskid,order_no,merchant_id,notify_url,content(通知内容),status(0-待通知,1-成功,2-失败)retry_count,next_retry_time,last_error通知服务定时扫描待通知任务发送HTTP POST请求。商户需返回“SUCCESS”字符串表示接收成功否则重试。支持手动触发补发通知。5. 数据模型设计5.1 核心表结构以下列出关键表及其字段merchant(商户表)id bigint PKmerchant_no varchar(32) UKname varchar(100)contact_name varchar(50)contact_phone varchar(20)email varchar(50)status tinyint (0-待审核,1-正常,2-冻结,3-注销)fee_rate decimal(10,4) (默认费率百分数)settle_cycle varchar(10) (T1, D1, D0)api_key varchar(64)secret_key varchar(128)ip_whitelist text (JSON数组)created_at datetimeupdated_at datetimemerchant_channel_rate(商户渠道费率)id bigint PKmerchant_id bigintchannel_code varchar(20)fee_rate decimal(10,4) (该渠道的商户费率可为空表示使用默认)status tinyint (0-关闭,1-开启)created_at datetimechannel(渠道表)id int PKchannel_code varchar(20) UKchannel_name varchar(50)status tinyint (0-下线,1-上线)weight int (路由权重越大越优先)priority int (优先级数字小优先)cost_rate decimal(10,4) (渠道成本费率)created_at datetimechannel_config(渠道配置)id bigint PKchannel_code varchar(20)param_key varchar(50)param_value textencrypted tinyint (0-明文,1-加密)created_at datetimepayment_order(支付订单)id bigint PKorder_no varchar(32) UKmerchant_id bigintmerchant_order_no varchar(64)amount bigint (单位分)currency varchar(3) default CNYsubject varchar(200)body textstatus tinyint (0-待支付,1-支付成功,2-支付失败,3-已退款,4-关闭)channel_code varchar(20)channel_order_no varchar(64)pay_time datetimeexpire_time datetimenotify_url varchar(200)return_url varchar(200)client_ip varchar(45)device_info varchar(100)created_at datetimeupdated_at datetimeindex (merchant_id, merchant_order_no) UKpayment_flow(支付流水)id bigint PKflow_no varchar(32) UKorder_no varchar(32)channel_code varchar(20)request_amount bigintresponse_amount bigintstatus tinyint (0-处理中,1-成功,2-失败)error_code varchar(50)error_msg varchar(200)request_time datetimeresponse_time datetimenotify_time datetimeraw_data text (渠道返回原始数据)created_at datetimerefund_order(退款订单)id bigint PKrefund_no varchar(32) UKorder_no varchar(32)merchant_refund_no varchar(64)amount bigintreason varchar(200)status tinyint (0-待退款,1-退款成功,2-退款失败)channel_refund_no varchar(64)refund_time datetimecreated_at datetimeindex (merchant_id, merchant_refund_no) UKreconciliation_record(对账记录)id bigint PKchannel_code varchar(20)bill_date dateorder_no varchar(32)channel_order_no varchar(64)trade_amount bigintfee_amount biginttrade_time datetimestatus varchar(20) (match, mismatch, long, short) 匹配状态created_at datetimesettlement(结算单)id bigint PKsettle_no varchar(32) UKmerchant_id bigintstart_date dateend_date datetotal_amount bigintfee_amount bigintnet_amount bigintstatus tinyint (0-待结算,1-结算中,2-已结算,3-失败)bank_card_no varchar(30)bank_name varchar(100)settle_time datetimefail_reason varchar(200)created_at datetimenotify_task(通知任务)id bigint PKorder_no varchar(32)merchant_id bigintnotify_url varchar(200)content textstatus tinyint (0-待通知,1-成功,2-失败)retry_count intnext_retry_time datetimelast_error varchar(200)created_at datetime5.2 分库分表策略水平拆分核心表如payment_order、payment_flow数据量巨大需按时间或商户ID分表。按月份分表payment_order_202501、payment_order_202502按月归档。或按商户ID取模分表使用ShardingSphere分片键merchant_id % 16分为16张表。数据库拆分按业务域拆分数据库例如订单库、商户库、结算库避免单库压力。读写分离主库负责写从库负责查询通过ShardingSphere或MyCat实现。5.3 缓存设计热点数据商户信息、渠道配置缓存到Redis使用Hash结构过期时间1小时变更时更新。订单查询支付成功后订单状态缓存到Redis设置5分钟过期减少数据库压力。分布式锁使用Redis实现如lock:order:${orderNo}防止并发处理。幂等键使用Redis记录已处理的异步通知ID去重。6. 业务流程设计6.1 支付流程商户发起支付请求商户服务器调用聚合支付API传入订单信息、金额、支付方式等。参数校验验签、校验商户状态、订单号唯一性、金额合法性。风控预检调用风控服务若拒绝则返回失败。路由选择根据规则选择最优支付渠道。生成聚合订单插入payment_order记录状态为待支付。调用渠道适配器向渠道发起支付请求获取支付凭证如二维码链接、支付串。返回支付凭证同步返回给商户商户展示给用户。用户支付用户在渠道端完成支付。渠道异步通知渠道服务器向聚合支付平台的回调地址发送支付结果。处理通知验签、幂等处理、更新订单状态为成功、记录支付流水。触发商户通知向商户服务器发送异步通知。商户确认商户返回SUCCESS。结束用户或商户可查询订单状态。6.2 退款流程商户发起退款请求传入原订单号、退款金额、退款原因。校验验签、订单是否存在、是否可退款状态为成功且未全额退款。生成退款订单插入refund_order状态为待退款。调用渠道退款接口通过适配器发起退款。处理同步/异步结果若渠道支持同步返回则立即更新退款状态否则等待异步通知。更新原订单若全额退款更新订单状态为已退款部分退款则更新已退金额。通知商户发送退款结果通知。6.3 对账流程定时任务触发每日凌晨2点拉取各渠道前一日对账单。下载对账单通过FTP/HTTP下载存储到MinIO。解析对账单根据渠道格式解析为统一对账记录。获取系统交易流水查询前一日所有状态为成功的订单。逐笔勾对以系统订单为基准匹配渠道记录匹配成功系统有渠道有金额一致 → 标记match。长款系统无渠道有 → 标记long需人工确认是否补单。短款系统有渠道无 → 标记short需人工确认是否退款或补单。金额不一致系统有渠道有金额不同 → 标记mismatch。生成差异报表供财务处理。自动调账对于手续费差异可自动生成调账记录对于长款短款通常需要人工介入。6.4 结算流程定时任务每日根据商户结算周期汇总已完成对账的交易。计算结算金额交易总额 - 手续费。生成结算单状态为待结算。调用银行代付接口将净额打款至商户银行卡。更新结算单状态成功或失败。失败处理记录失败原因触发告警人工干预后手动重试。商户查询商户可在控制台查看结算记录。6.5 差错处理对账长款可能渠道已扣款但系统未记录需人工核实后补单或退款给用户。对账短款系统记录成功但渠道未扣款需退款给用户原路退回并冲正系统订单。结算失败可能是银行卡信息错误、银行系统异常需人工修正后重新结算。7. 安全设计7.1 网络安全防火墙限制外部访问只开放必要端口如80、443。WAF部署Web应用防火墙防御SQL注入、XSS等。HTTPS全站TLS 1.2证书由权威CA签发。VPN内部管理后台仅允许通过VPN访问。7.2 数据安全敏感数据加密数据库中的API密钥、证书、银行卡号等使用AES-256加密密钥由KMS管理。数据脱敏日志中不打印完整卡号、手机号只显示掩码。传输加密商户API请求需使用HTTPS并对参数签名。备份加密数据库备份文件加密存储。7.3 应用安全身份认证商户API使用API Key Secret签名采用HMAC-SHA256。权限控制商户只能操作自己的订单运营后台有RBAC权限模型。防重放请求中携带nonce和timestamp服务端缓存nonce一段时间防止重放攻击。限流熔断API网关层对商户IP、API Key进行限流防止DDoS。输入校验所有输入参数进行白名单校验防止注入。7.4 支付安全签名机制商户请求和平台响应均需签名签名算法如MD5或HMAC-SHA256。支付密码商户提现、修改结算卡等敏感操作需二次验证短信/谷歌验证器。风控拦截异常交易实时拦截如大额、高频、跨区域等。证书管理渠道证书定期更换妥善保管私钥。8. 接口设计8.1 商户APIRESTful风格请求参数和响应均为JSON包含公共参数。统一请求参数app_id商户API Keymethod接口名称formatJSONcharsetUTF-8sign_typeMD5/HMAC-SHA256sign签名timestamp时间戳version版本号biz_content业务参数的JSON字符串统一响应格式json{ code: 10000, // 业务码10000成功 msg: 成功, sign: 签名, biz_content: { ... } // 业务结果 }主要接口pay.unified.order统一下单pay.order.query订单查询pay.order.refund申请退款pay.refund.query退款查询pay.order.close关闭订单pay.download.bill下载对账单8.2 渠道适配器接口定义统一接口每个渠道实现javapublic interface ChannelAdapter { PayResponse pay(PayRequest request); RefundResponse refund(RefundRequest request); QueryResponse query(QueryRequest request); CloseResponse close(CloseRequest request); NotifyResult parseNotify(MapString, String params); }其中PayRequest包含渠道所需参数由适配器内部转换为渠道特定格式。8.3 内部服务接口微服务之间通过Dubbo或Feign调用定义明确的接口。例如MerchantService根据商户ID查询商户信息。OrderService创建订单、更新订单状态。ChannelService获取渠道配置、路由决策。RiskService风控检查。NotifyService创建通知任务。9. 高可用与容灾设计9.1 负载均衡DNS轮询多IP入口。硬件/软件负载均衡F5或Nginx分发流量到API网关集群。API网关集群Spring Cloud Gateway无状态水平扩展。服务层每个微服务多实例部署通过Nacos实现负载均衡。9.2 服务降级与熔断Sentinel配置熔断规则当某个渠道服务异常时快速失败或降级到备用渠道。线程池隔离核心支付线程池隔离避免单个渠道阻塞影响整体。超时控制调用渠道接口设置合理超时时间如5s超时后返回失败异步补偿。9.3 数据备份主从复制MySQL主库实时同步到从库从库提供查询服务。定期全备每日全量备份保存30天。异地备份备份文件同步到异地OSS。9.4 异地多活单元化架构按地域划分单元每个单元独立部署数据分片。跨单元同步关键数据如订单状态通过消息队列同步至中心或对端单元。容灾切换DNS流量切换数据库主从切换。10. 监控与运维10.1 日志系统日志收集使用Filebeat采集容器日志输出到Kafka。日志存储Elasticsearch集群按索引存储。日志分析Kibana进行可视化查询。日志格式JSON格式包含traceId、spanIdSkyWalking便于链路追踪。10.2 监控指标业务指标支付成功率、订单量、交易金额、退款率、渠道成功率。系统指标CPU、内存、磁盘、网络IO、JVM GC、QPS、RT。自定义指标通过Micrometer暴露Prometheus采集Grafana展示。10.3 告警机制Prometheus Alertmanager配置告警规则如支付成功率低于95%、5xx错误增多、接口超时。告警渠道钉钉、企业微信、短信、电话。告警分级P0紧急、P1严重、P2警告。10.4 链路追踪SkyWalking每个请求生成TraceId记录调用链便于定位性能瓶颈和错误。集成Spring Cloud应用通过agent方式接入自动追踪RPC、数据库、消息队列。11. 部署方案11.1 容器化Docker镜像每个微服务构建独立Docker镜像基于OpenJDK 11。镜像仓库Harbor私有仓库存储镜像。11.2 容器编排Kubernetes部署集群管理Pod、Service、ConfigMap、Secret。部署策略滚动更新确保服务不中断。资源限制设置CPU和内存请求/限制保证稳定性。11.3 CI/CDGitLab CI代码提交触发自动测试、构建镜像、部署到测试环境。Jenkins手动触发生产环境部署支持回滚。流水线步骤编译 - 单元测试 - 代码扫描 - 构建镜像 - 部署到K8s - 冒烟测试。11.4 环境配置开发/测试/生产多环境隔离通过K8s Namespace区分。配置管理使用Nacos配置中心不同环境不同配置。