支付宝及时到帐接口

支付宝有一个类文件叫 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

 

你可能感兴趣的:(支付宝)