关于我们

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

< 返回新闻公共列表

翼通微信API支付方法(附代码)

发布时间:2019-11-20 10:24:40

翼通微信API支付方法,代码如下:

代码一:取得code

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

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

using System;

using System.Collections.Generic;

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.wxpay;//必须引入微信支付类

using Senparc.Weixin.MP.TenPayLibV3;//必须引入微信支付类用于生产不重复订单号

namespace DTcms.Web.dev

{

    /// <summary> 

    /// 用户绑定类

    /// </summary> 

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

    public class wxpaydemo1 : IHttpHandler, IRequiresSessionState

    {

        public void ProcessRequest(HttpContext context)

        {

            context.Response.ContentType = "text / plain";

            //调用【网页授权获取用户信息】接口获取用户的openid和access_token

            //获取用户的OPENID回调地址

            string redirect_url = "http://" + HttpContext.Current.Request.Url.Authority.ToLower() + "/dev/wxpaydemo2.ashx";

            JsApiConfig jsApiConfig = new JsApiConfig();

            WxPayData data = new WxPayData();

            data.SetValue("appid", jsApiConfig.AppId);

            data.SetValue("redirect_uri", HttpUtility.UrlEncode(redirect_url));

            data.SetValue("response_type", "code");

            data.SetValue("scope", "snsapi_base");

            data.SetValue("state", "yes#wechat_redirect"); //state这个不是必须

            string url = "https://open.weixin.qq.com/connect/oauth2/authorize?" + data.ToUrl();

            try

            {

                //触发微信返回code码         

                //Response.Redirect(url);//Redirect函数会抛出ThreadAbortException异常,不用处理这个异常

                context.Response.Redirect(url);

            }

            catch (System.Threading.ThreadAbortException ex)

            {

                    //context.Response.Write(ex);

            }

        }

        public bool IsReusable

        {

            get

            {

                return false;

            }

        }

    }

}

代码二:取得openid

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

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

using System;

using System.Collections.Generic;

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.wxpay;//必须引入微信支付类

using Senparc.Weixin.MP.TenPayLibV3;//必须引入微信支付类用于生产不重复订单号

namespace DTcms.Web.dev

{

    /// <summary> 

    /// 用户绑定类

    /// </summary> 

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

    public class wxpaydemo2 : IHttpHandler, IRequiresSessionState

    {

        public void ProcessRequest(HttpContext context)

        {

            context.Response.ContentType = "text / plain";

            //这步只是取得code 和传过来的state 这里没有用到state这个参数,state可以传单号、用户id等

            string code = context.Request.QueryString["code"];

            //获取openid及access_token的url

            try

            {

                JsApiConfig jsApiConfig = new JsApiConfig();

                WxPayData data = new WxPayData();

                data.SetValue("appid", jsApiConfig.AppId);

                data.SetValue("secret", jsApiConfig.AppSecret);

                data.SetValue("code", code);

                data.SetValue("grant_type", "authorization_code");

                string url = "https://api.weixin.qq.com/sns/oauth2/access_token?" + data.ToUrl();

                //请求url以获取数据

                string result = HttpService.Get(url);

                //获取用户openid

                Dictionary<string, object> dic = JsonHelper.DataRowFromJSON(result);

                string openid = (string)dic["openid"];

                //跳转转值到处理页面  后面多加了个false 详细见下面

                context.Response.Redirect("wxpaydemo3.ashx?openid=" + openid, false);

            }

            catch (Exception ex)

            {

                throw new Exception(ex.ToString());

            }

        }

        public bool IsReusable

        {

            get

            {

                return false;

            }

        }

    }

}

代码三:生成jsapi支付

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

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

using System;

using System.Collections.Generic;

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.wxpay;//必须引入微信支付类

using Senparc.Weixin.MP.TenPayLibV3;//必须引入微信支付类用于生产不重复订单号

namespace DTcms.Web.dev

{

    /// <summary> 

    /// 用户绑定类

    /// </summary> 

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

    public class wxpaydemo3 : IHttpHandler, IRequiresSessionState

    {

        public static string wxJsApiParam = "";

        public static string returnUrl = "http://lab.yn137.com/";//支付成功后跳转url

        public void ProcessRequest(HttpContext context)

        {

            context.Response.ContentType = "text/html";

            //生成不重复订单号

            string sp_billno = DateTime.Now.ToString("HHmmss") + TenPayV3Util.BuildRandomStr(28);

            string openid = DTRequest.GetQueryString("openid");

            try

            {

                //统一下单

                string sendUrl = "https://api.mch.weixin.qq.com/pay/unifiedorder";

                //支付成功或失败通知文件

                string notify_url = "http://" + HttpContext.Current.Request.Url.Authority.ToLower() + "/dev/wxpaydemoreceive.ashx";

                JsApiConfig jsApiConfig = new JsApiConfig();

                WxPayData data = new WxPayData();

                data.SetValue("body", "测试商品"); //商品描述

                data.SetValue("detail", "测试商品详情"); //商品详情

                data.SetValue("out_trade_no", sp_billno); //商户订单号

                data.SetValue("total_fee", (Convert.ToDouble(0.1) * 100).ToString()); //订单总金额,以分为单位

                data.SetValue("trade_type", "JSAPI"); //交易类型

                data.SetValue("openid", openid); //公众账号ID

                data.SetValue("appid", jsApiConfig.AppId); //公众账号ID

                data.SetValue("mch_id", jsApiConfig.Partner); //商户号

                data.SetValue("nonce_str", JsApiPay.GenerateNonceStr()); //随机字符串

                data.SetValue("notify_url", notify_url); //异步通知url

                data.SetValue("spbill_create_ip", DTRequest.GetIP()); //终端IP

                data.SetValue("sign", data.MakeSign(jsApiConfig.Key)); //签名

                string xml = data.ToXml(); //转换成XML

                var startTime = DateTime.Now; //开始时间

                string response = HttpService.Post(xml, sendUrl, false, 6); //发送请求

                var endTime = DateTime.Now; //结束时间

                int timeCost = (int)((endTime - startTime).TotalMilliseconds); //计算所用时间

                WxPayData result = new WxPayData();

                result.FromXml(response, jsApiConfig.Key);

                JsApiPay.ReportCostTime(sendUrl, timeCost, result);//测速上报

                //获取H5调起JS API参数

                WxPayData jsApiParam = new WxPayData();

                jsApiParam.SetValue("appId", result.GetValue("appid"));

                jsApiParam.SetValue("timeStamp", JsApiPay.GenerateTimeStamp());

                jsApiParam.SetValue("nonceStr", JsApiPay.GenerateNonceStr());

                jsApiParam.SetValue("package", "prepay_id=" + result.GetValue("prepay_id"));

                jsApiParam.SetValue("signType", "MD5");

                jsApiParam.SetValue("paySign", jsApiParam.MakeSign(jsApiConfig.Key));

                wxJsApiParam = jsApiParam.ToJson();

            }

            catch (Exception ex)

            {

                context.Response.Write("调用JSAPI下单失败,请检查微信授权目录是否已注册!");

                return;

            }

            StringBuilder sb = new StringBuilder();

            sb.Append("<!DOCTYPE html> \r\n");

            sb.Append("<html xmlns=\"http://www.w3.org/1999/xhtml\"> \r\n");

            sb.Append("<head> \r\n");

            sb.Append("<meta http-equiv=\"content-type\" content=\"text/html; charset =utf-8\"/> \r\n");

            sb.Append("<meta name=\"viewport\" content=\"width=device-width,initial-scale=1\"/> \r\n");

            sb.Append("<title>微信公众号支付</title> \r\n");

            sb.Append("<script type=\"text/javascript\"> \r\n");

            //sb.Append("    alert(); \r\n");

            sb.Append("    //调用微信JS api 支付 \r\n");

            sb.Append("    function jsApiCall(){ \r\n");

            sb.Append("        WeixinJSBridge.invoke( \r\n");

            sb.Append("            'getBrandWCPayRequest', \r\n");

            sb.Append("            " + wxJsApiParam + ", //josn串 \r\n");

            sb.Append("            function (res){ \r\n");

            sb.Append("                WeixinJSBridge.log(res.err_msg); \r\n");

            sb.Append("                 if(res.err_msg =='get_brand_wcpay_request:ok') { \r\n");

            sb.Append("                    window.location.href='" + returnUrl + "'; //成功后跳转到提示页面 \r\n");

            sb.Append("                 } \r\n");

            sb.Append("            } \r\n");

            sb.Append("        ); \r\n");

            sb.Append("    } \r\n");

            sb.Append("    function callpay(){ \r\n");

            sb.Append("        if (typeof WeixinJSBridge =='undefined'){ \r\n");

            sb.Append("            if (document.addEventListener){ \r\n");

            sb.Append("                document.addEventListener('WeixinJSBridgeReady', jsApiCall, false); \r\n");

            sb.Append("            }else if (document.attachEvent){ \r\n");

            sb.Append("                document.attachEvent('WeixinJSBridgeReady', jsApiCall); \r\n");

            sb.Append("                document.attachEvent('onWeixinJSBridgeReady', jsApiCall); \r\n");

            sb.Append("            } \r\n");

            sb.Append("        }else{ \r\n");

            sb.Append("            jsApiCall(); \r\n");

            sb.Append("        } \r\n");

            sb.Append("    } \r\n");

            sb.Append("    //页面加载完成后执行函数 \r\n");

            sb.Append("    window.onload = callpay; \r\n");

            sb.Append("</script> \r\n");

            sb.Append("</head> \r\n");

            sb.Append("<body> \r\n");

            sb.Append("</body> \r\n");

            sb.Append("</html> \r\n");

            sb.Append(" ");

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

            sb.Clear();

        }

        public bool IsReusable

        {

            get

            {

                return false;

            }

        }

    }

}

代码四:通知页面 写入日志

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

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

using System;

using System.Collections.Generic;

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.wxpay;//必须引入微信支付类

using Senparc.Weixin.MP.TenPayLibV3;//必须引入微信支付类用于生产不重复订单号

namespace DTcms.Web.dev

{

    /// <summary> 

    /// 用户绑定类

    /// </summary> 

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

    public class wxpaydemoreceive : IHttpHandler, IRequiresSessionState

    {

        public void ProcessRequest(HttpContext context)

        {

            context.Response.ContentType = "text / plain";

            WxPayData notifyData = JsApiPay.GetNotifyData();

            string transaction_id = notifyData.GetValue("transaction_id").ToString(); //微信支付订单号

            string order_no = notifyData.GetValue("out_trade_no").ToString(); //商户订单号

            string total_fee = notifyData.GetValue("total_fee").ToString(); //获取总金额

            if (!string.IsNullOrEmpty(total_fee))

            {

                string path = context.Server.MapPath("log.txt");//文件存放路径,保证文件存在。

                StreamWriter sw = new StreamWriter(path, true);

                sw.WriteLine("成功|"+DateTime.Now.ToString()+"|"+transaction_id+"|"+order_no+"|"+total_fee);

                sw.Close();

            }

            else

            {

                string path = context.Server.MapPath("log.txt");//文件存放路径,保证文件存在。

                StreamWriter sw = new StreamWriter(path, true);

                sw.WriteLine("失败|"+DateTime.Now.ToString()+"|"+transaction_id+"|"+order_no+"|"+total_fee);

                sw.Close();

            }

        }

        public bool IsReusable

        {

            get

            {

                return false;

            }

        }

    }

}



/template/Home/Zkeys/PC/Static