在线支付平台间交易对账之我见
2008-12-31 23:19 Kevin Zhou 阅读(2721) 评论(8) 编辑 收藏 举报上节“在线支付平台(大多数)采用的加密方法之MD5”中大家的评论给了我很大动力,看来大家还是比较关注在线支付平台的实现。因此我决定继续写下去,可能后来的文章会包括:
· 支付平台数据库设计之我见
· 支付平台间历史交易记录对账实现
· 支付平台间“掉单”的产生及处理方法
· 支付平台管理后台所需实现功能之我见
暂定以上这些内容,路过的朋友请尽情pk,大家共同提高。~~
下面开始正文:
这里我们还是利用上节提到的例子,我这里仅仅描述的是实现的方法和思想,所依据的数据及实现都是模拟环境中的,实际环境中还需要大家再具体应对吧。
下面看对账:首先我们从现实生活中的对账看起,因为我不是做财务,我只能根据平日里和财务同事工作接触过程中,大致描述一下,说错的地方请大家谅解。
对账:无非就是把合作双方shop与Bank的历史交易以表格形势体现出来,然后,双方按照共有的记录(比如order_no,money,order_date),进行核对。
假如shop的2008.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 |
然后shop从bank得到的支付记录如下(假设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实现部分的说明我在文章:在线支付平台间交易对账之我见(补充)进行了说明!