背景
将软件开发中三方支付系统、自有账户系统的模块独立开源,
- 降低软件开发中支付系统的开发门槛。
- 标准化三方业务系统接入支付逻辑接入流程。
- 复用交易系统
项目源代码
项目已在 github 开源,项目地址如下。
https://github.com/G-little/priest
模块划分
- 三方支付模块 负责衔接第三方支付充值、扣款与交易模块的接口交互。
- 交易模块 负责对业务系统提供转账、充值、冻结等接口调用
- 账户模块 用户账户和交易记录维护
核心流程设计
- 客户端请求业务系统创建业务订单
- 业务系统请求支付系统创建预生成订单
- 客户端获取支付方式列表,选择支付方式
- 根据支付方式生成支付参数
- 客户端三方 sdk 请求支付
- 三方支付回调支付系统
- 支付系统处理订单支付状态
- 支付系统通知业务系统订单支付
- 客户端查询支付订单
注意事项
交易中扣款顺序保持一致,防止交易死锁的发生
数据结构设计
接口设计
dubbo 接口设计
账户接口
/** * 创建账户 * @param uid 用户ID */ void createUserAccount(long uid); /** * 获取账户信息 * @param account * @return */ UserAccountDTO get(Account account); /** * 统计一段时间账户交易总额 * @param account * @param timeStart * @param timeEnd * @return */ long getBalance(Account account, long timeStart, long timeEnd); /** * 拉取账户交易记录 * @param account * @param startTime * @param endTime * @param limit * @return */ List<TransactionRecordDTO> findTransactions(Account account, Long startTime, Long endTime, Integer limit); /** * 转账 * @param fromUid * @param toUid * @param amount * @param transNum * @param btype * @param desc * @return */ List<TransactionRecordDTO> transfer(long fromUid, long toUid, long amount, String transNum, BusinessType btype, String desc); /** * 冻结 * @param uid * @param amount * @param transNum * @param btype * @param desc * @return */ List<TransactionRecordDTO> froze(long uid, long amount, String transNum, BusinessType btype, String desc); /** * 解冻 * @param srcTransNum * @param amount * @param toUid * @param transNum * @param btype * @param desc * @return */ List<TransactionRecordDTO> unfroze(String srcTransNum, long amount, long toUid, String transNum, BusinessType btype, String desc); /** * 分页查询 * @param uid * @param page * @param pageSize * @return */ Page<FrozenRecordDTO> listFrozenRecords(long uid, int page, int pageSize); /** * 创建账户 * @param account */ void createAccount(Account account); /** * 转账 * @param from * @param to * @param amount * @param transNum * @param btype * @param desc * @return */ List<TransactionRecordDTO> transfer(Account from, Account to, long amount, String transNum, BusinessType btype, String desc); /** * 分页查询冻结订单 * @param account * @param page * @param pageSize * @return */ Page<FrozenRecordDTO> listFrozenRecords(Account account, int page, int pageSize);
三方支付接口
/** * 支付方式列表 * @return */ List<PayTypeDTO> typeList(); /** * 支付参数生成 * @param payType * @param preorderNo * @return */ ResultJson prePay(@NotBlank Long uid, @NotEmpty String payType, @NotEmpty String preorderNo); /** * 使用三方支付订单 * @param uid * @param payType * @param preorderNo * @return */ ResultJson thirdpay(@NotBlank Long uid,@NotEmpty String payType, @NotEmpty String preorderNo); /** * 余额支付 * @param uid * @param preorderNo * @return */ ResultJson pay(@NotBlank Long uid,@NotEmpty String preorderNo); /** * 三方支付结果回调 * @param payType * @param callbackInfo */ void thirdpayCallback(@PayType String payType, @NotNull PayCallbackInfo callbackInfo);
web 接口设计
1.支付方式列表
请求说明:
url | /pay/list |
---|---|
格式 | json |
http 请求方式 | get |
token | 是 |
参数说明:
无
实例:
{ "c": 0, "m": null, "d": [ { "typeName": "balance", //支付方式代码 "comment": "余额支付", //支付名称 "thumbnail": null // 支付方式缩略图 }, { "typeName": "alipay", "comment": "支付宝支付", "thumbnail": null }, { "typeName": "weixinpay", "comment": "微信支付", "thumbnail": null } ] }
2.余额支付
请求说明:
url | /pay |
---|---|
格式 | json |
http 请求方式 | get |
token | 是 |
参数说明:
参数 | 必填 | 类型 | 参数说明 | 备注 |
---|---|---|---|---|
preorderNo | 是 | String | 预支付订单 NO |
实例:
{ "c": 0, // 0:成功 非0: 失败 "m": null, // 错误消息 "d": { } }
3.充值
请求说明:
url | /pay/charge |
---|---|
格式 | json |
http 请求方式 | get |
token | 是 |
参数说明:
参数 | 必填 | 类型 | 参数说明 | 备注 |
---|---|---|---|---|
money | 是 | double | 充值金额 |
实例:
{ "c": 0, // 0:成功 非0: 失败 "m": null, // 错误消息 "d": { } }
4.支付参数生成
请求说明:
url | /pay/{payType}/params |
---|---|
格式 | json |
http 请求方式 | get |
token | 是 |
参数说明:
参数 | 必填 | 类型 | 参数说明 | 备注 |
---|---|---|---|---|
preorderNo | 是 | 预支付订单 ID |
实例:
{ "c": 0, // 0:成功 非0: 失败 "m": null, // 错误消息 "d": { "payOrderId":"xxxx",支付订单ID "outPayOrderId":"xxxxx",三方支付ID "callPayInfo":"{\n \"appId\": \"wx592b0b39da51bbf7\",\n \"nonceStr\": \"6c7de1f27f7de61a6daddfffbe05c058\",\n \"package\": \"prepay_id=null\",\n \"paySign\": \"AB80BDC00F7425E9851138483A0556F5\",\n \"signType\": \"MD5\",\n \"timeStamp\": 1557825414\n}" } }
5.用户账户查询
请求说明:
url | /wallet |
---|---|
格式 | json |
http 请求方式 | get |
token | 是 |
参数说明:
无
实例:
{ "c": 0, "m": null, "d": { "uid": 10007, //用户账户 "money": 10.0, //余额 "frozonMoney": 0.0, //冻结金额 "status": 0, //状态 "updateTime": "2019-04-15 21:27:10", //更新时间 "createTime": "2019-04-15 21:27:10" //创建时间 } }
6.交易流水查询
请求说明:
url | /wallet/transactions |
---|---|
格式 | json |
http 请求方式 | get |
token | 是 |
参数说明:
参数 | 必填 | 类型 | 参数说明 | 备注 |
---|---|---|---|---|
limit | 否 | 限制单页返回条数 | ||
last | 否 | 时间戳 |
实例:
{ "c": 0, "m": null, "d": { "limit": 20, //单页返回条数 "last": 1555334830249, //最终返回时间戳 "list": [ { "tranNum": "KIN20190415212715102492143086102100003", //交易流水 "accountId": "UNR10007", //账户 "opposite": "FIX10000", //对方账户 "tradeNum": "CHA20190415212715102472143042553100001", //关联流水 "money": 10.0, //交易金额 "type": 1, // 1 入账 2 出账 "btype": 1, // 业务类型 "comment": "this is a test", //描述 "createTime": "2019-04-15 21:27:10" // 交易时间 } ], "end": true } }
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于