http://www.cnblogs.com/taoqingxue/p/3574435.html
1.1 支付平台的接入
1.2 支付请求、支付结果返回的传输安全
1.3 支付站点、商户站点、银行网关的交互
1.4 支付状态不同步的处理
支付平台可以避免商户站点去实现多种支付方式的对接,而只需要与支付平台对接。
商户站点接入支付平台,支付平台接入各银行支付网关,示意如下:
商户站点以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) 用户通过浏览器浏览商户站点选购商品,确认购买后点击“立刻购买”提交到商户站点
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)商户在需要时将商户的支付平台账户中的款项进行提现(兑换成实体的银行存款)
银行支付状态与支付平台及商户站点支付状态不同步时的处理,描述如下:
Ø 银行支付状态一定正确,通过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
基本参数说明,如下:
参数 |
名称 |
说明 |
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>
支付返回参数说明,如下:
参数 |
名称 |
说明 |
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验证签名,并检查订单号是否已处理,币种、金额等是否与原始订单一致等,然后进行后续处理。
参数 |
名称 |
说明 |
MerchantID |
商户编号 |
|
TransactionID |
客户端流水号 |
|
RefundAmount |
退款金额 |
|
CurrencyCode |
币种代码 |
|
RefundReason |
退款说明 |
|
Sign |
签名 |
|
回复正文一行一项,格式为参数名称/值对(key=value),其中value 是 URL 编码的字符串。需要对此回复数据进行适当解析,然后进行 URL解码。
参数 |
名称 |
说明 |
MerchantID |
商户编号 |
|
TransactionID |
客户端流水号 |
|
RefundAmount |
退款金额 |
|
CurrencyCode |
币种代码 |
|
Status |
返回结果 |
0(失败)/ 1(成功) |
Result |
结果描述 |
|
Sign |
签名 |
|
有两种方式进行查询:按日期段查询、按订单号查询。
按日期段查询参数,将对查询结果进行分页, 每页50条记录:
参数 |
名称 |
说明 |
MerchantID |
商户编号 |
|
BeginDate |
开始日期 |
|
EndDate |
结束日期 |
|
PageIndex |
当前页 |
从0开始 |
Sign |
签名 |
|
按订单号查询参数:
参数 |
名称 |
说明 |
MerchantID |
商户编号 |
|
TransactionID |
客户端流水号 |
|
Sign |
签名 |
|
回复正文一行一项,格式为参数名称/值对(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 |
签名 |
|