项目支付功能实战-微信支付项目功能设计及库表脚本

项目需求

项目主体业务为二手车竞拍业务,类似于阿里拍卖与优信拍等拍卖软件。具体竞拍流程如下:

  1. 用户注册小程序账号
  2. 用户实名信息认证
  3. 用户缴纳保证金
  4. 参与竞拍

保证金业务概念

谈起保证金业务,一般都会和账户系统挂钩,我们首先来说说保证金业务的使用都会涉及哪些场景:保证金系统体系是指在一些交易场景中,为了保证交易的履行和风险控制,而设立的一种资金管理机制。账号体系是指在互联网产品中,为了识别和管理用户,而设立的一种用户信息和资金信息的集合。简单一句话来说,保证金是平台用来约束行为人行为,避免给平台/平台用户造成损失的兜底性资金。

保证金业务的设计流程

通用流程主要分为保证金账户开通流程、保证金缴纳流程、保证金提现流程。
保证金账户开通:保证金账户开通这个比较简单,保证金系统提供账户开通的接口即可,开通节点、开通校验等业务逻辑全由业务侧制定
保证金缴纳/充值:保证金缴纳流程比较简单,与账户充值系统基本流程一致,在这里说下保证金缴纳流程下更底层的一些逻辑,主要包括保证金缴纳规则制定、保证金缴纳规则匹配等。
保证金提现: 保证金充值采取的是订单/交易方式收款,用户提现有2种实现方案,一种是走退款,一种是走代付,两者中代付的方案更灵活,逻辑更简单,退款的方案限制性太多,例如三方退款是有时效限制的,超过一定时间就不能退了,有些劳动者会让他人代付,如果采用退款的话会造成资金错乱等等。保证金提现流程图如下:
项目支付功能实战-微信支付项目功能设计及库表脚本_第1张图片

  • 流程:保证金系统体系的流程一般包括以下几个步骤:
    1. 用户在参与某种交易前,需要向平台或第三方支付机构缴纳一定比例或金额的保证金,作为交易的担保。
    2. 用户在交易过程中,根据交易的变化情况,可能需要追加或减少保证金,以维持交易的安全性。
    3. 用户在交易结束后,根据交易的结果,可能会获得保证金的返还或扣除,或者部分返还或扣除。
    4. 平台或第三方支付机构在收取、管理和退还保证金的过程中,需要进行严格的风险控制和监督,以防止保证金的挪用、丢失或滥用。
  • 体系:保证金系统体系的体系一般包括以下几个要素:
    1. 保证金账户:用于记录用户的保证金的存入、变动和退还的账户,一般是虚拟账户,与用户的实际资金账户相对应。
    2. 保证金规则:用于规定用户需要缴纳的保证金的比例或金额,以及保证金的追加、扣除和返还的条件和方式的规则,一般由平台或第三方支付机构制定,也可能由交易双方协商确定。
    3. 保证金风控:用于监测和控制保证金的风险,包括保证金的充足性、安全性和合规性的风控,一般由平台或第三方支付机构负责,也可能由监管机构或第三方机构参与。
  • 架构:保证金系统体系的架构一般包括以下几个模块:
    1. 保证金收付模块:用于实现用户的保证金的存入和退还的功能,一般需要对接银行或第三方支付机构的支付渠道,以实现资金的划拨和结算。
    2. 保证金账务模块:用于实现用户的保证金的变动和查询的功能,一般需要对接平台或第三方支付机构的账户体系,以实现资金的记录和管理。
    3. 保证金规则模块:用于实现用户的保证金的计算和执行的功能,一般需要对接平台或第三方支付机构的业务系统,以实现规则的设定和触发。
    4. 保证金风控模块:用于实现用户的保证金的监测和控制的功能,一般需要对接平台或第三方支付机构的风控系统,以实现风险的评估和预警。

下图为保证金体系架构图
项目支付功能实战-微信支付项目功能设计及库表脚本_第2张图片

账户体系

账号体系的流程、体系和架构:

  • 流程:账号体系的流程一般包括以下几个步骤:
    1. 用户在使用某个互联网产品前,需要注册一个账号,作为用户的唯一标识和凭证。
    2. 用户在登录账号后,可以进行各种业务操作,如充值、消费、转账、提现等,以及查看和修改个人信息、账户信息、账务信息等。
    3. 用户在退出账号后,可以保留或删除账号,以及找回或重置账号的密码或其他信息。
  • 体系:账号体系的体系一般包括以下几个要素:
    1. 账号信息:用于记录用户的基本信息,如用户名、密码、手机号、邮箱等,以及账号的状态、类型、等级等,一般由用户自行填写或修改,也可能由平台或第三方支付机构验证或授权。
    2. 账户信息:用于记录用户的资金信息,如余额、积分、优惠券等,以及账户的属性、限额、规则等,一般由平台或第三方支付机构生成或管理,也可能由用户自行操作或设置。
    3. 账务信息:用于记录用户的资金变动情况,如充值、消费、转账、提现等,以及账务的流水号、时间、金额、状态等,一般由平台或第三方支付机构记录或处理,也可能由用户自行查询或申诉。
  • 架构:账号体系的架构一般包括以下几个模块:
    1. 账号管理模块:用于实现用户的账号的注册、登录、退出、找回、修改等功能,一般需要对接平台或第三方支付机构的用户系统,以实现用户的识别和认证。
    2. 账户管理模块:用于实现用户的账户的充值、消费、转账、提现等功能,一般需要对接平台或第三方支付机构的账户体系,以实现资金的记录和管理。
    3. 账务管理模块:用于实现用户的账务的查询、申诉、核对、对账等功能,一般需要对接平台或第三方支付机构的账务体系,以实现资金的变动和查询。
    4. 账号风控模块:用于实现用户的账号的安全和合规的功能,一般需要对接平台或第三方支付机构的风控系统,以实现账号的监测和控制。

保证金系统体系和账号体系的区别和联系:

  • 区别:保证金系统体系和账号体系的区别主要在于以下几个方面:
    1. 目的:保证金系统体系的目的是为了保证交易的履行和风险控制,而账号体系的目的是为了识别和管理用户。
    2. 范围:保证金系统体系的范围是针对一些特定的交易场景,如期货、外汇、P2P等,而账号体系的范围是针对所有的互联网产品。
    3. 形式:保证金系统体系的形式是一种资金管理机制,而账号体系的形式是一种用户信息和资金信息的集合。
    4. 规则:保证金系统体系的规则是由平台或第三方支付机构制定,也可能由交易双方协商确定,而账号体系的规则是由平台或第三方支付机构制定,也可能由用户自行设置。
  • 联系:保证金系统体系和账号体系的联系主要在于以下几个方面:
    1. 关联:保证金系统体系和账号体系是相互关联的,因为用户的保证金是存放在用户的账户中,而用户的账户是通过用户的账号来识别和管理的。因此,保证金系统体系和账号体系需要协调和配合,以实现交易的顺利进行和用户的便捷使用。例如,用户在缴纳或退还保证金时,需要通过账号登录账户,然后选择支付渠道和金额,进行资金的划拨和结算。用户在查询或变更保证金时,也需要通过账号登录账户,然后查看或修改保证金账户的信息,进行资金的记录和管理。用户在参与或退出交易时,也需要通过账号登录账户,然后触发或执行保证金规则,进行资金的计算和返还。

项目功能逻辑设计

上述我们了解了保证金和账户系统相关的业务概念,下面真正来进入到如何设计保证金这个系统以及支付渠道的选型。

在本项目的保证金缴纳业务中,首先我们要给保证金用户建立一个虚拟的业务账户,这个业务账户的目的就是显示用户账户的总金额、可用余额及冻结金额。为了简便,我们选择对接微信支付、和微信退款。支付则为用户充值,退款即为用户提现。这里提到的保证金虚拟账户不是第三方的资金账户,而是使用数据库创建表来代替账户,也就是在数据库中创建一个表来存储用户的实际资金流转情况。

保证金缴纳后,用户参与竞拍时首先会检查保证金的可用余额是否够用,如果够用,则可参与竞价,出价后会按业务竞拍规则冻结一部分保证金,这时就会产生冻结金额。此时,冻结金额+可用余额=保证金总金额。当用户成交或未中标后冻结的金额会自动解冻,解冻时会扣减冻结的金额并增加可用余额。

保证金功能设计

1、用户账户信息的展示,主要包括总金额、可用余额、冻结金额。其中总金额=可用+冻结金额
2、用户充值:充值主要是调起微信支付的逻辑
3、用户退款:根据用户支付的订单进行退款,退款可分为两种方式,退订单的金额、部分退款。
4、保证金使用记录:展示用户使用保证金的记录,包括,冻结、解冻、支付、提现(退款)等记录。
5、保证金退款进度:展示提交退款申请后的办理进度,用户提交退款申请后,会提交给财务进行审核,审核通过后才会调起微信退款接口进行退款。

库表设计

  • 保证金用户账户表:USER_ACCOUNT
  • 保证金使用记录表:USE_RECORD
  • 保证金支付订单表:ORDER_INFO
  • 保证金支付流水表:PAYMENT_RECORD
  • 保证金提现申请单:REFUND_APPLICATION,用户在app或小程序发起提现申请,交由卖家审核。
  • 保证金退款单表:REFUND_INFO ,此表主要是在调起微信退款单时生成的退款单信息,微信回调后会更新退款单的状态。
  • 异常信息表:ERROR_LOG 当业务发生异常时需要将错误的业务类型保存到异常表中,为后续手动异常处理做准备。

用户账户建表sql

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 '保证金账户表';

保证金使用记录建表sql

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 '保证金订单信息';

保证金支付流水记录建表sql

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 '保证金支付记录信息';

退款申请单建表sql

-- 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 '保证金退款申请单';

退款单记录建表sql

-- 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 '保证金退款记录';

异常信息建表sql

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 '异常信息';

总结

本篇文章主要介绍了保证金相关的业务概念、项目需求、保证金系统架构和充值、提现等流程,最后并贴出了功能设计的代码和脚本。下一节,我们将介绍系统架构中的安全架构设计。

你可能感兴趣的:(项目支付功能实战专栏,微信,java,开发语言)