支付寶接口 有源碼下載地址

爲了方便擴展制定支付寶回調接口

  1. public interface IReturnHandler
  2.     {

  3.         /// <summary>

  4.         /// 處理Returl_url回調請求

  5.         /// </summary>

  6.         /// <param name="properties">支付寶相關參數</param>

  7.         /// <param name="customs">自定義參數</param>

  8.         void Return(System.Collections.Specialized.NameValueCollection properties, IList<string> customs);

  9.         /// <summary>

  10.         /// 處理Notify_url回調請求

  11.         /// </summary>

  12.         /// <param name="properties">支付寶相關參數</param>

  13.         /// <param name="customs">自定義參數</param>

  14.         void Notify(System.Collections.Specialized.NameValueCollection properties, IList<string> customs);

  15.         /// <summary>

  16.         /// 支付寶處理錯誤回調請求

  17.         /// </summary>

  18.         /// <param name="properties">支付寶相關參數</param>

  19.         /// <param name="customs">自定義參數</param>

  20.         /// <param name="responsetext">結果內容</param>

  21.         void OnError(System.Collections.Specialized.NameValueCollection properties, IList<string> customs,string responsetext);

  22.         /// <summary>

  23.         /// 合作商ID

  24.         /// </summary>

  25.         string Partner

  26.         {

  27.             get;

  28.         }

  29.         /// <summary>

  30.         /// 加密Key

  31.         /// </summary>

  32.         string Key

  33.         {

  34.             get;

  35.         }

  36.       /// <summary>

  37.       /// 賣家郵件地址

  38.       /// </summary>

  39.         string Seller_Email

  40.         {

  41.             get;

  42.         }

  43.     }
    重新實現AliPay類
  44. /// <summary>
  45.     /// 支付寶虛擬貨幣支付

  46.     /// </summary>

  47.     public class AliPay

  48.     {

  49.         /// <summary>

  50.         /// 構造虛擬貨幣支付對象

  51.         /// </summary>

  52.         /// <param name="subject">商品名稱</param>

  53.         /// <param name="body">商品描述</param>

  54.         /// <param name="total_fee">總金額</param>

  55.         public AliPay(string subject, string body, decimal total_fee

  56.             ,string returnurl)

  57.         {

  58.             Gateway = Untity.Service_Ulr;

  59.             Service = "create_direct_pay_by_user";

  60.             Sing_Type = Untity.Sing_Type;

  61.             Payment_Type = "1";

  62.      

  63.             Subject = subject;

  64.             Body = body;

  65.             Total_Fee = total_fee;

  66.             Return_Url = returnurl;

  67.             Notify_Url = returnurl;

  68.         }

  69.         public string Notify_Url

  70.         {

  71.             get;

  72.             set;

  73.         }

  74.         public string Buyer_Id

  75.         {

  76.             get;

  77.             set;

  78.         }

  79.        

  80.         public void Execute<T>(params string[] customparams) where T:IReturnHandler,new()

  81.         {

  82.             System.DateTime currentTime = new System.DateTime();

  83.             currentTime = System.DateTime.Now;

  84.             string out_trade_no = currentTime.ToString("g");

  85.             Out_Trade_No = out_trade_no.Replace("-", "");

  86.             Out_Trade_No = Out_Trade_No.Replace(":", "");

  87.             Out_Trade_No = Out_Trade_No.Replace(" ", "");

  88.             //返回支付Url;

  89.             System.Web.HttpContext.Current.Response.Redirect(parameter.ToString());



  90.         }

  91.     }
    Alipay的代碼就貼部分出來,具體代碼下載源碼可以得到。

    Execute方法是用調用支付寶接口,T泛型參數主要描述支付寶回調後用那個IReturnHandler的實現者來處理;customparams就是用戶自定義的參數可以是多個,注意參數內容過多生成Returl_url過長會導致支付寶處理錯誤。

接收支付寶回調的HttpHandler

      由於把回調處理類型和自定義參數放在Return_utl裏,所以必須要實現一個HttpHandler來進行相關請求接收。

  1. public class ReturnHandler:System.Web.IHttpHandler
  2.     {
  3.         #region IHttpHandler 成員
  4.         public bool IsReusable
  5.         {
  6.             get { return false; }
  7.         }
  8.         public String Get_Http(String a_strUrl, int timeout)
  9.         {
  10.             string strResult;
  11.             try
  12.             {
  13.                 HttpWebRequest myReq = (HttpWebRequest)HttpWebRequest.Create(a_strUrl);
  14.                 myReq.Timeout = timeout;
  15.                 HttpWebResponse HttpWResp = (HttpWebResponse)myReq.GetResponse();
  16.                 Stream myStream = HttpWResp.GetResponseStream();
  17.                 StreamReader sr = new StreamReader(myStream, Encoding.Default);
  18.                 StringBuilder strBuilder = new StringBuilder();
  19.                 while (-1 != sr.Peek())
  20.                 {
  21.                     strBuilder.Append(sr.ReadLine());
  22.                 }
  23.                 strResult = strBuilder.ToString();
  24.             }
  25.             catch (Exception exp)
  26.             {
  27.                 strResult = "錯誤:" + exp.Message;
  28.             }
  29.             return strResult;
  30.         }
  31.         public void ProcessRequest(System.Web.HttpContext context)
  32.         {
  33.             string requesturl = context.Server.UrlDecode(context.Request.Path);
  34.             string alipayNotifyURL = Untity.Service_Ulr;
  35.             string urltype=System.IO.Path.GetFileName(requesturl).Substring(0, 1).ToLower();
  36.             MatchCollection matchs = Regex.Matches(requesturl, @"_([0-9a-zA-Z/%=]+)");
  37.             string TypeName = System.Text.Encoding.ASCII.GetString(Convert.FromBase64String(matchs[0].Groups[1].Value));
  38.             IReturnHandler handler = (IReturnHandler)Activator.CreateInstance(Type.GetType(TypeName));
  39.             IList<string> paramsdata = new List<string>();
  40.             for (int k = 1; k < matchs.Count; k++)
  41.             {
  42.                 paramsdata.Add(matchs[k].Groups[1].Value);
  43.             }
  44.             string partner = handler.Partner;
  45.             string key = handler.Key;
  46.             NameValueCollection payResultData;
  47.             if (urltype == "r")
  48.             {
  49.                 payResultData = context.Request.QueryString;
  50.                
  51.             }
  52.             else
  53.             {
  54.                 payResultData = context.Request.Form;
  55.             }
  56.             alipayNotifyURL = alipayNotifyURL + "service=notify_verify" + "&partner=" + partner + "¬ify_id=" + payResultData["notify_id"];
  57.             string responseTxt = Get_Http(alipayNotifyURL, 120000);
  58.             int i;
  59.             String[] requestarr = payResultData.AllKeys;
  60.             //進行排序;
  61.             string[] Sortedstr = Untity.BubbleSort(requestarr);
  62.             //構造待md5摘要字符串;
  63.             string prestr = "";
  64.             for (i = 0; i < Sortedstr.Length; i++)
  65.             {
  66.                 if (context.Request.Form[Sortedstr] != "" && Sortedstr != "sign" && Sortedstr != "sign_type")
  67.                 {
  68.                     if (i == Sortedstr.Length - 1)
  69.                     {
  70.                         prestr = prestr + Sortedstr + "=" + payResultData[Sortedstr];
  71.                     }
  72.                     else
  73.                     {
  74.                         prestr = prestr + Sortedstr + "=" + payResultData[Sortedstr] + "&";
  75.                     }
  76.                 }
  77.             }
  78.             prestr = prestr + key;
  79.             string mysign =Untity.GetMD5(prestr);
  80.             string sign = payResultData["sign"];
  81.           if (responseTxt == "true" && mysign == sign)  //驗證支付發過來的消息,簽名是否正確
  82.             {
  83.                 string status = payResultData["trade_status"];
  84.              
  85.                 if (status == "TRADE_FINISHED")// WAIT_SELLER_SEND_GOODS  判斷支付狀態(文檔中有枚舉表可以參考)           
  86.                 {
  87.                     //更新自己數據庫的訂單語句,請自己填寫一下
  88.                     if (urltype == "r")
  89.                     {
  90.                         handler.Return(payResultData, paramsdata);
  91.                     }
  92.                     else
  93.                     {
  94.                         handler.Notify(payResultData, paramsdata);
  95.                     }
  96.                  
  97.                 }
  98.             }
  99.             else
  100.             {
  101.                 handler.OnError(payResultData, paramsdata, responseTxt);
  102.             }
  103.         }
  104.         #endregion
  105.     }
    到這裏封裝完成。
發佈了5 篇原創文章 · 獲贊 3 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章