爲了方便擴展制定支付寶回調接口
- public interface IReturnHandler
- {
- /// <summary>
- /// 處理Returl_url回調請求
- /// </summary>
- /// <param name="properties">支付寶相關參數</param>
- /// <param name="customs">自定義參數</param>
- void Return(System.Collections.Specialized.NameValueCollection properties, IList<string> customs);
- /// <summary>
- /// 處理Notify_url回調請求
- /// </summary>
- /// <param name="properties">支付寶相關參數</param>
- /// <param name="customs">自定義參數</param>
- void Notify(System.Collections.Specialized.NameValueCollection properties, IList<string> customs);
- /// <summary>
- /// 支付寶處理錯誤回調請求
- /// </summary>
- /// <param name="properties">支付寶相關參數</param>
- /// <param name="customs">自定義參數</param>
- /// <param name="responsetext">結果內容</param>
- void OnError(System.Collections.Specialized.NameValueCollection properties, IList<string> customs,string responsetext);
- /// <summary>
- /// 合作商ID
- /// </summary>
- string Partner
- {
- get;
- }
- /// <summary>
- /// 加密Key
- /// </summary>
- string Key
- {
- get;
- }
- /// <summary>
- /// 賣家郵件地址
- /// </summary>
- string Seller_Email
- {
- get;
- }
- }
重新實現AliPay類 - /// <summary>
- /// 支付寶虛擬貨幣支付
- /// </summary>
- public class AliPay
- {
- /// <summary>
- /// 構造虛擬貨幣支付對象
- /// </summary>
- /// <param name="subject">商品名稱</param>
- /// <param name="body">商品描述</param>
- /// <param name="total_fee">總金額</param>
- public AliPay(string subject, string body, decimal total_fee
- ,string returnurl)
- {
- Gateway = Untity.Service_Ulr;
- Service = "create_direct_pay_by_user";
- Sing_Type = Untity.Sing_Type;
- Payment_Type = "1";
-
- Subject = subject;
- Body = body;
- Total_Fee = total_fee;
- Return_Url = returnurl;
- Notify_Url = returnurl;
- }
- public string Notify_Url
- {
- get;
- set;
- }
- public string Buyer_Id
- {
- get;
- set;
- }
-
- public void Execute<T>(params string[] customparams) where T:IReturnHandler,new()
- {
- System.DateTime currentTime = new System.DateTime();
- currentTime = System.DateTime.Now;
- string out_trade_no = currentTime.ToString("g");
- Out_Trade_No = out_trade_no.Replace("-", "");
- Out_Trade_No = Out_Trade_No.Replace(":", "");
- Out_Trade_No = Out_Trade_No.Replace(" ", "");
- //返回支付Url;
- System.Web.HttpContext.Current.Response.Redirect(parameter.ToString());
- }
- }
Alipay的代碼就貼部分出來,具體代碼下載源碼可以得到。
Execute方法是用調用支付寶接口,T泛型參數主要描述支付寶回調後用那個IReturnHandler的實現者來處理;customparams就是用戶自定義的參數可以是多個,注意參數內容過多生成Returl_url過長會導致支付寶處理錯誤。
接收支付寶回調的HttpHandler
由於把回調處理類型和自定義參數放在Return_utl裏,所以必須要實現一個HttpHandler來進行相關請求接收。
- public class ReturnHandler:System.Web.IHttpHandler
- {
- #region IHttpHandler 成員
- public bool IsReusable
- {
- get { return false; }
- }
- public String Get_Http(String a_strUrl, int timeout)
- {
- string strResult;
- try
- {
- HttpWebRequest myReq = (HttpWebRequest)HttpWebRequest.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;
- }
- public void ProcessRequest(System.Web.HttpContext context)
- {
- string requesturl = context.Server.UrlDecode(context.Request.Path);
- string alipayNotifyURL = Untity.Service_Ulr;
- string urltype=System.IO.Path.GetFileName(requesturl).Substring(0, 1).ToLower();
- MatchCollection matchs = Regex.Matches(requesturl, @"_([0-9a-zA-Z/%=]+)");
- string TypeName = System.Text.Encoding.ASCII.GetString(Convert.FromBase64String(matchs[0].Groups[1].Value));
- IReturnHandler handler = (IReturnHandler)Activator.CreateInstance(Type.GetType(TypeName));
- IList<string> paramsdata = new List<string>();
- for (int k = 1; k < matchs.Count; k++)
- {
- paramsdata.Add(matchs[k].Groups[1].Value);
- }
- string partner = handler.Partner;
- string key = handler.Key;
- NameValueCollection payResultData;
- if (urltype == "r")
- {
- payResultData = context.Request.QueryString;
- }
- else
- {
- payResultData = context.Request.Form;
- }
- alipayNotifyURL = alipayNotifyURL + "service=notify_verify" + "&partner=" + partner + "¬ify_id=" + payResultData["notify_id"];
- string responseTxt = Get_Http(alipayNotifyURL, 120000);
- int i;
- String[] requestarr = payResultData.AllKeys;
- //進行排序;
- string[] Sortedstr = Untity.BubbleSort(requestarr);
- //構造待md5摘要字符串;
- string prestr = "";
- for (i = 0; i < Sortedstr.Length; i++)
- {
- if (context.Request.Form[Sortedstr] != "" && Sortedstr != "sign" && Sortedstr != "sign_type")
- {
- if (i == Sortedstr.Length - 1)
- {
- prestr = prestr + Sortedstr + "=" + payResultData[Sortedstr];
- }
- else
- {
- prestr = prestr + Sortedstr + "=" + payResultData[Sortedstr] + "&";
- }
- }
- }
- prestr = prestr + key;
- string mysign =Untity.GetMD5(prestr);
- string sign = payResultData["sign"];
- if (responseTxt == "true" && mysign == sign) //驗證支付發過來的消息,簽名是否正確
- {
- string status = payResultData["trade_status"];
- if (status == "TRADE_FINISHED")// WAIT_SELLER_SEND_GOODS 判斷支付狀態(文檔中有枚舉表可以參考)
- {
- //更新自己數據庫的訂單語句,請自己填寫一下
- if (urltype == "r")
- {
- handler.Return(payResultData, paramsdata);
- }
- else
- {
- handler.Notify(payResultData, paramsdata);
- }
- }
- }
- else
- {
- handler.OnError(payResultData, paramsdata, responseTxt);
- }
- }
- #endregion
- }
到這裏封裝完成。