虚拟账户是用来保存用户的交易后发生退换货造成的返还金额.
虚拟账户中的金额两种用途,一用户可以提现二可以进行二次消费,但是必须开启支付密码.
涉及到相关的表结构为:
CREATE TABLE [dbo].[Bank] (
[UserID]int NOT NULL ,
[UserMoney]decimal(18,2) NOT NULL ,
[Points]int NOT NULL ,
[ConsumeSum]decimal(18,2) NOT NULL ,
[ConsumeTimes]int NOT NULL ,
[GiftPoints]int NOT NULL ,
[PointsExpireTime]datetime NULL ,
[LevelSum]decimal(18,2) NOT NULL ,
[LevelTimes]int NOT NULL
)
CREATE TABLE [dbo].[BankIO] (
[AutoID]int NOT NULL IDENTITY(1,1) NOT FOR REPLICATION ,
[UserID]int NOT NULL ,
[FormCode]bigint NULL ,
[MoneySum]decimal(18,2) NULL ,
[Direction]bit NOT NULL ,//IO方向:1存入0取出
[OperTime]datetime NOT NULL ,
[PaymentTypeID]char(2) NULL ,
[GiftSum]decimal(18,2) NULL ,
[InputMan]varchar(20) NULL ,
[ByPeople]varchar(20) NULL ,
[Remark]nvarchar(1000) NULL ,
[IP]nvarchar(20) NULL ,
[IOType]int NULL
)
A. 如何开启支付密码
要求用户验证邮箱或者手机号码.
如果是邮箱验证,则向验证邮箱发送一份验证邮件,用户点击邮件链接即可开始设置支付密码.
如果是手机验证,则向手机发送验证短信,用户输入验证码确认后,即可开始这只验证码.
B. 使用虚拟账户
使用场景一般是在购物车中,用户在提交订单的时候,可以选择使用虚拟账户来支付,这里支付分为两种,虚拟账户金额够订单金额,虚拟账户金额不够.
C. 支付密码可以被锁定,这个时候前台用户不能使用支付密码来用虚拟账户的金额下单.支付密码被锁定的状态可以因为多次输入支付密码错误产生.
D. 下单过程中使用虚拟账户流程
1. 判断用户是否设置过支付密码,如果没有,不显示余额支付
2. 判断用户的虚拟账户中是否还有余额,没有余额,不显示余额支付
3. 用户在输入虚拟账户支付密码后,判断是否支付密码被锁定,如果被锁定,不允许使用支付密码,如果没有锁定,开始验证密码是否正确.
4. 用户密码正确后,将可用余额(<=订单金额)均摊到订单上.这里有一个注意的地方,我们的余额不是用户在确定使用余额支付的时候就从用户账户中扣掉,而是会在订单转成有效的时候扣掉.所以我们在查用户可用余额的时候,要用账户余额减去用户支付表中采用余额支付并且状态是未处理的支付记录中的总余额.
5. 在提交订单的时候,如果用户是采用了余额支付,那么往一张支付表中插入一条记录,状态为未处理.我们有一个后台程序,将这条支付记录同步到后台数据库,并更新状态为已处理.
如果是在线支付订单或者余额支付订单,后台程序会不断的扫描后台的支付记录表,如果发现支付金额>=订单金额,则表示订单支付完成,同时更新订单状态.