銀聯支付:
ChinaPay的會員商戶接入支付平臺,以方便商戶開展網上支付交易。
持卡人從商戶網站中生成訂單信息,通過公共支付交易平臺中的支付網關子系統進行支付的過程,其交易流程包括訂單確認、支付處理、支付完成三個部分,具體流程說明如下:
【流程一】訂單確認
1. 持卡人瀏覽商戶網站,選擇支付項目,生成訂單信息
2. 持卡人確認訂單信息,開始支付
【流程二】支付處理
3.持卡人確認支付信息,商戶網站開始向支付網關申請支付,支付網關驗證商戶身份合法性和訂單報文的完整性
4.支付網關向持卡人顯示支付渠道選擇界面,持卡人選擇支付渠道
5.持卡人在所選擇渠道上,輸入用戶帳號、密碼及其他安全驗證信息
6.持卡人的安全認證信息得到確認後,進行支付
【流程三】支付完成
7.支付渠道向支付網關返回支付結果
8.支付網關向持卡人顯示支付結果,同時通知商戶網站支付結果
9.商戶網站向持卡人顯示商戶交易結果
10. 支付操作完成。
NetPayClient for C#使用說明
名 稱 |
放置的路徑 |
用 途 |
netpay.dll |
根據項目工程的需要放置對應路徑下 |
用於提供數字簽名的方法調用 |
MerPrk.key |
可以放置到任意路徑下,但是需要調用方法指定文件位置和名稱 |
商戶簽名私鑰 |
PgPubk.key |
可以放置到任意路徑下,但是需要調用方法指定文件位置和名稱 |
ChinaPay簽名公鑰 |
l 創建公/私鑰對象buildKey
publicboolean buildKey (String MerId, int KeyUsage, String KeyFile)
用於創建私/公鑰的對象,用於簽名或者驗證簽名。
參數說明:
StringMerId 商戶號,長度爲15個字節的數字串,由ChinaPay分配。
intKeyUsage 使用私/公鑰的方式,固定爲 0 。
String KeyFile 私/公鑰的文件路徑(包含文件名稱)。例如:"d:\\MerPrk.key”
返回值:
true 表示找到正確的私/公鑰文件,並且可以調用簽名方法簽名或者簽名驗證方法驗證簽名, false
表示創建私/公鑰對象失敗,不可以使用簽名方法和簽名驗證方法。
注:該方法在netpay. NETPAY中, 也可通過NetPay.NETPAY.PrivateKeyFlag或者NetPay.NETPAY.PublicKeyFlag判斷當前公私鑰的狀態。
l 訂單簽名函數signOrder
方法說明:
publicString signOrder(String MerId, String OrdId, String TransAmt, String CuryId,String TransDate, String TransType)
對傳入的參數進行數字簽名。
參數說明:
StringMerId 商戶號,長度爲15個字節的數字串,由ChinaPay分配。
StringOrdId 訂單號,長度爲16個字節的數字串,由商戶系統生成,失敗的訂單號允許重複支付。
StringTransAmt 交易金額,長度爲12個字節的數字串,例如:數字串"000000001234"表示12.34元。
StringCuryId 貨幣代碼, 長度爲3個字節的數字串,目前只支持人民幣,取值爲"156" 。
StringTransDate 交易日期,長度爲8個字節的數字串,表示格式爲:YYYYMMDD。
String TransType 交易類型,長度爲4個字節的數字串,取值範圍爲:"0001"和"0002", 其中"0001"表示消費交易,"0002"表示退貨交易。返回值:
StringCheckValue[256] 即NetPayClient根據上述輸入參數生成的商戶數字簽名,長度爲256字節的字符串。
注:該方法在netpay. NETPAY中。
l 驗證交易應答函數verifyTransResponse
方法說明:
publicboolean verifyTransResponse(String MerId, String OrdId, String TransAmt, StringCuryId, String TransDate, String TransType, String OrderStatus, StringCheckValue)
作用:
驗證傳入參數的數字簽名是否正確。
參數說明:
StringMerId 商戶號,長度爲15個字節的數字串,由ChinaPay分配。
StringOrdId 訂單號,長度爲16個字節的數字串,由商戶系統生成,失敗的訂單號允許重複支付。
StringTransAmt 交易金額,長度爲12個字節的數字串,例如:數字串"000000001234"表示12.34元。
StringCuryId 貨幣代碼, 長度爲3個字節的數字串,目前只支持人民幣,取值爲"156" 。
StringTransDate 交易日期,長度爲8個字節的數字串,表示格式爲: YYYYMMDD。
StringTransType 交易類型,長度爲4個字節的數字串,取值範圍爲:"0001"和"0002",其中"0001"表示消費交易,"0002"表示退貨交易。
StringOrderStatus 交易狀態,長度爲4個字節的數字串。詳見交易狀態碼說明。
StringCheckValue 校驗值,即ChinaPay對交易應答的數字簽名,長度爲256字節的字符串。
返回值:
true 表示成功,即該交易應答爲ChinaPay所發送,商戶根據“交易狀態”進行後續處理;否則表示失敗,即無效應答,商戶可忽略該應答。
注:該方法在netpay. NETPAY中。
l 對一段字符串的簽名函數Sign
方法說明:
publicString Sign (String SignMsg)
作用:
對傳入的參數字符串進行數字簽名。
參數說明:
StringSignMsg 用於要簽名的字符串
返回值:
String CheckValue[256]即NetPayClient根據上述輸入參數生成的商戶數字簽名,長度爲256字節的 字符串。
注:該方法在netpay. NETPAY中。
l 對一段字符串的簽名驗證函數verifyAuthToken
方法說明:
publicboolean verifyAuthToken (String PlainData, String CheckValue)
作用:
驗證目標字符串的數字簽名是否正確。
參數說明:
StringPlainData 用於數字簽名的字符串。
StringCheckValue 校驗值,要驗證的字符串的數字簽名,長度爲256字節的字符串。
返回值:
true 表示驗證通過成功;否則表示失敗。
注:該方法在netpay. NETPAY中。
示例代碼
string MerId, OrdId,TransAmt, CuryId, TransDate, TransType,ChkValue;
string plainData,ChkValue2 ;
//初始化key文件:
if (NetPay.NETPAY.buildKey("808080290000001", 0, "c:\\key\\MerPrk.key"))
{
showInfo(">>設置私鑰:成功。\r\n\r\n");
}
// 對訂單的簽名
if (NetPay.NETPAY.PrivateKeyFlag)
{
string ChkValue = NetPay.NETPAY. signOrder(MerId, OrdId, TransAmt, CuryId, TransDate, TransType) ;
showInfo(">>明文:" + ostr + "\r\n\r\n");
showInfo(">>密文:" + ChkValue + "\r\n\r\n");
}
// 對一段字符串的簽名
string plainData = "8080802900000010000000010273765000000000001156201008060001";
if (NetPay.NETPAY.PrivateKeyFlag)
{
string ChkValue2 = NetPay.NETPAY. Sign(plainData);
showInfo(">>明文:" + ostr + "\r\n\r\n");
showInfo(">>密文:" + ChkValue + "\r\n\r\n");
}
String MerId,OrdId, TransAmt, CuryId, TransDate, TransType,ChkValue;
String plainData,ChkValue2
//初始化key文件:
if (NetPay.NETPAY.buildKey("999999999999999", 0, "c:\\key\\PgPubk.key"))
{
showInfo(">>設置公鑰:成功。\r\n\r\n");
}
//驗簽訂單
if (NetPay.NETPAY.PublicKeyFlag)
{
bool flag= NetPay.NETPAY.verifyTransResponse(MerId,OrdId, TransAmt,CuryId, TransDate, TransType, OrderStatus, ChkValue); // ChkValue爲ChinaPay應答傳回的域段
showInfo(">> 明文:" + ostr + "\r\n\r\n");
showInfo(">>密文:" + check + "\r\n\r\n");
showInfo(">>驗籤:" + result + "\r\n\r\n");
if(!flag) {
//簽名驗證錯誤處理
}
}
// 對一段字符串的簽名驗證
plainData = "testsign data ";
if (NetPay.NETPAY.PublicKeyFlag)
{
bool result = NetPay.NETPAY.verifyAuthToken(plainData, ChkValue2); // ChkValue2爲ChinaPay應答傳回的域段
showInfo(">>明文:" + ostr + "\r\n\r\n");
showInfo(">>密文:" + check + "\r\n\r\n");
showInfo(">>驗籤:" + result + "\r\n\r\n");
if(!flag) {
//簽名驗證錯誤處理
}
}
支付版本:
接入地址:
ChinaPay的網上支付服務採用WEB服務的方式允許商戶接入,接收交易數據的地址爲:
測試環境:http://payment-test.chinapay.com/pay/TransGet
生產環境:https://payment.chinapay.com/pay/TransGet
l 交易提交數據內容
商戶向ChinaPay的支付接入地址提交訂單信息,提交頁面中表單(FORM)的應該包括如下(注意各字段的大小寫):
<form action="https://payment.ChinaPay.com/pay/TransGet"METHOD=POST> (這裏action的內容爲提交交易數據的URL地址)
<input type=hidden name="MerId"value="808080290000001"/> (MerId爲ChinaPay統一分配給商戶的商戶號,15位長度,必填)
<input type=hidden name="OrdId"value="0000000000000006"/> (商戶提交給ChinaPay的交易訂單號,16位長度,必填)
<input type=hidden name="TransAmt"value="000000001234"/> (訂單交易金額,12位長度,左補0, 必填,單位爲分)
<input type=hidden name="CuryId"value="156"/> (訂單交易幣種,3位長度,固定爲人民幣156, 必填)
<input type=hidden name="TransDate"value="20070801"/>(訂單交易日期,8位長度,必填)
<input type=hidden name="TransType"value="0001"/> (交易類型,4位長度,必填)
<input type=hidden name="Version"value="20070129"/>(支付接入版本號,必填)
<input type=hidden name="BgRetUrl"value="http://www.example.com/pay/Bgreturn.jsp"/> (後臺交易接收URL,長度不要超過80個字節,必填)
<input type=hidden name="PageRetUrl"value="www.example.com/pay/Pgreturn.jsp "/> (頁面交易接收URL,長度不要超過80個字節,必填)
<input type=hidden name="GateId"value="">(支付網關號,可選)
<input type=hidden name="Priv1"value="Memo">(商戶私有域,長度不要超過60個字節)
<input type=hidden name="ChkValue" value="X…X">(256字節長的ASCII碼,爲此次交易提交關鍵數 據的數字簽名,必填)
PageRetUrl爲頁面接受應答地址,用於引導使用者返回支付後的商戶網站頁面。
BgRetUrl 爲後臺接受應答地址,用於商戶記錄交易信息和處理,對於使用者是不可見的。商戶填寫該地址時,URL不能包含參數,如果需要填寫參數,可把參數填寫在“商戶私有域”Priv1字段中。另外ChinaPay會根據後臺發送的http的返回碼來判定是否重新發送後臺應答流水,以確保後臺應答的接收。
Priv1表示 “商戶私有域”,在支付版本20070129中會參與數字簽名,商戶通過此字段向Chinapay發送的信息,Chinapay依原樣填充返回給商戶。
GateId爲可選項,表示 “支付網關號”,如填寫GateId(支付網關號),則消費者將直接進入支付頁面,否則進入網關選擇頁面。
OrdId,表示 “訂單號”, 該域段的內容可以完全由用戶自己定義。
商戶發送給ChinaPay的交易數據均需要進行數字簽名。對於版本號爲20070129的簽名數據使用客戶端NetPayClient的“對一段字符串的簽名函數”。方法名稱爲:publicString Sign (String SignMsg)
對於版本爲20070129的數字簽名採用的是對一段字符串的簽名,因此在簽名的時候需要按照一定順序拼接字符串,順序如下表:
MerId |
OrdId |
TransAmt |
CuryId |
TransDate |
TransType |
Priv1 |
l 交易接收數據的內容
當消費支付交易完成時,ChinaPay會將交易應答信息發送給商戶,對於頁面易接收地址和後臺交易接收地址都會收到交易接收數據,應答的數據域段包括如下內容:(以頁面Form數據爲例,注意大小寫,後臺應答數據的發送的域段名和下面的一致)
<form name="SendToMer"method="post" action="">(這裏action的內容爲提交交易數據的URL地址)
<inputtype="hidden" name="merid" value="808080290000001"/>
<inputtype="hidden" name="orderno" value="0000000010096806"/>
<inputtype="hidden" name="transdate" value="20070801"/>
<inputtype="hidden" name="amount" value="000000001234"/>
<inputtype="hidden" name="currencycode" value="156"/>
<inputtype="hidden" name="transtype" value="0001"/>
<inputtype="hidden" name="status" value="1001"/>
<inputtype="hidden" name="checkvalue" value=" X…X "/>
<inputtype="hidden" name="GateId" value=" 0001"/>
<inputtype="hidden" name="Priv1" value=" Memo"/>
</form>
說明:
status 表示交易轉態,只有"1001"的時候才爲交易成功,其他均爲失敗,因此在驗證簽名數據爲ChinaPay發出的以後,還需要判定交易狀態代碼爲"1001"。
當消費支付交易完成時,ChinaPay會將交易應答信息發送給商戶,對於頁面交易接收地址和後臺交易接收地址都會收到交易接收數據,而對於接收到的應答數據,商戶需要對其驗證簽名以確定是由ChinaPay發出的應答數據。使用的NetPayClient的“驗證交易應答函數”。方法名稱爲:publicboolean verifyTransResponse(String MerId, String OrdId, String TransAmt, StringCuryId, String TransDate, String TransType, String OrderStatus, StringCheckValue)