銀聯接口C#

銀聯支付:

ChinaPay的會員商戶接入支付平臺,以方便商戶開展網上支付交易。

持卡人從商戶網站中生成訂單信息,通過公共支付交易平臺中的支付網關子系統進行支付的過程,其交易流程包括訂單確認、支付處理、支付完成三個部分,具體流程說明如下:


流程一】訂單確認

1.    持卡人瀏覽商戶網站,選擇支付項目,生成訂單信息

2. 持卡人確認訂單信息,開始支付


流程二】支付處理

3.持卡人確認支付信息,商戶網站開始向支付網關申請支付,支付網關驗證商戶身份合法性和訂單報文的完整性

4.支付網關向持卡人顯示支付渠道選擇界面,持卡人選擇支付渠道

5.持卡人在所選擇渠道上,輸入用戶帳號、密碼及其他安全驗證信息

6.持卡人的安全認證信息得到確認後,進行支付


流程三】支付完成

7.支付渠道向支付網關返回支付結果

8.支付網關向持卡人顯示支付結果,同時通知商戶網站支付結果

9.商戶網站向持卡人顯示商戶交易結果

10.  支付操作完成。


NetPayClient for C#使用說明

名 稱

放置的路徑

用 途

netpay.dll

根據項目工程的需要放置對應路徑下

用於提供數字簽名的方法調用

MerPrk.key

可以放置到任意路徑下,但是需要調用方法指定文件位置和名稱

商戶簽名私鑰

PgPubk.key

可以放置到任意路徑下,但是需要調用方法指定文件位置和名稱

ChinaPay簽名公鑰


創建公/私鑰對象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判斷當前公私鑰的狀態。


訂單簽名函數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中。


驗證交易應答函數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中。


對一段字符串的簽名函數Sign

方法說明:

publicString Sign (String SignMsg)

作用:

對傳入的參數字符串進行數字簽名。

參數說明:

StringSignMsg 用於要簽名的字符串


返回值:

  String CheckValue[256]即NetPayClient根據上述輸入參數生成的商戶數字簽名,長度爲256字節的        字符串。

注:該方法在netpay. NETPAY中。


對一段字符串的簽名驗證函數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


交易提交數據內容

商戶向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

         


交易接收數據的內容

  當消費支付交易完成時,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) 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章