代码改变世界

在线支付平台间交易对账之我见

2008-12-31 23:19  Kevin Zhou  阅读(2718)  评论(8编辑  收藏  举报

上节在线支付平台(大多数)采用的加密方法之MD5中大家的评论给了我很大动力,看来大家还是比较关注在线支付平台的实现。因此我决定继续写下去,可能后来的文章会包括:

·        支付平台数据库设计之我见

·        支付平台间历史交易记录对账实现

·        支付平台间掉单的产生及处理方法

·        支付平台管理后台所需实现功能之我见

暂定以上这些内容,路过的朋友请尽情pk,大家共同提高。~~

 

下面开始正文:

这里我们还是利用上节提到的例子,我这里仅仅描述的是实现的方法和思想,所依据的数据及实现都是模拟环境中的,实际环境中还需要大家再具体应对吧。

下面看对账:首先我们从现实生活中的对账看起,因为我不是做财务,我只能根据平日里和财务同事工作接触过程中,大致描述一下,说错的地方请大家谅解。

对账:无非就是把合作双方shopBank的历史交易以表格形势体现出来,然后,双方按照共有的记录(比如order_no,money,order_date,进行核对。

假如shop2008.12.25-2008.12.26的交易记录如下:

Status : 0-未支付; 99-已成功交易

Order_date :交易日期

Money : 金额

Order_no : 交易号

order

status

order_date

money

order_no

99

20081225

50

10000020

0

20081225

100

10000021

99

20081225

20

10000022

0

20081225

50

10000023

0

20081225

100

10000024

0

20081226

100

10000025

0

20081226

75

10000026

99

20081226

75

10000027

99

20081226

75

10000028

99

20081226

20

10000029

 

然后shopbank得到的支付记录如下(假设bank的记录都是成功支付的记录):

Order_date :交易日期

Money : 金额

Order_no : 交易号

Bank_no : 银行处理交易号

Bank_date : 银行处理日期

order_import

order_no

order_date

bank_no

bank_date

money

10000020

20081225

90000010

20081225

50

10000022

20081225

90000012

20081225

20

10000024

20081225

90000014

20081225

100

10000027

20081226

90000017

20081226

75

10000028

20081226

90000018

20081226

75

10000029

20081226

90000019

20081226

20

 

现在我们开始对账:

为了让大家看的更清楚,我这里把两张表做了一下合并和对比

order

 

order_import

status

order_date

money

order_no

 

order_no

order_date

bank_no

bank_date

money

99

20081225

50

10000020

10000020

20081225

90000010

20081225

50

0

20081225

100

10000021

 

 

 

 

 

 

99

20081225

20

10000022

10000022

20081225

90000012

20081225

20

0

20081225

50

10000023

 

 

 

 

 

 

0

20081225

100

10000024

 

10000024

20081225

90000014

20081225

100

0

20081226

100

10000025

 

 

 

 

 

 

0

20081226

75

10000026

 

 

 

 

 

 

99

20081226

75

10000027

10000027

20081226

90000017

20081226

75

99

20081226

75

10000028

10000028

20081226

90000018

20081226

75

99

20081226

20

10000029

10000029

20081226

90000019

20081226

20

:

红色交易记录为shop里未支付的记录,因为这些交易未支付,所以在bank端没有产生相应的支付记录

浅蓝色的记录为shop里已支付的记录,但是由于某些原因,在bank通知shop已支付的过程的出现了错误,网络问题,等等。这类问题我们这里统称为“掉单”。

在后期的blog中我会对“掉单”的产生以及处理办法进行相应的分析。

 

谈过了对账理论,现在来谈一下具体的实现,一般这样的逻辑处理我建议在sp(存储过程)里实现,下面就是脚本:

 
1,建立表格,准数据
--create table order
create table det_shop_order(
    order_no varchar(50),
    money float,
    order_date varchar(14),
    status int
)
--create table order_import
create table det_shop_order_import(
    order_no varchar(50),
    money float,
    order_date varchar(14),
    bank_no varchar(50),
    bank_date varchar(14)
)
--init order data
insert into det_shop_order(order_no, money, order_date, status)
select '10000020',50,'20081225',99
union all select '10000021',100,'20081225',0
union all select '10000022',20,'20081225',99
union all select '10000023',50,'20081225',0
union all select '10000024',100,'20081225',0
union all select '10000025',100,'20081226',0
union all select '10000026',75,'20081226',0
union all select '10000027',75,'20081226',99
union all select '10000028',75,'20081226',99
union all select '10000029',20,'20081226',99
--init order_import data
insert into det_shop_order_import(order_no,order_date,bank_no,bank_date,money)
select '10000020','20081225','90000010','20081225',50
union all select '10000022','20081225','90000012','20081225',20
union all select '10000024','20081225','90000014','20081225',100
union all select '10000027','20081226','90000017','20081226',75
union all select '10000028','20081226','90000018','20081226',75
union all select '10000029','20081226','90000019','20081226',20
--onlinepay check sp

 

2, 对账实现

create proc dep_order_check(
    @startdate varchar(14),    --对账开始日期
    @enddate varchar(14),    --对账结束日期
    @shopcount int output,    --此时间段内shop交易数
    @shopsum float output,    --此时间段内shop交易mony总和
    @bankcount int output,    --此时间段内bank交易数
    @banksum float output    --此时间段内bank交易mony总和
)
as
    
----抽取临时集合,对账均以此记录为标准
    create table #temptable(order_no varchar(50))
    insert into #temptable(order_no)
    select o.order_no from det_shop_order o
    where order_date between @startdate and @enddate

----计算此时间段内shop的交易数,交易money总和
    select @shopcount = count(dso.order_no),
        @shopsum = isnull(sum(dso.money), 0)
    from det_shop_order dso
    inner join #temptable t1
    on dso.order_no = t1.order_no
    where dso.status = 99    --99代表shop记录里已成功支付的订单

----计算此时间段内bank的交易数,交易money总和
    select @bankcount = count(dsoi.order_no),
        @banksum = isnull(sum(dsoi.money), 0)
    from det_shop_order_import dsoi
    inner join #temptable t2
    on dsoi.order_no = t2.order_no

----统计掉单(即shop里status为0,单bank里存在此单记录)
    select dso2.order_no, dso2.order_date, dso2.money
    from det_shop_order dso2
    inner join det_shop_order_import dsoi2
    on dso2.order_no = dsoi2.order_no
    inner join #temptable t3
    on dso2.order_no = t3.order_no
    where dso2.status = 0    --0代表shop记录里未支付的订单

 

 

3, 执行sp,显示对账结果

declare @sc int, @su float, @bc int, @bs float
exec dep_order_check '20081225','20081226', 
    @sc output, @su output, @bc output, @bs output
select @sc, @su, @bc, @bs
 

order_no

order_date

money

 

10000024

20081225

100

 

 

 

 

 

shop count

shop sum

bank count

bank sum

5

240

6

340

 

后记:

写着写着发现了,一个Live Writer的bug: 就是从word复制 表格到 Live Writer 总是无法粘贴,哪位路过的高手有解决办法,请赐教!~~

最后呢,今天是2008.12.31,还有不到一个小时就2009了,祝福大家元旦快乐,新年快乐!


不好意思,看了大家的评论,感觉此文章我没有写完。此文章的aspx实现部分的说明我在文章:在线支付平台间交易对账之我见(补充)进行了说明!