一、项目背景
某海外企业希望对新能源汽车充电平台进行优化升级,基于现有功能开发出一款使用主流技术架构的全新系统,包括管理后台和客户App。系统涵盖充电管理,客户资料管理,营销管理,支付系统等核心模块,本文主要围绕支付系统的设计与实现全过程进行阐述。
充电平台的支付系统是针对App端客户,客户需要先通过预付款的方式对App钱包增值才能进行充电。与中国大陆地区支付的习惯不同的是,该企业面向的客户偏向于使用信用卡,ApplePay和GooglePay等海外普及的支付方式,所以支付需要需要满足以上三种支付方式。
基于以上需求,我们采取了对接MPGS聚合支付网关的方案,该网关不仅能满足以上三种支付方式,也可以对接国内主流的支付方式WeChat,aliPay等,利于后期支付方式的扩展。
二、概要设计
1.概述
1.1目标
本支付系统旨在为充电平台提供安全、高效、的支付能力,支持信用卡支付,ApplePay和GooglePay,满足App客户的多渠道支付需求。
1.2适用范围
本支付系统主要用于充电平台的App端客户对钱包进行增值。
2.系统架构图
3.功能模块划分
支付入口管理 | 提供统一支付界面或接口 |
信用卡管理 | 信用卡的绑定/解绑,向支付网关获取卡token |
支付流程控制 | 控制支付状态流转(待支付 → 支付中 → 支付成功/失败) |
网关回调处理 | 接收并解析支付网关的订单支付结果回调 |
日志管理 | 记录支付相关的所有操作日志,便于溯源和问题分析 |
风控管理 | 检测异常交易行为,限制交易金额,防止洗钱,刷单风险 |
安全管理 | 对支付接口以及用户支付信息进行加密处理 |
4.核心流程设计
4.1支付状态
待支付==>支付中==>支付成功/支付失败
状态 | 说明 |
PAY_WAIT(待支付) | App发起支付请求到商家服务器 |
PAY_PENDING(支付中) | 商家服务器向支付网关发起支付请求 |
PAY_SUCCESS(支付成功) | 支付网关同步响应和订单回调结果为订单支付成功 |
PAY_FAIL(支付失败) | 商家服务器失败/网络超时/支付网关响应结果为失败 |
4.2支付流程
- 用户跳转到钱包增值版面,选择支付方式(信用卡/ApplePay/GooglePay)。
- 填写增值金额后点击确认按钮。
- App调用商家系统的支付接口,系统生成预付款订单并返回订单号。
- 商家系统对支付网关发起支付请求并同步返回支付结果。
- 商家系统接收支付网关异步回调或轮询订单查询接口后更新订单状态以及修改App钱包金额。
- 商家系统将支付结果推送到App。
4.3异常处理
支付超时 | 区分支付网关超时和商家服务器超时,自动关闭支付中的订单 |
支付失败 | 区分支付网关失败还是商家系统失败,记录日志、推送失败原因给App |
4.4重试机制
为提高支付成功率,提升用户体验,重试机制是支付系统的必备机制。
注:由于MPGS网关具有幂等性校验,重试机制可以省略此步骤。
触发条件:
- MPGS支付网关超时/错误(不包括收单行返回的余额不足等错误)
- 支付服务不可用
- 支付服务返回重试响应码
重试策略:
- 最大重试次数3次
- 重试间隔时间3S
实现方式:
使用延时队列,将满足触发条件的订单放到延时队列,进行异步重试。
5.数据库设计
核心表结构:
表名 | 说明 |
pay_order(支付订单表) | 记录订单的发起时间,订单号,订单状态,支付方式,支付使用的卡号后四位等订单信息 |
pay_transaction(交易记录表) | 记录交易时间,交易号,交易类型(增值、退款)等交易信息 |
pay_card(用户信用卡表) | 存储用户绑定信用卡时从支付网关获取的卡token、发卡行,卡类型等信息 |
pay_callback_record(支付网关回调记录表) | 记录支付网关服务器回调数据 |
pay_gateway_record(网关响应表) | 记录每次请求支付网关的完整报文信息(请求、响应) |
pay_retry_record(支付重试记录表) | 记录重试订单信息,订单号,重试次数,最终结果等 |
6.安全性设计
由于支付涉及用户和银行卡等敏感信息,所以保证整个支付过程的安全性是支付系统的核心,并且由于当地法律要求,商家系统无权存储用户银行卡号敏感信息。
本支付系统采取以下安全性措施保障支付过程的安全性:
- 所有通信使用HTTPS加密。
- 接口加密与防重放攻击。
- 信用卡支付使用卡token,不存储用户的信用卡详细信息。
- 对支付相关数据库字段使用AES加密。
- 交易风控,监控频繁的大额交易以及对历史数据进行分析。
7.技术选型
后端语言 | Java |
微服务框架 | Spring Cloud |
消息中间件 | Kafka |
缓存中间件 | Redis |
数据库 | MySql |
第三方支付网关 | Mastercard gateway |
加密 | HTTPS、AES |
8.性能设计
性能指标:
单笔支付响应时间 | <1000ms |
最大并发支付能力 | >=800TPS |
支付成功率 | >=98% |
性能设计:
- 使用分布式微服务架构,多实例,支持横向扩展。
- 使用Kafka消息中间件解耦支付过程中的异步任务(短信通知、App推送、支付重试)。
- 使用Redis延时队对已完成订单进行支付状态核对以及重试机制。
三、详细设计
略