此例分三個頁面分別為:default.aspx用於支付顯示后的頁面包括商品名稱,支付金額等。
SubmitPayPage.aspx為提交支付的頁面 ,跳轉到支付寶官方網站
NoticeReturn.aspx系統返回頁面(對賬頁面)
1、default.aspx為HTML代碼 沒有內容顯示
而default.aspx.cs代碼如下:
using System; using System.Collections.Specialized; using System.IO; using System.Net; using System.Security.Cryptography; using System.Text; using System.Web.UI; public partial class _Default : Page { protected void Page_Load(object sender, EventArgs e) { // 支付寶的網關 string alipayNotifyURL = "https://www.alipay.com/cooperate/gateway.do?"; // 用戶注冊支付寶時生成的校驗碼(必須填寫自己的) string key = "xxxxxxx"; // 頁面編碼格式 string _input_charset = "utf-8"; // 用戶注冊支付寶時生成的合作伙伴id(必須填寫自己的) string partner = "xxxxxx"; alipayNotifyURL = alipayNotifyURL + "service=create_digital_goods_trade_p" + "&partner=" + partner + "¬ify_id=" + Request.QueryString["notify_id"]; // 獲取支付寶ATN返回結果,true是正確的訂單信息,false 是無效的 string responseTxt = Get_Http(alipayNotifyURL, 120000); int i; NameValueCollection coll; // 在集合中裝載返回信息 coll = Request.QueryString; // 將所有的鍵值保存在數組中 String[] requestarr = coll.AllKeys; // 進行排序 string[] Sortedstr = BubbleSort(requestarr); for (i = 0; i < Sortedstr.Length; i++) { Response.Write("Form: " + Sortedstr[i] + "=" + Request.QueryString[Sortedstr[i]] + "<br>"); } // 構造待md5摘要字符串 StringBuilder prestr = new StringBuilder(); for (i = 0; i < Sortedstr.Length; i++) { if (Request.Form[Sortedstr[i]] != "" && Sortedstr[i] != "sign" && Sortedstr[i] != "sign_type") { if (i == Sortedstr.Length - 1) { prestr.Append(Sortedstr[i] + "=" + Request.QueryString[Sortedstr[i]]); } else { prestr.Append(Sortedstr[i] + "=" + Request.QueryString[Sortedstr[i]] + "&"); } } } prestr.Append(key); // 生成Md5摘要 string mysign = GetMD5(prestr.ToString(), _input_charset); string sign = Request.QueryString["sign"]; // 測試返回的結果 // Response.Write(prestr.ToString()); // 驗證支付發過來的消息,簽名是否正確 if (mysign == sign && responseTxt == "true") { // 此時可以更新網站的數據,比如商品的減少等等。 Response.Write("success"); // 返回給支付寶消息,成功 } else { Response.Write("fail"); } } public static string GetMD5(string s, string _input_charset) { MD5 md5 = new MD5CryptoServiceProvider(); byte[] t = md5.ComputeHash(Encoding.GetEncoding(_input_charset).GetBytes(s)); StringBuilder sb = new StringBuilder(32); for (int i = 0; i < t.Length; i++) { sb.Append(t[i].ToString("x").PadLeft(2, '0')); } return sb.ToString(); } public static string[] BubbleSort(string[] r) { int i, j; string temp; bool exchange; // 最多做R.Length-1趟排序 for (i = 0; i < r.Length; i++) { // 本趟排序開始前,交換標志應為假 exchange = false; for (j = r.Length - 2; j >= i; j--) { // 交換條件 if (String.CompareOrdinal(r[j + 1], r[j]) < 0) { temp = r[j + 1]; r[j + 1] = r[j]; r[j] = temp; // 發生了交換,故將交換標志置為真 exchange = true; } } // 本趟排序未發生交換,提前終止算法 if (!exchange) { break; } } return r; } // 獲取遠程服務器ATN結果 public String Get_Http(String a_strUrl, int timeout) { string strResult; try { // 創建訪問頁面 HttpWebRequest myReq = (HttpWebRequest) WebRequest.Create(a_strUrl); myReq.Timeout = timeout; HttpWebResponse HttpWResp = (HttpWebResponse) myReq.GetResponse(); // 獲取頁面返回數據流 Stream myStream = HttpWResp.GetResponseStream(); StreamReader sr = new StreamReader(myStream, Encoding.Default); StringBuilder strBuilder = new StringBuilder(); // 獲取內容 while (-1 != sr.Peek()) { strBuilder.Append(sr.ReadLine()); } strResult = strBuilder.ToString(); } catch (Exception exp) { strResult = "錯誤:" + exp.Message; } return strResult; } }
2、SubmitPayPage.aspx 代碼為空
后台代碼:
using System; using System.Collections.Specialized; using System.IO; using System.Net; using System.Security.Cryptography; using System.Text; using System.Web.UI; public partial class NoticeReturn : Page { protected void Page_Load(object sender, EventArgs e) { string alipayNotifyURL = "https://www.alipay.com/cooperate/gateway.do?"; // partner合作伙伴id(必須填寫) string partner = "xxxxxxxxxx"; // partner 的對應交易安全校驗碼(必須填寫) string key = "xxxxxxxx"; alipayNotifyURL = alipayNotifyURL + "service=create_digital_goods_trade_p" + "&partner=" + partner + "¬ify_id=" + Request.Form["notify_id"]; // 獲取支付寶ATN返回結果,true是正確的訂單信息,false 是無效的 string responseTxt = Get_Http(alipayNotifyURL, 120000); int i; NameValueCollection coll; // 在集合中裝載返回信息 coll = Request.Form; // 將所有的鍵值保存在數組中 String[] requestarr = coll.AllKeys; // 進行排序 string[] Sortedstr = BubbleSort(requestarr); // 構造待md5摘要字符串 string prestr = ""; for (i = 0; i < Sortedstr.Length; i++) { if (Request.Form[Sortedstr[i]] != "" && Sortedstr[i] != "sign" && Sortedstr[i] != "sign_type") { if (i == Sortedstr.Length - 1) { prestr = prestr + Sortedstr[i] + "=" + Request.Form[Sortedstr[i]]; } else { prestr = prestr + Sortedstr[i] + "=" + Request.Form[Sortedstr[i]] + "&"; } } } prestr = prestr + key; string mysign = GetMD5(prestr); string sign = Request.Form["sign"]; // 驗證支付發過來的消息,簽名是否正確 if (mysign == sign && responseTxt == "true") { // 判斷支付狀態TRADE_FINISHED(文檔中有枚舉表可以參考) if (Request.Form["trade_status"] == "WAIT_SELLER_SEND_GOODS") { // 更新自己數據庫的訂單語句 // 返回給支付寶消息,成功 Response.Write("success"); } else { Response.Write("fail"); } } } public static string GetMD5(string s) { MD5 md5 = new MD5CryptoServiceProvider(); byte[] t = md5.ComputeHash(Encoding.GetEncoding("utf-8").GetBytes(s)); StringBuilder sb = new StringBuilder(32); for (int i = 0; i < t.Length; i++) { sb.Append(t[i].ToString("x").PadLeft(2, '0')); } return sb.ToString(); } public static string[] BubbleSort(string[] R) { int i, j; // 交換標志 string temp; bool exchange; // 最多做R.Length-1趟排序 for (i = 0; i < R.Length; i++) { // 本趟排序開始前,交換標志應為假 exchange = false; for (j = R.Length - 2; j >= i; j--) { // 交換條件 if (String.CompareOrdinal(R[j + 1], R[j]) < 0) { temp = R[j + 1]; R[j + 1] = R[j]; R[j] = temp; // 發生了交換,故將交換標志置為真 exchange = true; } } // 本趟排序未發生交換,提前終止算法 if (!exchange) { break; } } return R; } // 獲取遠程服務器ATN結果 public String Get_Http(String a_strUrl, int timeout) { string strResult; try { // 創建訪問頁面 HttpWebRequest myReq = (HttpWebRequest) WebRequest.Create(a_strUrl); myReq.Timeout = timeout; HttpWebResponse HttpWResp = (HttpWebResponse) myReq.GetResponse(); // 獲取頁面返回數據流 Stream myStream = HttpWResp.GetResponseStream(); StreamReader sr = new StreamReader(myStream, Encoding.Default); StringBuilder strBuilder = new StringBuilder(); // 獲取內容 while (-1 != sr.Peek()) { strBuilder.Append(sr.ReadLine()); } strResult = strBuilder.ToString(); } catch (Exception exp) { strResult = "錯誤:" + exp.Message; } return strResult; } }
3、NoticeReturn.aspx 代碼為空;
后台代碼如下:
using System; using System.Collections.Specialized; using System.IO; using System.Net; using System.Security.Cryptography; using System.Text; using System.Web.UI; public partial class NoticeReturn : Page { protected void Page_Load(object sender, EventArgs e) { string alipayNotifyURL = "https://www.alipay.com/cooperate/gateway.do?"; // partner合作伙伴id(必須填寫) string partner = "xxxxxxxxxx"; // partner 的對應交易安全校驗碼(必須填寫) string key = "xxxxxxxx"; alipayNotifyURL = alipayNotifyURL + "service=create_digital_goods_trade_p" + "&partner=" + partner + "¬ify_id=" + Request.Form["notify_id"]; // 獲取支付寶ATN返回結果,true是正確的訂單信息,false 是無效的 string responseTxt = Get_Http(alipayNotifyURL, 120000); int i; NameValueCollection coll; // 在集合中裝載返回信息 coll = Request.Form; // 將所有的鍵值保存在數組中 String[] requestarr = coll.AllKeys; // 進行排序 string[] Sortedstr = BubbleSort(requestarr); // 構造待md5摘要字符串 string prestr = ""; for (i = 0; i < Sortedstr.Length; i++) { if (Request.Form[Sortedstr[i]] != "" && Sortedstr[i] != "sign" && Sortedstr[i] != "sign_type") { if (i == Sortedstr.Length - 1) { prestr = prestr + Sortedstr[i] + "=" + Request.Form[Sortedstr[i]]; } else { prestr = prestr + Sortedstr[i] + "=" + Request.Form[Sortedstr[i]] + "&"; } } } prestr = prestr + key; string mysign = GetMD5(prestr); string sign = Request.Form["sign"]; // 驗證支付發過來的消息,簽名是否正確 if (mysign == sign && responseTxt == "true") { // 判斷支付狀態TRADE_FINISHED(文檔中有枚舉表可以參考) if (Request.Form["trade_status"] == "WAIT_SELLER_SEND_GOODS") { // 更新自己數據庫的訂單語句 // 返回給支付寶消息,成功 Response.Write("success"); } else { Response.Write("fail"); } } } public static string GetMD5(string s) { MD5 md5 = new MD5CryptoServiceProvider(); byte[] t = md5.ComputeHash(Encoding.GetEncoding("utf-8").GetBytes(s)); StringBuilder sb = new StringBuilder(32); for (int i = 0; i < t.Length; i++) { sb.Append(t[i].ToString("x").PadLeft(2, '0')); } return sb.ToString(); } public static string[] BubbleSort(string[] R) { int i, j; // 交換標志 string temp; bool exchange; // 最多做R.Length-1趟排序 for (i = 0; i < R.Length; i++) { // 本趟排序開始前,交換標志應為假 exchange = false; for (j = R.Length - 2; j >= i; j--) { // 交換條件 if (String.CompareOrdinal(R[j + 1], R[j]) < 0) { temp = R[j + 1]; R[j + 1] = R[j]; R[j] = temp; // 發生了交換,故將交換標志置為真 exchange = true; } } // 本趟排序未發生交換,提前終止算法 if (!exchange) { break; } } return R; } // 獲取遠程服務器ATN結果 public String Get_Http(String a_strUrl, int timeout) { string strResult; try { // 創建訪問頁面 HttpWebRequest myReq = (HttpWebRequest) WebRequest.Create(a_strUrl); myReq.Timeout = timeout; HttpWebResponse HttpWResp = (HttpWebResponse) myReq.GetResponse(); // 獲取頁面返回數據流 Stream myStream = HttpWResp.GetResponseStream(); StreamReader sr = new StreamReader(myStream, Encoding.Default); StringBuilder strBuilder = new StringBuilder(); // 獲取內容 while (-1 != sr.Peek()) { strBuilder.Append(sr.ReadLine()); } strResult = strBuilder.ToString(); } catch (Exception exp) { strResult = "錯誤:" + exp.Message; } return strResult; } }