using System; using System.Collections.Generic; using System.Collections.Specialized; using System.IO; using System.Linq; using System.Net; using System.Security.Cryptography; using System.Text; using System.Web; using System.Web.Mvc; using ZK_ECommerce.Shop.pay.alipay; namespace Alipay.Controllers { public class ApliayDemoController : Controller { /// <summary> /// 支付页面 /// </summary> /// <param name="ordercode"></param> /// <returns></returns> public ActionResult Index( string ordercode) { string out_trade_no = ordercode; string gateway = "https://mapi.alipay.com/gateway.do?" ; //支付接口 string service = "create_direct_pay_by_user" ; string partner = "" ; //partner合作伙伴ID保留字段 string sign_type = "MD5" ; string payment_type = "1" ; //支付类型 string show_url = "http://www.letao.com" ; string seller_email = "" ; //卖家账号 string key = "" ; //partner账户的支付宝安全校验码 string return_url = "http://localhost:1396/ApliayDemo/ApliyReturn" ; //服务器通知返回接口 string notify_url = "http://localhost:1396/ApliayDemo/AlipayNotify" ; //服务器通知返回接口 string _input_charset = "utf-8" ; string extra_common_param = "COD2MOTOPAY" ; //表示快捷支付 string token = string .Empty; if ( string .IsNullOrEmpty(token)) token = "" ; string subject = "康康体检套餐" ; // subject商品名称 string body = "测试商品" ; //商品描述 string total_fee = "0.01" ; AliPay ap = new AliPay(); string aliay_url = ap.CreatUrl(gateway, service, partner, sign_type, out_trade_no, subject, body, payment_type, total_fee, show_url, seller_email, key, return_url, _input_charset, notify_url, token, extra_common_param); return Redirect(aliay_url); } /// <summary> /// 返回通知页面 /// </summary> /// <returns></returns> public ActionResult ApliyReturn() { string alipayNotifyURL = "https://mapi.alipay.com/gateway.do?" ; string key = "" ; //partner 的对应交易安全校验码(必须填写) string _input_charset = "utf-8" ; string partner = "" ; //partner合作伙伴id(必须填写) alipayNotifyURL = alipayNotifyURL + "service=notify_verify" + "&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); //构造待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); string mysign = GetMD5(prestr.ToString(), _input_charset); string sign = Request.QueryString[ "sign" ]; string trade_status = Request.QueryString[ "trade_status" ]; if (mysign == sign && responseTxt == "true" && trade_status == "TRADE_SUCCESS" ) //验证支付发过来的消息,签名是否正确 { string order_amount = Request.QueryString[ "total_fee" ].ToString().Trim(); string order_code = Request.QueryString[ "out_trade_no" ].ToString().Trim(); //updateOrder(order_code);//更新订单状态 Response.Redirect( "" ); //跳转到支付成功页面 } else { Response.Write( "支付失败。" ); Response.Write( "<br>Result:responseTxt=" + responseTxt); Response.Write( "<br>Result:mysign=" + mysign); Response.Write( "<br>Result:sign=" + sign); } return View(); } /// <summary> /// 支付回调页面 /// </summary> /// <returns></returns> public ActionResult AlipayNotify() { string alipayNotifyURL = "https://mapi.alipay.com/gateway.do?" ; string partner = "" ; //partner合作伙伴id(必须填写) string key = "" ; //partner 的对应交易安全校验码(必须填写) alipayNotifyURL = alipayNotifyURL + "service=notify_verify" + "&partner=" + partner + "¬ify_id=" + Request.Form[ "notify_id" ]; //获取支付宝ATN返回结果,true是正确的订单信息,false 是无效的 string responseTxt = Get_Http(alipayNotifyURL, 120000); int i; NameValueCollection coll; //Load Form variables into NameValueCollection variable. coll = Request.Form; // Get names of all forms into a string array. String[] requestarr = coll.AllKeys; //进行排序; string [] Sortedstr = BubbleSort(requestarr); //构造待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); string mysign = GetMD5(prestr.ToString()); string sign = Request.QueryString[ "sign" ]; string trade_status = Request.QueryString[ "trade_status" ]; if (mysign == sign && responseTxt == "true" && trade_status == "TRADE_SUCCESS" ) //验证支付发过来的消息,签名是否正确 { string order_amount = Request.QueryString[ "total_fee" ].ToString().Trim(); string order_code = Request.QueryString[ "out_trade_no" ].ToString().Trim(); // updateOrder(order_code);//更新订单状态 Response.Redirect( "" ); //跳转到支付成功页面 } else { Response.Write( "支付失败。" ); Response.Write( "<br>Result:responseTxt=" + responseTxt); Response.Write( "<br>Result:mysign=" + mysign); Response.Write( "<br>Result:sign=" + sign); } return View(); } public static string GetMD5( string s, string _input_charset) { /// <summary> /// 与ASP兼容的MD5加密算法 /// </summary> 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 GetMD5( string s) { /// <summary> /// 与ASP兼容的MD5加密算法 /// </summary> 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) { /// <summary> /// 冒泡排序法 /// </summary> int i, j; //交换标志 string temp; bool exchange; for (i = 0; i < r.Length; i++) //最多做R.Length-1趟排序 { exchange = false ; //本趟排序开始前,交换标志应为假 for (j = r.Length - 2; j >= i; j--) { if (System.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)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; } } } |