JSSDK微信支付封裝的支付類方法,代碼比較齊全,適合收藏

第1確定是配置的參數類web

 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
相關文章
相關標籤/搜索