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;
    }
}

 

 

转载于:https://www.cnblogs.com/nianyuwen/archive/2012/05/23/2514175.html

接口特点: 1.同时提供银行卡在线支付、声讯电话支付、互联星空支付、手机短信注册、腾讯财付通、 腾讯Q币、神州行充值卡、盛大游戏点卡、支付宝、手机银行、北京宽带支付、联通充值卡 等支付途径。 2.银行卡在线支付支持国内60 余种银行卡(信用卡、储蓄卡、借记卡等)在线支付。 3.全国声讯电话支付支持全国所有省份固定电话、小灵通、中国移动、中国联通手机, 开通移动、联通、电信、网通多个声讯热线号码。 4.中国电信互联星空支付支持直接用163或ADSL上网帐号、各省互联星空网站注册用户支付。 5.支持中国移动、中国联通、中国电信小灵通手机用户发送短信点播赠送服务。 6.开放腾讯公司Q币和财付通支付接口。 7.支持50元、100元、300元、500元等多种面值的移动神州行和联通充值卡支付。 8.各支付途径可任意选择开启或关闭。 9.真正傻瓜式支付接口,提供示例程序,只需简单设置即可使用。 10.设置商户密钥,支付信息加密传递,加强支付安全性,加密系统与其他支付平台兼容。 11.贺喜支付平台(http://www.168reg.cn)提供完善的后台管理系统,提供定单管理、定单 统计、财务管理、用户资料修改、商户密钥设置、推荐用户及技术支持等功能。 12.提交支付信息时可设置服务名称、商户订单号和两个自定义字段,支付成功后实时将支 付结果返回商户网站。 13.提供接口的测试模式,方便商户快捷地开发支付接口程序。 14.您可以登录后台管理系统查看定单以下信息:定单号、用户支付金额、商户所得金额、 自定义订单号、支付日期、结帐信息等。 15.提供定单后台通知系统,彻底解决用户端返回造成的挂单、掉单现象。 16.提供宣传推广代码,推荐其他商户加盟可获得其收入的一定比例分成。 17.开放收费制商户,为商户降低支付成本。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值