zoukankan      html  css  js  c++  java
  • JSSDK微信支付封装的支付类方法,代码比较齐全,适合收藏

    第1肯定是配置的参数类

     public class JsApiConfig
        {
            #region 字段
            private string mch_id = string.Empty;
            private string key = string.Empty;
            private string appid = string.Empty;
            private string appsecret = string.Empty;
            private string redirect_url = string.Empty;
            private string notify_url = string.Empty;
            #endregion
    
            public JsApiConfig(int wid, SysModuleNameEnum moduleName = SysModuleNameEnum.小程序商城)
            {
    
                if (moduleName == SysModuleNameEnum.小程序商城)
                {
                    BLL.minapp_setting settingBll = new BLL.minapp_setting();
                    Model.minapp_setting setting = settingBll.GetModelByWid(wid);
                    appid = setting.app_id; //绑定支付的APPID(必须配置)
                    appsecret = setting.app_secret; //公众帐号secert(仅JSAPI支付的时候需要配置)
                }
                else if (moduleName == SysModuleNameEnum.微商城)
                {
                    BLL.wx_userweixin uwxBll = new BLL.wx_userweixin();
                    Model.wx_userweixin uwx = uwxBll.GetModel(wid);
    
                    appid = uwx.AppId; //绑定支付的APPID(必须配置)
                    appsecret = uwx.AppSecret; //公众帐号secert(仅JSAPI支付的时候需要配置)
    
                }
    
                BLL.wx_payment_wxpay wxPayBll = new BLL.wx_payment_wxpay();
                Model.wx_payment_wxpay paymentInfo = wxPayBll.GetModelByWid(wid);
    
                if (paymentInfo != null)
                {
    
                    mch_id = paymentInfo.mch_id; //商户号(必须配置)
                    key = paymentInfo.paykey; //商户支付密钥,参考开户邮件设置(必须配置)
    
    
                    redirect_url = "";// MyCommFun.getAppSettingValue("webapi_url") + "/api/Pay/redirect_url";
                    notify_url = MyCommFun.getAppSettingValue("webapi_url") + "/api/Pay/notify_url";
    
                }
            }
    
            #region 属性
            /// <summary>
            /// 商户号(必须配置)
            /// </summary>
            public string MchId
            {
                get { return mch_id; }
                set { mch_id = value; }
            }
    
            /// <summary>
            /// 获取或设交易安全校验码
            /// </summary>
            public string Key
            {
                get { return key; }
                set { key = value; }
            }
    
            /// <summary>
            /// 绑定支付的APPID(必须配置)
            /// </summary>
            public string AppId
            {
                get { return appid; }
                set { appid = value; }
            }
    
            /// <summary>
            /// 公众帐号secert(仅JSAPI支付的时候需要配置)
            /// </summary>
            public string AppSecret
            {
                get { return appsecret; }
                set { appsecret = value; }
            }
    
            /// <summary>
            /// 获取用户的OPENID回调地址
            /// </summary>
            public string Redirect_url
            {
                get { return redirect_url; }
            }
    
            /// <summary>
            /// 获取服务器异步通知页面路径
            /// </summary>
            public string Notify_url
            {
                get { return notify_url; }
            }
    
            #endregion
        }
    View Code

    第2就是正主来了,所有的微信支付的逻辑方法

    public class JsApiPay
        {
            /**
            * 
            * 测速上报
            * @param string interface_url 接口URL
            * @param int timeCost 接口耗时
            * @param WxPayData inputObj参数数组
            */
            public static void ReportCostTime(int wid, string interface_url, int timeCost, WxPayData inputObj, SysModuleNameEnum moduleName = SysModuleNameEnum.小程序商城)
            {
                //如果仅失败上报
                if (inputObj.IsSet("return_code") && inputObj.GetValue("return_code").ToString() == "SUCCESS" &&
                 inputObj.IsSet("result_code") && inputObj.GetValue("result_code").ToString() == "SUCCESS")
                {
                    return;
                }
    
                //上报逻辑
                WxPayData data = new WxPayData();
                data.SetValue("interface_url", interface_url);
                data.SetValue("execute_time_", timeCost);
                //返回状态码
                if (inputObj.IsSet("return_code"))
                {
                    data.SetValue("return_code", inputObj.GetValue("return_code"));
                }
                //返回信息
                if (inputObj.IsSet("return_msg"))
                {
                    data.SetValue("return_msg", inputObj.GetValue("return_msg"));
                }
                //业务结果
                if (inputObj.IsSet("result_code"))
                {
                    data.SetValue("result_code", inputObj.GetValue("result_code"));
                }
                //错误代码
                if (inputObj.IsSet("err_code"))
                {
                    data.SetValue("err_code", inputObj.GetValue("err_code"));
                }
                //错误代码描述
                if (inputObj.IsSet("err_code_des"))
                {
                    data.SetValue("err_code_des", inputObj.GetValue("err_code_des"));
                }
                //商户订单号
                if (inputObj.IsSet("out_trade_no"))
                {
                    data.SetValue("out_trade_no", inputObj.GetValue("out_trade_no"));
                }
                //设备号
                if (inputObj.IsSet("device_info"))
                {
                    data.SetValue("device_info", inputObj.GetValue("device_info"));
                }
    
                try
                {
                    Report(wid, data, 1,moduleName);
                }
                catch (WxPayException ex)
                {
                    //不做任何处理
                }
            }
    
            /**
            * 
            * 测速上报接口实现
            * @param WxPayData inputObj 提交给测速上报接口的参数
            * @param int timeOut 测速上报接口超时时间
            * @throws WxPayException
            * @return 成功时返回测速上报接口返回的结果,其他抛异常
            */
            public static WxPayData Report(int wid, WxPayData inputObj, int timeOut = 1, SysModuleNameEnum moduleName = SysModuleNameEnum.小程序商城)
            {
                JsApiConfig jsApiConfig = new JsApiConfig(wid, moduleName);
                string url = "https://api.mch.weixin.qq.com/payitil/report";
                //检测必填参数
                if (!inputObj.IsSet("interface_url"))
                {
                    throw new WxPayException("接口URL,缺少必填参数interface_url!");
                }
                if (!inputObj.IsSet("return_code"))
                {
                    throw new WxPayException("返回状态码,缺少必填参数return_code!");
                }
                if (!inputObj.IsSet("result_code"))
                {
                    throw new WxPayException("业务结果,缺少必填参数result_code!");
                }
                if (!inputObj.IsSet("user_ip"))
                {
                    throw new WxPayException("访问接口IP,缺少必填参数user_ip!");
                }
                if (!inputObj.IsSet("execute_time_"))
                {
                    throw new WxPayException("接口耗时,缺少必填参数execute_time_!");
                }
    
                inputObj.SetValue("appid", jsApiConfig.AppId);//公众账号ID
                inputObj.SetValue("mch_id", jsApiConfig.MchId);//商户号
                inputObj.SetValue("user_ip", MXRequest.GetIP());//终端ip
                inputObj.SetValue("time", DateTime.Now.ToString("yyyyMMddHHmmss"));//商户上报时间     
                inputObj.SetValue("nonce_str", GenerateNonceStr());//随机字符串
                inputObj.SetValue("sign", inputObj.MakeSign(jsApiConfig.Key));//签名
                string xml = inputObj.ToXml();
    
                string response = HttpService.Post(xml, url, false, timeOut);
    
                WxPayData result = new WxPayData();
                result.FromXml(response, jsApiConfig.Key);
                return result;
            }
    
            /**
            * 生成时间戳,标准北京时间,时区为东八区,自1970年1月1日 0点0分0秒以来的秒数
             * @return 时间戳
            */
            public static string GenerateTimeStamp()
            {
                TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);
                return Convert.ToInt64(ts.TotalSeconds).ToString();
            }
    
            /**
            * 生成随机串,随机串包含字母或数字
            * @return 随机串
            */
            public static string GenerateNonceStr()
            {
                return Guid.NewGuid().ToString().Replace("-", "");
            }
    
            /// <summary>
            /// 接收从微信支付后台发送过来的数据暂不验证签名
            /// </summary>
            /// <returns>微信支付后台返回的数据</returns>
            public static WxPayData GetNotifyData()
            {
                string xml = @"<xml>
      <appid><![CDATA[wxa19e37b5749fecaf]]></appid>
      <attach><![CDATA[11|266|3259]]></attach>
      <bank_type><![CDATA[CFT]]></bank_type>
      <fee_type><![CDATA[CNY]]></fee_type>
      <is_subscribe><![CDATA[Y]]></is_subscribe>
      <mch_id><![CDATA[10011937]]></mch_id>
      <nonce_str><![CDATA[5d2b6c2a8db53831f7eda20af46e531c]]></nonce_str>
      <openid><![CDATA[o3qjz0N_nPDciLB0B8HegzkVqPfc]]></openid>
      <out_trade_no><![CDATA[b18061617463603]]></out_trade_no>
      <result_code><![CDATA[SUCCESS]]></result_code>
      <return_code><![CDATA[SUCCESS]]></return_code>
      <sign><![CDATA[B552ED6B279343CB493C5DD0D78AB241]]></sign>
      <sub_mch_id><![CDATA[10000100]]></sub_mch_id>
      <time_end><![CDATA[20140903131540]]></time_end>
      <total_fee>20</total_fee>
    <coupon_fee><![CDATA[0]]></coupon_fee>
    <coupon_count><![CDATA[0]]></coupon_count>
    <coupon_type><![CDATA[CASH]]></coupon_type>
    <coupon_id><![CDATA[0]]></coupon_id>
    <coupon_fee><![CDATA[0]]></coupon_fee>
      <trade_type><![CDATA[JSAPI]]></trade_type>
      <transaction_id><![CDATA[4200000109201806160140124926]]></transaction_id>
    </xml> ";
                //接收从微信后台POST过来的数据
                //if (1==1)
                //{//测试专用
    
                
                System.IO.Stream s = HttpContext.Current.Request.InputStream;
                int count = 0;
                byte[] buffer = new byte[1024];
                StringBuilder builder = new StringBuilder();
                while ((count = s.Read(buffer, 0, 1024)) > 0)
                {
                    builder.Append(Encoding.UTF8.GetString(buffer, 0, count));
                }
                s.Flush();
                s.Close();
                s.Dispose();
               // }
                //转换数据格式并验证签名
                WxPayData data = new WxPayData();
                try
                {
                    LogHelper.Debug("builder.ToString()=" + builder.ToString(), 0, "微信支付回调", "获取回调数据xml", "GetNotifyData");
                    data.FromXml(builder.ToString());
                    // data.FromXml(xml);
                }
                catch (WxPayException ex)
                {
                    //若有错误,则立即返回结果给微信支付后台
                    WxPayData res = new WxPayData();
                    res.SetValue("return_code", "FAIL");
                    res.SetValue("return_msg", ex.Message);
                    HttpContext.Current.Response.Write(res.ToXml());
                    HttpContext.Current.Response.End();
                }
    
                return data;
            }
    
            /**
            *    
            * 查询订单
            * @param WxPayData inputObj 提交给查询订单API的参数
            * @param int timeOut 超时时间
            * @throws WxPayException
            * @return 成功时返回订单查询结果,其他抛异常
            */
            public static WxPayData OrderQuery(int wid, WxPayData inputObj, int timeOut = 6, SysModuleNameEnum moduleName = SysModuleNameEnum.小程序商城)
            {
                string sendUrl = "https://api.mch.weixin.qq.com/pay/orderquery";
                //检测必填参数
                if (!inputObj.IsSet("out_trade_no") && !inputObj.IsSet("transaction_id"))
                {
                    throw new WxPayException("订单查询接口中,out_trade_no、transaction_id至少填一个!");
                }
                JsApiConfig jsApiConfig = new JsApiConfig(wid);
                inputObj.SetValue("appid", jsApiConfig.AppId);//公众账号ID
                inputObj.SetValue("mch_id", jsApiConfig.MchId);//商户号
                inputObj.SetValue("nonce_str", GenerateNonceStr());//随机字符串
                inputObj.SetValue("sign", inputObj.MakeSign(jsApiConfig.Key));//签名
                string xml = inputObj.ToXml();
                var startTime = DateTime.Now; //开始时间
                string response = HttpService.Post(xml, sendUrl, false, timeOut);//调用HTTP通信接口提交数据
                var endTime = DateTime.Now; //结束时间
                int timeCost = (int)((endTime - startTime).TotalMilliseconds); //计算所用时间
                //将xml格式的数据转化为对象以返回
                WxPayData result = new WxPayData();
                result.FromXml(response, jsApiConfig.Key);
                ReportCostTime(wid, sendUrl, timeCost, result);//测速上报
                return result;
            }
    
        }
    View Code
  • 相关阅读:
    关于ios8斯坦福公开课第二课
    关于cocoapods和swift中使用oc第三方
    swift 关于闭包和函数
    同步、异步请求
    AFNETWORKING tabelView没有reloadData,报错unsupported URL
    在模型中获取网络数据,刷新tableView
    界面随键盘顶起来
    Java并发编程:线程池的使用
    比较好的介绍线程池的文章
    一篇很不错的dubbo学习文章
  • 原文地址:https://www.cnblogs.com/puzi0315/p/9788988.html
Copyright © 2011-2022 走看看