• 支付宝及时到帐接口


    支付宝有一个类文件叫 AliPay 是一些加密算法的东西

    using System.Web;
    using System.Text;
    using System.Security.Cryptography;
    using System.IO;
    using System.Net;
    using System;
     
    /// <summary>
    /// New Interface for AliPay
    /// </summary>
    namespace Gateway
    {
        public class AliPay
        {
            /// <summary>
            /// 与ASP兼容的MD5加密算法
            /// </summary>
            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.ToString("x").PadLeft(2, '0'));
                }
                return sb.ToString();
            }
     
            /// <summary>
            /// 冒泡排序法
            /// 按照字母序列从a到z的顺序排列
            /// </summary>
            public static string[] BubbleSort(string[] r)
            {
                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;
            }
     
            /// <summary>
            /// 生成URL链接或加密结果
            /// </summary>
            /// <param name="para">参数加密数组</param>
            /// <param name="_input_charset">编码格式</param>
            /// <param name="sign_type">加密类型</param>
            /// <param name="key">安全校验码</param>
            /// <returns>字符串URL或加密结果</returns>
            public static string CreatUrl(
                //string gateway,//GET方式传递参数时请去掉注释
                string[] para,
                string _input_charset,
                string sign_type,
                string key
                )
            {
                int i;
                 
                //进行排序;
                string[] Sortedstr = BubbleSort(para);
     
     
                //构造待md5摘要字符串 ;
     
                StringBuilder prestr = new StringBuilder();
     
                for (i = 0; i < Sortedstr.Length; i++)
                {
                    if (i == Sortedstr.Length - 1)
                    {
                        prestr.Append(Sortedstr);
     
                    }
                    else
                    {
                        prestr.Append(Sortedstr + "&");
                    }
     
                }
     
                prestr.Append(key);
     
                //生成Md5摘要;
                string sign = GetMD5(prestr.ToString(), _input_charset);
     
                //以下是POST方式传递参数
                return sign;
     
            }
     
            //获取远程服务器ATN结果,验证是否是支付宝服务器发来的请求
            public static 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;
            }
     
        }
    }

    支付提交信息页面:

    using System;
    using System.Data;
    using System.Configuration;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;
    using Gateway;
     
    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
        }
        protected void BtnAlipay_Click(object sender, EventArgs e)
        {
            //业务参数赋值;
            string gateway = "https://www.alipay.com/cooperate/gateway.do?";    //支付接口
            string service = "create_direct_pay_by_user";                       //服务名称,这个是识别是何接口实现何功能的标识,请勿修改
     
            string seller_email = "写自己的";                     //商家签约时的支付宝帐号,即收款的支付宝帐号
            string sign_type = "MD5";                                           //加密类型,签名方式“不用改”
            string key = "写自己的";                    //安全校验码,与partner是一组,获取方式是:用签约时支付宝帐号登陆支付宝网站[url=http://www.alipay.com/]www.alipay.com[/url],在商家服务我的商家里即可查到。
            string partner = "写自己的";                                //商户ID,合作身份者ID,合作伙伴ID
            string _input_charset = "utf-8";                                    //编码类型,完全根据客户自身的项目的编码格式而定,千万不要填错。否则极其容易造成MD5加密错误。
     
            string show_url = "http://www.alipay.com/";                         //展示地址,即在支付页面时,商品名称旁边的“详情”的链接地址。
     
            string out_trade_no = TxtOrderno.Text.Trim();                       //客户自己的订单号,订单号必须在自身订单系统中保持唯一性
            string subject = "4.0系统支付宝充值";                            //商品名称,也可称为订单名称,该接口并不是单一的只能买一样东西,可把一次支付当作一次下订单
            string body = "商户:" + TxtOrderno.Text.Trim() + "通过支付宝给自己充值:" + TxtTotal_fee.Text.Trim() + "";                                   //商品描述,即备注
            string total_fee = TxtTotal_fee.Text.Trim();                        //商品价格,也可称为订单的总金额
     
            //服务器通知url(Alipay_Notify.aspx文件所在路经),必须是完整的路径地址
            string notify_url = [url=http://0.0.6.108/Alipay/Alipay_Notify.aspx;]http://0.0.6.108/Alipay/Alipay_Notify.aspx;[/url]
            //服务器返回url(Alipay_Return.aspx文件所在路经),必须是完整的路径地址
            string return_url = [url=http://0.0.6.108/Alipay/Alipay_Return.aspx;]http://0.0.6.108/Alipay/Alipay_Return.aspx;[/url]
     
            //构造数组;
            //以下数组即是参与加密的参数,若参数的值不允许为空,若该参数为空,则不要成为该数组的元素
            string[] para ={
            "service="+service,
            "partner=" + partner,
            "seller_email=" + seller_email,
            "out_trade_no=" + out_trade_no,
            "subject=" + subject,
            "body=" + body,
            "total_fee=" + total_fee,
            "show_url=" + show_url,
            "payment_type=1",
            "notify_url=" + notify_url,
            "return_url=" + return_url,
            "_input_charset="+_input_charset
            };
     
            //支付URL生成
            string aliay_url = AliPay.CreatUrl(
                //gateway,//GET方式传递参数时请去掉注释
                para,
                _input_charset,
                sign_type,
                key
                );
     
            //以下是GET方式传递参数
            //Response.Redirect(aliay_url);
     
            //以下是POST方式传递参数
            Response.Write("<form name='alipaysubmit' method='post' action='https://www.alipay.com/cooperate/gateway.do?_input_charset=utf-8'>");
            Response.Write("<input type='hidden' name='service' value=" + service + ">");
            Response.Write("<input type='hidden' name='partner' value=" + partner + ">");
            Response.Write("<input type='hidden' name='seller_email' value=" + seller_email + ">");
            Response.Write("<input type='hidden' name='out_trade_no' value=" + out_trade_no + ">");
            Response.Write("<input type='hidden' name='subject' value=" + subject + ">");
            Response.Write("<input type='hidden' name='body' value=" + body + ">");
            Response.Write("<input type='hidden' name='total_fee' value=" + total_fee + ">");
            Response.Write("<input type='hidden' name='show_url' value=" + show_url + ">");
            Response.Write("<input type='hidden' name='return_url' value=" + return_url + ">");
            Response.Write("<input type='hidden' name='notify_url' value=" + notify_url + ">");
            Response.Write("<input type='hidden' name='payment_type' value=1>");
            Response.Write("<input type='hidden' name='sign' value=" + aliay_url + ">");
            Response.Write("<input type='hidden' name='sign_type' value=" + sign_type + ">");
            Response.Write("</form>");
            Response.Write("<script>");
            Response.Write("document.alipaysubmit.submit()");
            Response.Write("</script>");
        }
    }
    View Code

    支付成功后,返回验证信息页面:

    using System;
    using System.Data;
    using System.Configuration;
    using System.Collections;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;
    using System.Text;
    using System.Collections.Specialized;
    using System.IO;
    using Gateway;
     
    /// <summary>
    /// 创建该页面文件时,请留心该页面文件是可以对其进行美工处理的,原因在于支付完成以后,当前窗口会从支付宝的页面跳转回这个页面。
    /// 该页面称作“返回页”,是同步被支付宝服务器所调用,可当作是支付完成后的提示信息页,如“您的某某某订单,多少金额已支付成功”。
    /// </summary>
    public partial class Alipay_Return : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            string alipayNotifyURL = "https://www.alipay.com/cooperate/gateway.do?service=notify_verify";
            //string alipayNotifyURL = "http://notify.alipay.com/trade/notify_query.do?";//此路径是在上面链接地址无法起作用时替换使用。
            string key = "写自己的"; //partner 的对应交易安全校验码(必须填写)
            string partner = "写自己的";         //partner合作伙伴id(必须填写)
            string _input_charset = "utf-8";//编码类型,完全根据客户自身的项目的编码格式而定,千万不要填错。否则极其容易造成MD5加密错误。
     
            alipayNotifyURL = alipayNotifyURL + "&partner=" + partner + "¬ify_id=" + Request.QueryString["notify_id"];
     
            //获取支付宝ATN返回结果,true是正确的订单信息,false 是无效的
            string responseTxt = AliPay.Get_Http(alipayNotifyURL, 120000);
     
            //*******加密签名程序开始//*******
            int i;
            NameValueCollection coll;
            //Load Form variables into NameValueCollection variable.
            coll = Request.QueryString;
     
            // Get names of all forms into a string array.
            String[] requestarr = coll.AllKeys;
     
            //进行排序;
            string[] Sortedstr = AliPay.BubbleSort(requestarr);
     
            //构造待md5摘要字符串 ;
     
            StringBuilder prestr = new StringBuilder();
     
            for (i = 0; i < Sortedstr.Length; i++)
            {
                if (Request.Form[Sortedstr] != "" && Sortedstr != "sign" && Sortedstr != "sign_type")
                {
                    if (i == Sortedstr.Length - 1)
                    {
                        prestr.Append(Sortedstr + "=" + Request.QueryString[Sortedstr]);
                    }
                    else
                    {
                        prestr.Append(Sortedstr + "=" + Request.QueryString[Sortedstr] + "&");
     
                    }
                }
            }
     
            prestr.Append(key);
     
            //生成Md5摘要;
            string mysign = AliPay.GetMD5(prestr.ToString(), _input_charset);
            //*******加密签名程序结束*******
     
            string sign = Request.QueryString["sign"];
     
            //  Response.Write(prestr.ToString());  //调试用,支付宝服务器返回时的完整路径。
     
            if (mysign == sign && responseTxt == "true")   //验证支付发过来的消息,签名是否正确
            {
     
                //更新自己数据库的订单语句,请自己填写一下
                string strOrderNO = Request.QueryString["out_trade_no"];//订单号
                string strPrice = Request.QueryString["total_fee"];//金额
                string strTradeStatus = Request.QueryString["TRADE_STATUS"];//订单状态
     
                //更新数据库
    
    
                //交易成功提示
                Response.Write("商户:" + login[1].ToString().Trim() + "<br>金额:" + strPrice + "   交易成功");     //成功,可美化该页面,提示信息
     
              
            }
            else
            {
                //支付失败,提示信息            
                Response.Write("<br>Result:responseTxt=" + responseTxt);
                Response.Write("<br>Result:mysign=" + mysign);
                Response.Write("<br>Result:sign=" + sign);
                Response.Write("支付失败"); 
               
            }
        }
    }
    View Code
  • 相关阅读:
    迷上了塔防游戏Desktop Tower Defense 1.5
    魔方成长路线
    排名进1000
    终于造完了863项目的预算
    利用supermemo背单词达到3000词条
    被Colorgraphic古老的Xentera多屏显卡折腾得不轻
    队式桥牌赛总结(20080503)
    在IIS上设置Gzip压缩设置(备忘)
    警惕使用WebClient.DownloadFile(string uri,string filePath)方法
    WebClient.UploadValues Post中文乱码的解决方法
  • 原文地址:https://www.cnblogs.com/shuaichao/p/3441959.html
Copyright © 2020-2023  润新知