如果把商戶網站使用第三方支付平臺(比如支付寶)的原理搞清楚,那編程就變得簡單多了。
整個過程大致這樣:
?
1、商戶與支付寶簽約。
2、在商戶網站購買商品,填寫數量,確定購買后跳轉到結賬頁面。結賬頁面可能包括訂單號、定單狀態(已支付/未支付)、收貨人信息、配送方式、定單金額、配送費用、總金額、支付方式、結賬按鈕,等等。
3、當點擊"結賬"按鈕,會重定向到支付寶付款頁面。而在后臺,實際上是把數據提交到支付寶一個接收支付信息的網關,比如是http://www.zhifubao.com:6060/AliPay/PayGate.ashx,然后再重定向到支付寶付款頁面。
4、付款成功后,重定向到商戶用來顯示支付成功的一個頁面,該頁面可以顯示定單編號、總金額等信息。
其中有幾個關鍵之處:
?
1、明確支付寶支付網關所需要的url格式
?
比如類似"http://www.zhifubao.com:6060/AliPay/PayGate.ashx?partner=18&return_url=http%....%"這樣的格式,那么,編程的時候應該嚴格按照這種格式來拼接字符串。
?
2、明確在支付寶支付成功后重定向到商戶支付成功頁的url中,支付寶給我們反饋的url參數
?
支付寶反饋的格式類似"http://localhost:1746/Shop/PayCallBack.aspx?out_trade_no=222&returncode=ok&total_fee=400&sign=ddddddd+md5值"這樣,我們可以使用Request[key],取出對應的部分,比如定單編號,定單金額,等等。
?
3、在向支付寶網關提交數據的時候,支付寶要求其中一個參數sign必須是MD5值
?
這個MD5值是把商戶編號、支付成功顯示頁面、商戶密匙等信息按照固定的順序進行MD5加密獲得。商戶密匙一般都可以在支付寶后臺設置。
?
4、在支付寶支付成功后重定向到商戶支付成功頁的url中,有一個sign參數也包含了MD5值
?
這個MD5值是把定單編號、返回地址、總金額、商戶密匙等信息按照固定的順序進行MD5加密獲得,編碼的時候,我們需要重新根據定單編號、返回地址、總金額、商戶密匙等信息按照固定的順序進行MD5加密獲得一個值,兩個值比較,如果相等,就說明沒有篡改,支付成功。
?
5、明確支付寶支付網關地址
?
這個地址用來接收來自商戶的信息,類似這樣:http://www.zhifubao.com:6060/AliPay/PayGate.ashx?partner=18&return_url=http%....%
支付寶接口提供的信息大致如下:
?
支付網關地址:
?
http://www.zhifubao.com:6060/AliPay/PayGate.ashx
?
支付網關參數:
?
Partner:商戶編號
return_url:支付成功地址
subject:商品名稱
body:商品描述
out_trade_no:訂單號,由商戶網站生成
total_fee:總金額
seller_email:賣家郵箱
sign:數字簽名,總金額、商戶編號、訂單號、商品名稱、商戶密匙順序連接獲得的MD5值
?
回調商戶地址:
?
out_trade_no:訂單號
returncode:返回碼,ok或error
total_fee:支付金額
sign:數字簽名,訂單號、返回碼、支付金額、商戶密匙順序連接獲得的MD5值
?
搞清了原理,編碼變得簡單。
?
當點擊支付:
?
string md5Str = SomeCommonHelper.GetMD5("總金額","商戶編號","訂單號","商品名稱","商戶密匙");
string url = "http://www.zhifubao.com:6060/AliPay/PayGate.ashx?partner=商戶編號&return_url=" + Server.UrlEncode("http://...商戶支付成功顯示頁面") + "&subject=" + Server.UrlEncode(商品名稱) + "&body=" + 商品描述 + "&out_rade_no=" + 商品編號 + "&total_fee=" + 總金額 + "&seller_email=" + 商戶郵箱 + "&sign=" + md5Str;
Response.Redirect(url);
?
支付成功顯示頁面:
?
string out_trade_no = Request["out_trade_no"];
string returncode = Request["returncode"];
string total_fee = Request["total_fee"];
string sign = Request["sign"];
//自己算MD5值
string myMD5 = SomeCommonHelper.GetMD5(out_trade_no + returncode + total_fee + "商戶密匙");
if(sign != myMD5){
Response.Write("支付失敗");
} else{
Response.Write("支付成功");
}
?
就這樣。