项目主体业务为二手车竞拍业务,类似于阿里拍卖与优信拍等拍卖软件。具体竞拍流程如下:
谈起保证金业务,一般都会和账户系统挂钩,我们首先来说说保证金业务的使用都会涉及哪些场景:保证金系统体系是指在一些交易场景中,为了保证交易的履行和风险控制,而设立的一种资金管理机制。账号体系是指在互联网产品中,为了识别和管理用户,而设立的一种用户信息和资金信息的集合。简单一句话来说,保证金是平台用来约束行为人行为,避免给平台/平台用户造成损失的兜底性资金。
通用流程主要分为保证金账户开通流程、保证金缴纳流程、保证金提现流程。
保证金账户开通:保证金账户开通这个比较简单,保证金系统提供账户开通的接口即可,开通节点、开通校验等业务逻辑全由业务侧制定
保证金缴纳/充值:保证金缴纳流程比较简单,与账户充值系统基本流程一致,在这里说下保证金缴纳流程下更底层的一些逻辑,主要包括保证金缴纳规则制定、保证金缴纳规则匹配等。
保证金提现: 保证金充值采取的是订单/交易方式收款,用户提现有2种实现方案,一种是走退款,一种是走代付,两者中代付的方案更灵活,逻辑更简单,退款的方案限制性太多,例如三方退款是有时效限制的,超过一定时间就不能退了,有些劳动者会让他人代付,如果采用退款的话会造成资金错乱等等。保证金提现流程图如下:
账号体系的流程、体系和架构:
上述我们了解了保证金和账户系统相关的业务概念,下面真正来进入到如何设计保证金这个系统以及支付渠道的选型。
在本项目的保证金缴纳业务中,首先我们要给保证金用户建立一个虚拟的业务账户,这个业务账户的目的就是显示用户账户的总金额、可用余额及冻结金额。为了简便,我们选择对接微信支付、和微信退款。支付则为用户充值,退款即为用户提现。这里提到的保证金虚拟账户不是第三方的资金账户,而是使用数据库创建表来代替账户,也就是在数据库中创建一个表来存储用户的实际资金流转情况。
保证金缴纳后,用户参与竞拍时首先会检查保证金的可用余额是否够用,如果够用,则可参与竞价,出价后会按业务竞拍规则冻结一部分保证金,这时就会产生冻结金额。此时,冻结金额+可用余额=保证金总金额。当用户成交或未中标后冻结的金额会自动解冻,解冻时会扣减冻结的金额并增加可用余额。
1、用户账户信息的展示,主要包括总金额、可用余额、冻结金额。其中总金额=可用+冻结金额
2、用户充值:充值主要是调起微信支付的逻辑
3、用户退款:根据用户支付的订单进行退款,退款可分为两种方式,退订单的金额、部分退款。
4、保证金使用记录:展示用户使用保证金的记录,包括,冻结、解冻、支付、提现(退款)等记录。
5、保证金退款进度:展示提交退款申请后的办理进度,用户提交退款申请后,会提交给财务进行审核,审核通过后才会调起微信退款接口进行退款。
create table USER_AMOUNT
(
ID varchar(32) not null comment '唯一ID'
primary key,
TOTAL_MONEY decimal(16, 2) null comment '保证金总金额',
AVAIL_MONEY decimal(16, 2) null comment '可用余额',
FROZEN_MONEY decimal(16, 2) null comment '冻结金额',
USER_ID varchar(32) null comment '用户id',
CREATE_BY varchar(32) null comment '创建人id',
CREATE_NAME varchar(32) null comment '创建人姓名',
CREATE_TIME datetime null comment '创建时间/报价时间',
UPDATE_BY varchar(32) null comment '修改人',
UPDATE_NAME varchar(32) null comment '修改人姓名',
UPDATE_TIME datetime null comment '修改时间'
)
comment '保证金账户表';
create table USE_RECORD
(
ID varchar(32) not null comment '记录id'
primary key,
EVENT_STATUS varchar(32) null comment '保证金使用状态(0 冻结,1,解冻,2 保证金扣减,3 充值,4 退款)',
USE_MONEY decimal(16, 2) null comment '使用金额/充值金额',
TOTAL_MONEY decimal(16, 2) null comment '保证金总金额',
AVAIL_MONEY decimal(16, 2) null comment '可用余额',
FROZEN_MONEY decimal(16, 2) null comment '冻结金额',
USER_ID varchar(32) null comment '用户id',
REG_ID varchar(32) null comment '报名记录id',
PAY_TRADE_NO varchar(50) null comment '交易单号(充值退款时使用该字段)(充值时代表订单号、退款时代表退款单号)',
ACTUAL_TIME datetime null comment '业务数据插入的实际操作时间。如果保证金使用记录表出现异常,
处理成功后插入异常时间作为业务操作时间',
EVENT_DESC varchar(255) null comment '备注/充值异常原因/业务操作描述',
CREATE_BY varchar(32) null comment '创建人id',
CREATE_NAME varchar(32) null comment '创建人姓名',
CREATE_TIME datetime null comment '创建时间/报价时间',
UPDATE_BY varchar(32) null comment '修改人',
UPDATE_NAME varchar(32) null comment '修改人姓名',
UPDATE_TIME datetime null comment '修改时间'
)
comment '保证金使用记录';
create table ORDER_INFO
(
ID varchar(32) not null comment '订单ID'
primary key,
ORDER_TITLE varchar(64) null comment '订单标题/名称',
ORDER_NO varchar(50) null comment '商户订单编号',
USER_ID varchar(32) null comment '用户id',
TOTAL_FEE bigint null comment '订单金额(分)',
CODE_URL varchar(50) null comment '订单二维码连接(Native支付时使用)',
ORDER_STATUS varchar(20) null comment '订单状态(NOTPAY:未支付、SUCCESS:支付成功、CLOSED:超时已关闭、CANCEL:用户已取消)、
REFUND_PROCESSING:退款中、退款成功、退款异常)',
REFUND_FEE bigint null comment '当前订单已退金额(分)',
REFUND_STATUS varchar(32) null comment 'REFUND_SUCCESS:已全部退款、
REFUND_PART:部分退款
、NO_REFUND:未退款',
PREPAY_ID varchar(64) null comment '预支付交易会话标识。用于后续接口调用中使用,该值有效期为2小时',
PREPAY_RESPONSE text null comment '支付下单响应数据',
ERROR_CODE varchar(20) null comment '业务错误码',
ERROR_DESC varchar(64) null comment '业务错误描述',
REMARK varchar(120) null comment '备注',
CREATE_NAME varchar(32) null comment '创建人姓名',
CREATE_BY varchar(32) null comment '创建人id',
UPDATE_BY varchar(32) null comment '修改人',
UPDATE_NAME varchar(32) null comment '修改人姓名',
UPDATE_TIME datetime null comment '修改时间',
TRADE_STATE varchar(50) null comment '用户前端支付状态用于判断是否能再次支付默认为未支付(NOTPAY),成功(SUCCESS)'
)
comment '保证金订单信息';
create table PAYMENT_RECORD
(
ID varchar(32) not null comment '支付记录id'
primary key,
ORDER_NO varchar(50) null comment '商户订单编号',
TRANSACTION_ID varchar(50) null comment '支付系统交易编号',
PAYMENT_TYPE varchar(20) null comment '支付类型(微信)',
TRADE_TYPE varchar(20) null comment '交易类型(小程序、H5、native、js,app,公众号)',
TRADE_STATE varchar(50) null comment '交易状态(SUCCESS:支付成功
REFUND:转入退款
NOTPAY:未支付
CLOSED:已关闭
REVOKED:已撤销(付款码支付)
USERPAYING:用户支付中(付款码支付)
PAYERROR:支付失败(其他原因,如银行返回失败))',
PAYER_TOTAL bigint null comment '支付金额(分)',
REMARK varchar(200) null comment '备注',
CONTENT text null comment '通知参数',
CREATE_BY varchar(32) null comment '创建人id',
CREATE_NAME varchar(32) null comment '创建人姓名',
CREATE_TIME datetime null comment '创建时间/报价时间',
UPDATE_BY varchar(32) null comment '修改人',
UPDATE_NAME varchar(32) null comment '修改人姓名',
UPDATE_TIME datetime null comment '修改时间'
)
comment '保证金支付记录信息';
-- auto-generated definition
create table REFUND_APPLICATION
(
ID varchar(32) not null comment '退款申请单ID'
primary key,
REFUND_APPLICATION_NO varchar(50) null comment '退款申请单编号',
MONEY decimal(16, 2) null comment '提现金额',
PHONE varchar(32) null comment '申请人手机号',
CURRENT_TACHE varchar(12) null comment '当前环节( XJ :发起申请、JLSH:经理审核、CWSH:财务审核、GD:归档)',
ACTUAL_REFUND_STATUS varchar(32) null comment '实际退款状态(SUCCESS退款成功,ABNORMAL退款失败,NO_REFUND默认值,未退款、CLOSED 退款关闭)',
AUDIT_STATUS varchar(6) null comment '审核状态(DSH:待审核、BTG:审核不通过、TG:审核通过)',
USER_ID varchar(32) null comment '用户id',
ORDER_NO varchar(50) null comment '商户订单号',
ACTUAL_REFUND_TIME datetime null comment '实际退款时间',
REMARK varchar(200) null comment '备注/业务单失败原因/经理审核驳回时记录驳回原因',
CREATE_NAME varchar(32) null comment '创建人姓名',
CREATE_TIME datetime null comment '创建时间/报价时间',
UPDATE_BY varchar(32) null comment '修改人',
UPDATE_NAME varchar(32) null comment '修改人姓名',
UPDATE_TIME datetime null comment '修改时间'
)
comment '保证金退款申请单';
-- auto-generated definition
create table REFUND_INFO
(
ID varchar(32) not null comment '退款单ID'
primary key,
ORDER_NO varchar(50) null comment '商户订单编号',
REFUND_NO varchar(50) null comment '商户退款单编号',
REFUND_ID varchar(50) null comment '支付系统退款单号',
TOTAL_FEE bigint null comment '原订单金额(分)',
REFUND bigint null comment '退款金额(分)',
REASON varchar(50) null comment '退款原因',
REFUND_STATUS varchar(32) null comment '退款状态',
CONTENT_RETURN text null comment '申请退款返回参数',
CONTENT_NOTIFY text null comment '退款结果通知参数',
REFUND_TIME datetime null comment '退款时间',
REFUND_APP_ID varchar(32) null comment '退款申请单ID',
CREATE_BY varchar(32) null comment '创建人id',
CREATE_NAME varchar(32) null comment '创建人姓名',
CREATE_TIME datetime null comment '创建时间/报价时间',
UPDATE_BY varchar(32) null comment '修改人',
UPDATE_NAME varchar(32) null comment '修改人姓名',
UPDATE_TIME datetime null comment '修改时间'
)
comment '保证金退款记录';
create table ERROR_LOG
(
ID varchar(32) not null comment '唯一主键ID'
primary key,
USER_ID varchar(32) null comment '用户id',
EVENT_TYPE varchar(20) null comment '操作类型:充值(支付):PAY、提现(退款):REFUND',
ERROR_CODE varchar(20) null comment '业务错误码(AMOUNT:更新余额,USERECORD:插入保证金记录)',
ERROR_DESC varchar(500) null comment '业务错误描述(更新余额失败、插入保证金使用记录失败)',
PAY_TRADE_NO varchar(50) null comment '关联交易单号',
REMARK varchar(120) null comment '备注',
CREATE_NAME varchar(32) null comment '创建人姓名',
CREATE_BY varchar(32) null comment '创建人id',
UPDATE_BY varchar(32) null comment '修改人',
UPDATE_NAME varchar(32) null comment '修改人姓名',
UPDATE_TIME datetime null comment '修改时间'
)
comment '异常信息';
本篇文章主要介绍了保证金相关的业务概念、项目需求、保证金系统架构和充值、提现等流程,最后并贴出了功能设计的代码和脚本。下一节,我们将介绍系统架构中的安全架构设计。