在线支付设计

来源:互联网 发布:php addslashes 编辑:程序博客网 时间:2024/04/29 14:26

探讨在线支付平台的实现

1.1        支付平台的接入

1.2        支付请求、支付结果返回的传输安全

1.3        支付站点、商户站点、银行网关的交互

1.4        支付状态不同步的处理


 

1.1   支付平台的接入

支付平台可以避免商户站点去实现多种支付方式的对接,而只需要与支付平台对接。

商户站点接入支付平台,支付平台接入各银行支付网关,示意如下:

 

1.2   支付请求、支付结果返回的传输安全

商户站点以POST方式发送支付请求到支付平台的安全考虑,简述如下:

商户站点生成POST支付请求表单时对表单参数附加上商户密钥一起进行MD5签名,商户密钥由支付平台和商户各执一份,并且支付平台保证商户密钥与其它商户不相同,其他商户无法伪造MD5签名,当支付请求到达支付平台后,支付平台使用商户密钥按相同算法生成MD5签名,然后验证商户发送过来的MD5签名是否与支付平台生成的一致,从而可以保证支付请求不可篡改及伪造,对支付平台通过POST方式发送支付结果信息到商户站点进行相同处理方式。

商户站点发送信息到支付平台,示意图如下:

 

说明如下:

1)      商户站点有一个参数串M

2)      商户站点用摘要算法计算出“M+商户密钥”的消息摘要MD

3)      商户站点将参数串M和MD合并在一起,通过网络传送到支付平台

4)      支付平台收到商户站点的参数串M和MD

5)      支付平台采用相同摘要算法对“M+商户密钥”重新计算消息摘要得到MD'

6)      支付平台比较MD与MD'是否相等

7)      如果结果相等,则表明参数串M在传输过程中未被篡改

时序图如下:


1.3   支付站点、商户站点、银行网关的交互

支付站点、商户站点、银行网关的交互,如下图所示:

 

详细说明如下:

1)      用户通过浏览器浏览商户站点选购商品,确认购买后点击“立刻购买”提交到商户站点

2)      商户站点显示订单信息给用户

3)      用户点击“下一步”后,提交到支付平台

4)      支付平台返回选择支付方式页面

5)      用户选择支付方式,点击“下一步”,提交到支付平台

6)      支付平台生成确认界面返回给用户

7)      用户核对信息,点击“去银行支付”,提交到银行支付网关

8)      银行网关返回支付信息录入页面给用户

9)      用户输入相应的银行卡卡号、密码等信息,然后提交到银行网关

10)    银行网关验证用户数据,并按照银行网关接口规范将处理结果发送给支付平台

11)    支付平台验证数据并进行订单状态、商户余额等处理,并返回通知确认到银行网关

12)    支付平台异步调用商户站点页面(同步商户订单状态等)

13)    商户站点显示支付结果给用户,完成整个支付流程

 

直连银行交互,如下图所示:

 


总业务说明:

 

网上支付业务流程(各银行网关接口实现方式略有不同),说明如下:

1) 用户通过浏览器浏览商户站点选购商品,放入购物车后点击“立刻购买”提交到商户站点

2) 商户站点显示订单信息给用户

3) 用户选择相应的支付方式,选择“下一步”,提交到商户站点

4) 商户站点根据支付平台的接口文档要求,生成去银行支付表单页面给用户

5) 用户点击“去银行支付”,提交到支付平台

6) 支付平台验证该支付订单的商户身份、数据有效性,并转交支付命令到银行网关

7) 银行网关生成支付页面显示给用户

   同时在用户浏览器与支付网关之间建立SSL连接

8) 用户输入相应的银行卡卡号、密码等信息,然后提交到银行网关

9) 银行网关验证用户数据,并按照银行网关接口规范将处理结果发送给支付平台

   银行网关转发到银行后台业务系统,银行后台业务系统处理后返回处理结果给银行网关

10) 支付平台验证数据并进行订单状态、商户余额等处理,并返回通知确认到银行网关

11) 支付平台异步调用商户站点页面(同步商户订单状态等)

12) 浏览器重定向到商户站点页面

13) 商户站点显示支付结果给用户,完成整个支付流程

注:此图中,选择支付方式在商户站点实现(直连银行) 用户选择支付方式的步骤也可以在支付平台实现


有担保功能的支付平台的支付流程为:

 

(1)买家将实体资金转移到买家的支付平台账户中

(2)买家购买商户的商品(或服务)

(3)买家发出支付授权,支付平台将买家账户中相应的资金转移到支付平台自己的账户中保管

(4)支付平台通知商户已经收到货款,可以发货

(5)商户完成发货(或完成服务)

(6)买家收到货物后,确认可以付款

(7)支付平台将临时保管的资金划拨到商户的支付平台账户中

(8)商户在需要时将商户的支付平台账户中的款项进行提现(兑换成实体的银行存款)

 

 

 

1.4   支付状态不同步的处理

银行支付状态与支付平台及商户站点支付状态不同步时的处理,描述如下:

Ø  银行支付状态一定正确,通过Job同步到支付平台,保证支付平台支付状态也正确

Ø  支付平台状态正确后,通过再次发送支付结果到商户站点,商户站点进行支付状态的同步

Ø  商户站点必须能够处理同一支付结果的多次通知的情况

 

银行支付状态与支付平台状态同步,如下图所示:

 

支付平台状态与商户站点状态同步,如下图所示:

 

 





http://www.cnblogs.com/taoqingxue/p/3574483.html


探讨在线支付平台支付接口的设计

1.      支付接口.... 2

1.1.       支付请求参数... 2

1.2.       支付返回参数... 3

2.      退款接口.... 4

1.3.       退款请求参数... 4

1.4.       退款返回参数... 4

3.      查询接口.... 5

1.5.       查询请求参数... 5

1.6.       查询返回参数... 5

 


1.      支付接口

1.1.      支付请求参数

基本参数说明,如下:

 

参数

名称

说明

MerchantID

商户编号

必填,由支付平台提供,如:100000

TransactionID

客户端流水号

必填,40位长度,商户提交的客户端流水号必须唯一

OrderID

商户订单号

必填,50位长度

Amount

交易金额

必填,实际交易金额,正数(小数只能保留2位),如:1234.56

CurrencyCode

币种代码

必填,CNY人民币/USD美元

ReturnUrl

支付完成跳转地址

选填,200位长度

浏览器重定向到的页面

NotifyUrl

后台通知的地址

选填,200位长度

支付成功,后台主动通知的地址

Description

商品描述

选填,500位长度

PaymentCatalog

支付类别

选填,500位长度,以“,”分隔,为空则显示所有支付类别,按照设置的顺序显示,如“1,2,3”

PaymentWay

支付方式

选填,500位长度,以“,”分隔,为空则显示所有支付方式,按照设置的顺序显示,如“ICBC,CCB,PayPal”

MerchantData

商户私有信息

选填,500位长度,原样返回

Language

语言

必填,ZH简体中文,HK繁体中文,EN英文

UserID

用户标识

必填,100位长度,用户在商户站点注册的账户标识

UserName

用户名称

必填,100位长度,用户在商户站点注册的账户名称

Sign

签名

必填,32位长度

 

生成签名的步骤:

1)      使用&连接各参数名称/值对,最终格式示例如下:

MerchantID=000001&TransactionID=1234567890&OrderID=1234567890

&Amount=1234.56&CurrencyCode=CNY

&ReturnUrl=http://xxx/MerchantDemo/PayReturn.aspx

&NotifyUrl=http://xxx/MerchantDemo/PayNotify.aspx

&Description=绚丽夺目的Retina 显示屏&PaymentCatalog=1,2,3&PaymentWay=

&MerchantData=test&Language=ZH&UserID=testuser&UserName=测试用户

2)      调用在线支付平台公共方法(.NET)SecurityUtil.CreateSign生成签名

 

商户站点以POST方式将支付请求发送到在线支付平台,FORM表单示例如下:

<form name="sendOrder" method="POST" action="http://xxx/Gateway/Pay.aspx">

<input type="hidden" name="MerchantID" value="000001"/>

<input type="hidden" name="TransactionID" value="1234567890"/>

<input type="hidden" name="OrderID" value="1234567890"/>

<input type="hidden" name="Amount" value="1234.56"/>

<input type="hidden" name="CurrencyCode" value="CNY"/>

<input type="hidden" name="ReturnUrl" value="http://xxx/MerchantDemo/PayReturn.aspx"/>

<input type="hidden" name="NotifyUrl" value="http://xxx/MerchantDemo/PayNotify.aspx"/>

<input type="hidden" name="Description" value="绚丽夺目的Retina 显示屏"/>

<input type="hidden" name="PaymentCatalog" value="1,2,3"/>

<input type="hidden" name="PaymentWay" value=""/>

<input type="hidden" name="MerchantData" value="test"/>

<input type="hidden" name="Language" value="ZH"/>

<input type="hidden" name="UserID" value="testuser"/>

<input type="hidden" name="UserName" value="testuser"/>

<input type="hidden" name="Sign" value="FC8A5AA8D05A5DF5C7AB2C245212EB2C"/>

</form>

1.2.      支付返回参数

支付返回参数说明,如下:

 

参数

名称

说明

MerchantID

商户编号

原样返回

TransactionID

客户端流水号

原样返回

OrderID

商户订单号

原样返回

Amount

订单金额

原样返回

CurrencyCode

币种代码

原样返回

PaymentRequestID

支付平台流水号

 

MerchantData

商户私有信息

原样返回

PaymentCatalog

支付类别

原样返回

PaymentWay

支付方式

原样返回

Status

支付状态信息

Y(成功)/ N(失败)

Result

结果描述

当失败时,为失败的描述信息

UserID

用户标识

原样返回

UserName

用户名称

原样返回

Sign

签名

必填,32位长度

支付结果信息会按照一定的规律发送到商户站点指定的后台通知的地址(通过 POST 方式发送),直到达到指定次数或者商户站点返回成功信息“Y”给在线支付平台。

 

使用&连接各返回参数名称/值对,最终格式示例如下:

MerchantID=000001&TransactionID=1234567890&OrderID=1234567890&Amount=1234.56

&CurrencyCode=CNY&PaymentRequestID=000001101128093059000001

&MerchantData=test&PaymentCatalog=1,2,3&PaymentWay=&Status=Y

&Result=支付成功!&UserID=testuser&UserName=测试用户

然后使用商户密钥进行签名,并生成FORM表单。

 

在线支付平台通过POST方式发送支付结果信息到商户站点,FORM表单示例如下:

<form name="sendOrder" method="POST" action="http://xxx/MerchantDemo/PayNotify.aspx”/>

<input type="hidden" name="MerchantID" value="000001”/>

<input type="hidden" name="TransactionID" value="1234567890”/>

<input type="hidden" name="OrderID" value="1234567890”/>

<input type="hidden" name="Amount" value="1234.56”/>

<input type="hidden" name="CurrencyCode" value="CNY”/>

<input type="hidden" name="PaymentRequestID" value="000001101128093059000001”/>

<input type="hidden" name="MerchantData" value="test”/>

<input type="hidden" name="PaymentCatalog" value="1,2,3”/>

<input type="hidden" name="PaymentWay" value="”/>

<input type="hidden" name="Status" value="Y”/>

<input type="hidden" name="Result" value="支付成功!”/>

<input type="hidden" name="UserID" value="testuser”/>

<input type="hidden" name="UserName" value="testuser"/>

<input type="hidden" name="Sign" value="8CCC53AD8FC4F376E1055A049AE2C87F”/>

</form>

商户站点调用在线支付平台提供的方法(.NET)SecurityUtil.VerifySign验证签名,并检查订单号是否已处理,币种、金额等是否与原始订单一致等,然后进行后续处理。

2.      退款接口

1.3.      退款请求参数

参数

名称

说明

MerchantID

商户编号

 

TransactionID

客户端流水号

 

RefundAmount

退款金额

 

CurrencyCode

币种代码

 

RefundReason

退款说明

 

Sign

签名

 

1.4.      退款返回参数

回复正文一行一项,格式为参数名称/值对(key=value),其中value 是 URL 编码的字符串。需要对此回复数据进行适当解析,然后进行 URL解码。

参数

名称

说明

MerchantID

商户编号

 

TransactionID

客户端流水号

 

RefundAmount

退款金额

 

CurrencyCode

币种代码

 

Status

返回结果

0(失败)/ 1(成功)

Result

结果描述

 

Sign

签名

 

3.      查询接口

有两种方式进行查询:按日期段查询、按订单号查询。

1.5.      查询请求参数

按日期段查询参数,将对查询结果进行分页, 每页50条记录:

参数

名称

说明

MerchantID

商户编号

 

BeginDate

开始日期

 

EndDate

结束日期

 

PageIndex

当前页

从0开始

Sign

签名

 

 

按订单号查询参数:

参数

名称

说明

MerchantID

商户编号

 

TransactionID

客户端流水号

 

Sign

签名

 

1.6.      查询返回参数

回复正文一行一项,格式为参数名称/值对(key=value),其中value 是 URL 编码的字符串。需要对此回复数据进行适当解析,然后进行 URL解码。

 

按日期段查询返回参数:

参数

名称

说明

MerchantID

商户编号

 

ResultData

结果数据

JSON格式

Sign

签名

 

 

按订单号查询返回参数:

参数

名称

说明

MerchantID

商户编号

 

TransactionID

客户端流水号

 

OrderID

商户订单号

 

Amount

订单金额

 

CurrencyCode

币种代码

 

PaymentRequestID

支付平台流水号

 

Description

商品描述

 

PaymentCatalog

支付类别

 

PaymentWay

支付方式

 

MerchantData

商户私有信息

 

Status

状态

0(未支付)/ 1(已支付)

RefundAmount

已退款金额

 

UserID

用户标识

 

UserName

用户名称

 

Sign

签名

 


原创粉丝点击