C#支付宝扫码支付代码完整版
时间:2019-04-15
本文章向大家介绍C#支付宝扫码支付代码完整版,主要包括C#支付宝扫码支付代码完整版使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
本文实例为大家分享了C#支付宝扫码支付示的具体代码,供大家参考,具体内容如下
支付宝工具类
using System; using System.Collections.Generic; using System.Linq; using System.Security.Cryptography; using System.Text; using System.Web; namespace ZK_ECommerce.Shop.pay.alipay { public class AliPay { 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[] 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; } public string CreatUrl( string gateway, string service, string partner, string sign_type, string out_trade_no, string subject, string body, string payment_type, string total_fee, string show_url, string seller_email, string key, string return_url, string _input_charset, string notify_url, string extra_common_param = "" ) { return 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, "", extra_common_param); } public string CreatUrl( string gateway, string service, string partner, string sign_type, string out_trade_no, string subject, string body, string payment_type, string total_fee, string show_url, string seller_email, string key, string return_url, string _input_charset, string notify_url, string token, string extra_common_param = "" ) { /// <summary> ///2015年11月17日14:08:00 /// </summary> int i; string[] Oristr; //构造数组; if (!string.IsNullOrEmpty(token)) { if (extra_common_param == "COD2MOTOPAY") { Oristr = new[]{ "service="+service, "partner=" + partner, "subject=" + subject, "body=" + body, "out_trade_no=" + out_trade_no, "total_fee=" + total_fee, "show_url=" + show_url, "payment_type=" + payment_type, "seller_email=" + seller_email, "notify_url=" + notify_url, "_input_charset="+_input_charset, "return_url=" + return_url, "token="+token, "extra_common_param="+extra_common_param }; } else { Oristr = new[]{ "service="+service, "partner=" + partner, "subject=" + subject, "body=" + body, "out_trade_no=" + out_trade_no, "total_fee=" +total_fee, "show_url=" + show_url, "payment_type=" + payment_type, "seller_email=" + seller_email, "notify_url=" + notify_url, "_input_charset="+_input_charset, "return_url=" + return_url, "token="+token }; } } else { if (extra_common_param == "COD2MOTOPAY") { Oristr = new[]{ "service="+service, "partner=" + partner, "subject=" + subject, "body=" + body, "out_trade_no=" + out_trade_no, "total_fee="+total_fee, "show_url=" + show_url, "payment_type=" + payment_type, "seller_email=" + seller_email, "notify_url=" + notify_url, "_input_charset="+_input_charset, "return_url=" + return_url, "extra_common_param="+extra_common_param }; } else { Oristr = new[]{ "service="+service, "partner=" + partner, "subject=" + subject, "body=" + body, "out_trade_no=" + out_trade_no, "total_fee=" + total_fee, "show_url=" + show_url, "payment_type=" + payment_type, "seller_email=" + seller_email, "notify_url=" + notify_url, "_input_charset="+_input_charset, "return_url=" + return_url }; } } //进行排序; string[] Sortedstr = BubbleSort(Oristr); //构造待md5摘要字符串 ; StringBuilder prestr = new StringBuilder(); for (i = 0; i < Sortedstr.Length; i++) { if (i == Sortedstr.Length - 1) { prestr.Append(Sortedstr[i]); } else { prestr.Append(Sortedstr[i] + "&"); } } prestr.Append(key); //生成Md5摘要; string sign = GetMD5(prestr.ToString(), _input_charset); //构造支付Url; char[] delimiterChars = { '=' }; StringBuilder parameter = new StringBuilder(); parameter.Append(gateway); for (i = 0; i < Sortedstr.Length; i++) { parameter.Append(Sortedstr[i].Split(delimiterChars)[0] + "=" + HttpUtility.UrlEncode(Sortedstr[i].Split(delimiterChars)[1]) + "&"); } parameter.Append("sign=" + sign + "&sign_type=" + sign_type); //返回支付Url; return parameter.ToString(); } public string CreatUrl_MissPayments( string gateway, string service, string partner, string sign_type, string out_trade_no, string key, string _input_charset ) { /// <summary> /// created by sunzhizhi 2006.5.21,sunzhizhi@msn.com。 /// </summary> int i; //构造数组; string[] Oristr ={ "service="+service, "partner=" + partner, "out_trade_no=" + out_trade_no, "_input_charset="+_input_charset }; //进行排序; string[] Sortedstr = BubbleSort(Oristr); //构造待md5摘要字符串 ; StringBuilder prestr = new StringBuilder(); for (i = 0; i < Sortedstr.Length; i++) { if (i == Sortedstr.Length - 1) { prestr.Append(Sortedstr[i]); } else { prestr.Append(Sortedstr[i] + "&"); } } prestr.Append(key); //生成Md5摘要; string sign = GetMD5(prestr.ToString(), _input_charset); //构造支付Url; char[] delimiterChars = { '=' }; StringBuilder parameter = new StringBuilder(); parameter.Append(gateway); for (i = 0; i < Sortedstr.Length; i++) { parameter.Append(Sortedstr[i].Split(delimiterChars)[0] + "=" + HttpUtility.UrlEncode(Sortedstr[i].Split(delimiterChars)[1]) + "&"); } parameter.Append("sign=" + sign + "&sign_type=" + sign_type); //返回支付Url; return parameter.ToString(); } public static string GetTranSign(string TranData) { if (string.IsNullOrWhiteSpace(TranData)) return null; string sign = GetMD5(TranData + "alskdjfaow;fjel;asdjf", "utf-8"); return sign; } } }
页面处理
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; } } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
- 闪回数据库不是“万金油”(r11笔记第73天)
- 修改Apache的超时设置,解决长连接请求超时问题
- Oracle 12cR2初体验(r11笔记第91天)
- MySQL中的undo截断(r11笔记第89天)
- Linux系统 df 命令显示异常、分区丢失问题解决
- MySQL主从、字典死锁、连接数的Python监控脚本
- MySQL Online DDL(二)(r11笔记第88天)
- 转-Android上面运行golang
- Golang适合高并发场景的原因分析
- 浅谈MySQL中的事务隔离级别(r11笔记第86天)
- 巧用echo命令解决Samba批量添加用户难题
- 分分钟搭建MySQL Group Replication测试环境(r11笔记第82天)
- MySQL 5.7 Group Replication错误总结(r11笔记第84天)
- 空结构体struct{}解析
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 【python-动态规划】0-1背包问题
- python之列表推导和生成器表达式
- 二叉树的前中后序遍历
- 【tensorflow2.0】处理结构化数据-titanic生存预测
- 【pandas】pandas中的常见函数
- 走进STL - 哈希表,散装称重么
- 第八届蓝桥杯省赛javaB组题目解析
- 拥抱STL - 类/结构体元素查询与排序
- 【tensorflow2.0】处理图片数据-cifar2分类
- 操作系统实验多线程编程中的读者优先和写者优先
- 【python】使用csv库以字典格式读写csv文件
- 基于TypeScript封装Axios笔记(八)
- springmvc之HttpMessageConverter<T>
- django-模板之静态文件加载(十四)
- springmvc之使用JstlView