zoukankan      html  css  js  c++  java
  • .net版,微信免充值代金卷业务开通验收代码

    请先下载官方的DEMO,下载地址:https://pay.weixin.qq.com/wiki/doc/api/download/WxPayAPI_CS.zip

    然后做如下修改,先修改Config.cs为自己的商户号,密钥,公众号等信息

    在Data.cs代码文件增加一个方法用于,生成沙箱测试的签名

            /// <summary>
            /// 获取沙箱密钥
            /// </summary>
            /// <returns></returns>
            public string MakeSandboxSign()
            {
                //转url格式
                string str = ToUrl();
                //在string后加入API KEY
                str += "&key=" + WxPayApi.SandboxGetSignKey().GetValue("sandbox_signkey");
                //MD5加密
                var md5 = MD5.Create();
                var bs = md5.ComputeHash(Encoding.UTF8.GetBytes(str));
                var sb = new StringBuilder();
                foreach (byte b in bs)
                {
                    sb.Append(b.ToString("x2"));
                }
                //所有字符转为大写
                return sb.ToString().ToUpper();
            }

    在WxPayApi.cs文件中增加下列几个方法,完成业务逻辑,这里采用的是1003+1004+1005示例验收方式,

     /// <summary>
            /// 获取沙箱密钥
            /// </summary>
            /// <returns></returns>
            public static WxPayData SandboxGetSignKey()
            {
    
                string url = "https://api.mch.weixin.qq.com/sandboxnew/pay/getsignkey"; //沙箱密钥获取api
                WxPayData wpd = new WxPayData();
                wpd.SetValue("mch_id", WxPayConfig.MCHID);
                wpd.SetValue("nonce_str", GenerateNonceStr());
                wpd.SetValue("sign", wpd.MakeSign());
                string xml = wpd.ToXml();
                var start = DateTime.Now; //请求开始时间
                string response = HttpService.Post(xml, url, false, 6);
                var end = DateTime.Now;
                int timeCost = (int) ((end - start).TotalMilliseconds);
                WxPayData result = new WxPayData();
                result.FromXml(response);
                ReportCostTime(url, timeCost, result); //测速上报
                return result;
            }
    
            /// <summary>
            /// 创建一个订单
            /// </summary>
            /// <param name="OutTradeNo"></param>
            /// <returns></returns>
            public  static  WxPayData SandboxCreateOrder(string OutTradeNo)
            {
                string url = "https://api.mch.weixin.qq.com/sandboxnew/pay/unifiedorder"; 
                WxPayData wpd = new WxPayData();
                wpd.SetValue("appid", WxPayConfig.APPID);
                wpd.SetValue("mch_id", WxPayConfig.MCHID);
                wpd.SetValue("nonce_str", WxPayApi.GenerateNonceStr());
                wpd.SetValue("body", "验收测试");
                wpd.SetValue("out_trade_no", OutTradeNo);
                wpd.SetValue("total_fee", "552");//1003测试此处为551,1004测试完毕要改为552
                wpd.SetValue("spbill_create_ip", "127.0.0.1");
                wpd.SetValue("notify_url", "http://www.weixin.qq.com/wxpay/pay.php");
                wpd.SetValue("trade_type", "NATIVE");
                wpd.SetValue("sign", wpd.MakeSandboxSign());
                string xml = wpd.ToXml();
                var start = DateTime.Now; //请求开始时间
                string response = HttpService.Post(xml, url, false, 6);
                var end = DateTime.Now;
                int timeCost = (int)((end - start).TotalMilliseconds);
                WxPayData result = new WxPayData();
                result.FromXml(response);
                ReportCostTime(url, timeCost, result); //测速上报
                return result;
            }
    
            /// <summary>
            /// 订单查询
            /// </summary>
            /// <param name="OutTradeNo"></param>
            /// <returns></returns>
            public static WxPayData SandboxQuery(string OutTradeNo)
            {
                string url = "https://api.mch.weixin.qq.com/sandboxnew/pay/orderquery"; 
                WxPayData wpd = new WxPayData();
                wpd.SetValue("appid", WxPayConfig.APPID);
                wpd.SetValue("mch_id", WxPayConfig.MCHID);
                wpd.SetValue("nonce_str", WxPayApi.GenerateNonceStr());
                wpd.SetValue("out_trade_no", OutTradeNo);
                wpd.SetValue("sign", wpd.MakeSandboxSign());
                string xml = wpd.ToXml();
                var start = DateTime.Now; //请求开始时间
                string response = HttpService.Post(xml, url, false, 6);
                var end = DateTime.Now;
                int timeCost = (int)((end - start).TotalMilliseconds);
                WxPayData result = new WxPayData();
                result.FromXml(response);
                ReportCostTime(url, timeCost, result); //测速上报
                return result;
            }
    
            /// <summary>
            /// 发起退款
            /// </summary>
            /// <param name="OutTradeNo"></param>
            /// <param name="OutRefundNo">退款单号</param>
            /// <returns></returns>
            public static WxPayData SandboxRefund(string OutTradeNo, string OutRefundNo)
            {
                string url = "https://api.mch.weixin.qq.com/sandboxnew/pay/refund";
                WxPayData wpd = new WxPayData();
                wpd.SetValue("appid", WxPayConfig.APPID);
                wpd.SetValue("mch_id", WxPayConfig.MCHID);
                wpd.SetValue("nonce_str", WxPayApi.GenerateNonceStr());
                wpd.SetValue("out_trade_no", OutTradeNo);
                wpd.SetValue("out_refund_no", OutRefundNo);
                wpd.SetValue("total_fee", "552");
                wpd.SetValue("refund_fee", "551");
                wpd.SetValue("sign", wpd.MakeSandboxSign());
                string xml = wpd.ToXml();
                var start = DateTime.Now; //请求开始时间
                string response = HttpService.Post(xml, url, false, 6);
                var end = DateTime.Now;
                int timeCost = (int) ((end - start).TotalMilliseconds);
                WxPayData result = new WxPayData();
                result.FromXml(response);
                ReportCostTime(url, timeCost, result); //测速上报
                return result;
            }
    
            /// <summary>
            /// 退款查询
            /// </summary>
            /// <param name="OutTradeNo"></param>
            /// <returns></returns>
            public static WxPayData SandboxRefundQuery(string OutTradeNo)
            {
                string url = "https://api.mch.weixin.qq.com/sandboxnew/pay/refundquery";
                WxPayData wpd = new WxPayData();
                wpd.SetValue("appid", WxPayConfig.APPID);
                wpd.SetValue("mch_id", WxPayConfig.MCHID);
                wpd.SetValue("nonce_str", WxPayApi.GenerateNonceStr());
                wpd.SetValue("out_trade_no", OutTradeNo);
                wpd.SetValue("sign", wpd.MakeSandboxSign());
                string xml = wpd.ToXml();
                var start = DateTime.Now; //请求开始时间
                string response = HttpService.Post(xml, url, false, 6);
                var end = DateTime.Now;
                int timeCost = (int)((end - start).TotalMilliseconds);
                WxPayData result = new WxPayData();
                result.FromXml(response);
                ReportCostTime(url, timeCost, result); //测速上报
                return result;
            }
    
            /// <summary>
            /// /下载对账单
            /// </summary>
            /// <param name="BillDate"></param>
            /// <param name="BillType"></param>
            /// <returns></returns>
            public static WxPayData SandboxDownBill(string BillDate, string BillType)
            {
                string url = "https://api.mch.weixin.qq.com/sandboxnew/pay/downloadbill";
                WxPayData wpd = new WxPayData();
                wpd.SetValue("appid", WxPayConfig.APPID);
                wpd.SetValue("mch_id", WxPayConfig.MCHID);
                wpd.SetValue("nonce_str", WxPayApi.GenerateNonceStr());
                wpd.SetValue("bill_date", BillDate);
                wpd.SetValue("bill_type", BillType);
                wpd.SetValue("sign", wpd.MakeSandboxSign());
                string xml = wpd.ToXml();
                var start = DateTime.Now; //请求开始时间
                string response = HttpService.Post(xml, url, false, 6);
                var end = DateTime.Now;
                int timeCost = (int) ((end - start).TotalMilliseconds);
                WxPayData result = new WxPayData();
                result.FromXml(response);
                ReportCostTime(url, timeCost, result); //测速上报
                return result;
            }

    前台测试页面代码

        public partial class test : System.Web.UI.Page
        {
            protected void Page_Load(object sender, EventArgs e)
            {
                if (!IsPostBack)
                {
                    string outTradeNo = DateTime.Now.ToString("yyyyMMddHHMMssfff");
                    Label1.Text = outTradeNo;
                    WxPayData wpd = WxPayApi.SandboxCreateOrder(outTradeNo);
                    string code_url = wpd.GetValue("code_url").ToString();
                    Image1.ImageUrl = "MakeQRCode.aspx?data=" + HttpUtility.UrlEncode(code_url);
                    Response.Write(wpd.ToXml());
                }
            }
    
            protected void Button1_Click(object sender, EventArgs e)
            {
                WxPayData wpd = WxPayApi.SandboxQuery(Label1.Text);
                Label2.Text = wpd.ToPrintStr();
            }
    
            protected void Button2_Click(object sender, EventArgs e)
            {
                WxPayData wpd = WxPayApi.SandboxRefund(Label1.Text, Label1.Text);
                Label2.Text = wpd.ToPrintStr();
            }
    
            protected void Button3_Click(object sender, EventArgs e)
            {
                WxPayData wpd = WxPayApi.SandboxRefundQuery(Label1.Text);
                Label2.Text = Unicode2String(wpd.ToPrintStr());
            }
    
            /// <summary>
            /// Unicode转字符串
            /// </summary>
            /// <param name="source">经过Unicode编码的字符串</param>
            /// <returns>正常字符串</returns>
            public static string Unicode2String(string source)
            {
                return new Regex(@"\u([0-9A-F]{4})", RegexOptions.IgnoreCase | RegexOptions.Compiled).Replace(
                             source, x => string.Empty + Convert.ToChar(Convert.ToUInt16(x.Result("$1"), 16)));
            }
    
            protected void Button4_Click(object sender, EventArgs e)
            {
                WxPayData wpd = WxPayApi.SandboxDownBill("20190507", "ALL");
                Label2.Text = Unicode2String(wpd.ToXml());
            }
    
            protected void Button5_Click(object sender, EventArgs e)
            {
                WxPayData wpd = WxPayApi.SandboxDownBill("20190507", "SUCCESS");
                Label2.Text = Unicode2String(wpd.ToXml());
            }
    
            protected void Button6_Click(object sender, EventArgs e)
            {
                WxPayData wpd = WxPayApi.SandboxDownBill("20190507", "REFUND");
                Label2.Text = Unicode2String(wpd.ToXml());
            }
        }

    希望对大家有帮助~

  • 相关阅读:
    好用的Win7下硬盘分区软件:Acronis Disk Director Suite
    SQL Server 相关create操作语句
    我也有博客了
    N层构架如何实现
    SQL相关增删改查语句
    1.MVC的工作流程
    回顾去年以来读过的书
    [Architecture]Facebook Chat
    [Tips]解决make_sock: could not bind to address 0.0.0.0:XXXX
    Emacs中的按键组合
  • 原文地址:https://www.cnblogs.com/rovedog/p/10849208.html
Copyright © 2011-2022 走看看