• asp.net关于在线支付的实现过程


    此例分三个页面分别为: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 +
                              "&notify_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 +
                              "&notify_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 +
                              "&notify_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;
        }
    }
    

     

  • 相关阅读:
    MySQL用户
    python -- 中
    Python -- 上
    Zabbix导入数据库时报错
    chmod无执行权限
    编译安装Tengine
    Nginx的调度算法
    nginx--第三方模块echo
    ngx_http_headers_module
    nginx---隐藏或添加后端服务器的信息
  • 原文地址:https://www.cnblogs.com/nianyuwen/p/2514175.html
Copyright © 2020-2023  润新知