关于我们

质量为本、客户为根、勇于拼搏、务实创新

< 返回新闻公共列表

支付宝手机网页支付代码

发布时间:2019-11-19 16:38:48

支付宝手机页面支付功能的代码详解:

页面一:发起支付

<%@ WebHandler Language="C#" Class="DTcms.Web.dev.alipaymb" %>

using System;

using System.Collections.Generic;

using System.Web;

using System.Web.UI;

using System.Web.UI.WebControls;

using DTcms.Common;

using DTcms.DBUtility;

using NetWing.Common.Data.SQLServer;

using NetWing.Common.Request;

using DTcms.API.Payment.alipaymb;

namespace DTcms.Web.dev

{

    /// <summary> 

    /// 用户绑定类

    /// </summary> 

    //alipay1 这个类可以自定义 必须和上面保持一致

    public class alipaymb : IHttpHandler

    {

        public void ProcessRequest(HttpContext context)

        {

            //业务逻辑放在这里

            //业务逻辑放在这里

            //发起支付s

            //读取站点配置信息

            Model.siteconfig siteConfig = new BLL.siteconfig().loadConfig();

            //===============================建立请求==================================

            string GATEWAY_NEW = "http://wappaygw.alipay.com/service/rest.htm?"; //支付宝网关地址

            string format = "xml"; //返回格式,必填,不需要修改

            string v = "2.0"; //必填,不需要修改

            string req_id = DateTime.Now.ToString("yyyyMMddHHmmss"); //必填,须保证每次请求都是唯一

            string order_no = "C" + req_id;

            string Notify_url = "http://d.18guai.com/dev/alipaymb_notify_url.ashx";//业务逻辑地址

            string Return_url = "http://d.18guai.com/dev/alipaymb_return_url.ashx";//成功通知地址

            string subject = "";//标题

            string order_amount = context.Request["order_amount"];//金额

            //请求业务参数详细,必填

            string req_dataToken = "<direct_trade_create_req><notify_url>" + Notify_url + "</notify_url><call_back_url>"

                + Return_url + "</call_back_url><seller_account_name>" + Config.Seller_email + "</seller_account_name><out_trade_no>"

                + order_no + "</out_trade_no><subject>" + siteConfig.webname + "-" + subject + "</subject><total_fee>" + order_amount.ToString()

                + "</total_fee><merchant_url></merchant_url></direct_trade_create_req>";

            //把请求参数打包成数组

            Dictionary<string, string> sParaTempToken = new Dictionary<string, string>();

            sParaTempToken.Add("partner", Config.Partner);

            sParaTempToken.Add("_input_charset", Config.Input_charset.ToLower());

            sParaTempToken.Add("sec_id", Config.Sign_type.ToUpper());

            sParaTempToken.Add("service", "alipay.wap.trade.create.direct");

            sParaTempToken.Add("format", format);

            sParaTempToken.Add("v", v);

            sParaTempToken.Add("req_id", req_id);

            sParaTempToken.Add("req_data", req_dataToken);

            //建立请求

            string sHtmlTextToken = Submit.BuildRequest(GATEWAY_NEW, sParaTempToken);

            //URLDECODE返回的信息

            System.Text.Encoding code = System.Text.Encoding.GetEncoding(Config.Input_charset);

            sHtmlTextToken = HttpUtility.UrlDecode(sHtmlTextToken, code);

            //解析远程模拟提交后返回的信息

            Dictionary<string, string> dicHtmlTextToken = Submit.ParseResponse(sHtmlTextToken);

            //获取token

            string request_token = dicHtmlTextToken["request_token"];

            //业务详细,必填

            string req_data = "<auth_and_execute_req><request_token>" + request_token + "</request_token></auth_and_execute_req>";

            //把请求参数打包成数组

            Dictionary<string, string> sParaTemp = new Dictionary<string, string>();

            sParaTemp.Add("partner", Config.Partner);

            sParaTemp.Add("_input_charset", Config.Input_charset.ToLower());

            sParaTemp.Add("sec_id", Config.Sign_type.ToUpper());

            sParaTemp.Add("service", "alipay.wap.auth.authAndExecute");

            sParaTemp.Add("format", format);

            sParaTemp.Add("v", v);

            sParaTemp.Add("req_data", req_data);

            //建立请求

            string sHtmlText = Submit.BuildRequest(GATEWAY_NEW, sParaTemp, "get", "确认");

            context.Response.Write(sHtmlText);

            //发起支付e

        }

        public bool IsReusable

        {

            get

            {

                return false;

            }

        }

    }

}

页面二:通知页面


<%@ WebHandler Language="C#" Class="DTcms.Web.dev.alipaymb_notify_url" %>

//上面这个wxnetpaysend 可以自定义

using System;

using System.Collections;

using System.Collections.Generic;

using System.Collections.Specialized;

using System.Web;

using System.Web.SessionState;

using System.IO;

using System.Xml;

using System.Text;

using System.Data;

using System.Data.Sql;

using System.Data.SqlClient;

using DTcms.Common;

using DTcms.DBUtility;

using NetWing.Common.Data.SQLServer;

using NetWing.Common.Request;

using DTcms.API.Payment.alipaymb;

namespace DTcms.Web.dev

{

    /// <summary> 

    /// 用户绑定类

    /// </summary> 

    //wxnetpaysend 这个类可以自定义 必须和上面保持一致

    public class alipaymb_notify_url : IHttpHandler, IRequiresSessionState

    {

        public void ProcessRequest(HttpContext context)

        {

            Dictionary<string, string> sPara = GetRequestPost(context);

            if (sPara.Count > 0)//判断是否有带返回参数

            {

                Notify aliNotify = new Notify();

                bool verifyResult = aliNotify.VerifyNotify(sPara, context.Request.Form["sign"]);

                if (verifyResult)//验证成功

                {

                    try

                    {

                        XmlDocument xmlDoc = new XmlDocument();

                        xmlDoc.LoadXml(sPara["notify_data"]);

                        string trade_no = xmlDoc.SelectSingleNode("/notify/trade_no").InnerText; //支付宝交易号

                        string order_no = xmlDoc.SelectSingleNode("/notify/out_trade_no").InnerText; //商户订单号

                        string total_fee = xmlDoc.SelectSingleNode("/notify/total_fee").InnerText; //获取总金额

                        string trade_status = xmlDoc.SelectSingleNode("/notify/trade_status").InnerText; //交易状态

                        if (trade_status == "TRADE_FINISHED" || trade_status == "TRADE_SUCCESS" || trade_status == "success")

                        {

                            //业务逻辑写在这里s

                            System.IO.File.AppendAllText(Utils.GetMapPath("alipaymblog.txt"), "接口类型:支付宝手机wap支付,支付宝交易订单号:"+trade_no+"商户订单号:"+order_no+"总金额:"+total_fee+"支付状态:"+trade_status+"\n", System.Text.Encoding.UTF8);

                            //业务逻辑写在这里e

                            //context.Response.Write("success");  //请不要修改或删除

                            return;

                        }

                        else

                        {

                            context.Response.Write(trade_status);

                        }

                    }

                    catch (Exception ex)

                    {

                        context.Response.Write(ex.ToString());

                    }

                }

                else //验证失败

                {

                    context.Response.Write("fail");

                }

            }

            else

            {

                context.Response.Write("无通知参数");

            }

        }

        /// <summary>

        /// 获取支付宝POST过来通知消息,并以“参数名=参数值”的形式组成数组

        /// </summary>

        /// <returns>request回来的信息组成的数组</returns>

        public Dictionary<string, string> GetRequestPost(HttpContext context)

        {

            int i = 0;

            Dictionary<string, string> sArray = new Dictionary<string, string>();

            NameValueCollection coll;

            coll = context.Request.Form;

            String[] requestItem = coll.AllKeys;

            for (i = 0; i < requestItem.Length; i++)

            {

                sArray.Add(requestItem[i], context.Request.Form[requestItem[i]]);

            }

            return sArray;

        }

        public bool IsReusable

        {

            get

            {

                return false;

            }

        }

    }

}

页面三:逻辑业务处理页面

<%@ WebHandler Language="C#" Class="DTcms.Web.dev.alipaymb_return_url" %>

//上面这个wxnetpaysend 可以自定义

using System;

using System.Collections;

using System.Collections.Generic;

using System.Collections.Specialized;

using System.Web;

using System.Web.SessionState;

using System.IO;

using System.Text;

using System.Data;

using System.Data.Sql;

using System.Data.SqlClient;

using DTcms.Common;

using DTcms.DBUtility;

using NetWing.Common.Data.SQLServer;

using NetWing.Common.Request;

using DTcms.API.Payment.alipaymb;

namespace DTcms.Web.dev

{

    /// <summary> 

    /// 用户绑定类

    /// </summary> 

    //wxnetpaysend 这个类可以自定义 必须和上面保持一致

    public class alipaymb_return_url : IHttpHandler, IRequiresSessionState

    {

        public void ProcessRequest(HttpContext context)

        {

            //读取站点配置信息

            Model.siteconfig siteConfig = new BLL.siteconfig().loadConfig();

            Dictionary<string, string> sPara = GetRequestGet(context);

            if (sPara.Count > 0)//判断是否有带返回参数

            {

                Notify aliNotify = new Notify();

                bool verifyResult = aliNotify.VerifyReturn(sPara, context.Request.QueryString["sign"]);

                if (verifyResult)//验证成功

                {

                    //——请根据您的业务逻辑来编写程序(以下代码仅作参考)——

                    //获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表

                    string trade_no = DTRequest.GetString("trade_no");      //支付宝交易号

                    string order_no = DTRequest.GetString("out_trade_no");  //获取订单号

                    string result = DTRequest.GetString("result");          //交易状态

                    if (result == "TRADE_FINISHED" || result == "TRADE_SUCCESS" || result=="success")

                    {

                        //成功状态

                        context.Response.Write("<html><body><h1>支付成功!订单号:" + order_no + "</h1></body></html>");

                        return;

                    }

                }

            }

            //失败状态

            context.Response.Write("<html><body><h1>支付失败!</h1></body></html>");

            return;

        }

        /// <summary>

        /// 获取支付宝GET过来通知消息,并以“参数名=参数值”的形式组成数组

        /// </summary>

        /// <returns>request回来的信息组成的数组</returns>

        public Dictionary<string, string> GetRequestGet(HttpContext context)

        {

            int i = 0;

            Dictionary<string, string> sArray = new Dictionary<string, string>();

            NameValueCollection coll;

            coll = context.Request.QueryString;

            String[] requestItem = coll.AllKeys;

            for (i = 0; i < requestItem.Length; i++)

            {

                sArray.Add(requestItem[i], context.Request.QueryString[requestItem[i]]);

            }

            return sArray;

        }

        public bool IsReusable

        {

            get

            {

                return false;

            }

        }

    }

}




/template/Home/Zkeys/PC/Static