Пример #1
0
        public ActionResult Refund()
        {
            var doc   = XDocument.Load(Request.InputStream);
            var sPara = doc.Root.Descendants().ToDictionary(x => x.Name.LocalName, x => x.Value);

            if (sPara.Count <= 0)
            {
                throw new ArgumentNullException();
            }
            LogWriter.Default.WriteError("Refund Parameters:" + sPara.ToString());//记录请求关键信息到日志中去
            bool isVerify = false;
            var  sign     = sPara["sign"];
            var  retcode  = sPara["retcode"];

            if (retcode != "0")
            {
                isVerify = false;
            }
            else
            {
                var signValue = WxPayAPI.Sign(sPara, WeixinConfig.PartnerKey);
                isVerify = sign == signValue;
            }
            if (!isVerify)
            {
                return(Content(string.Format("<xml><return_code><![CDATA[{0}]]></return_code></xml>", "FAIL")));
            }
            //TODO:商户处理订单逻辑

            //END 商户处理订单逻辑
            string out_trade_no = sPara["out_trade_no"];//商户订单ID: 1.注意交易单不要重复处理;2.注意判断返回金额

            return(Content(string.Format("<xml><return_code><![CDATA[{0}]]></return_code><return_msg><![CDATA[{1}]]></return_msg></xml>", "SUCCESS", "OK")));
        }
        public ActionResult Notify()
        {
            var form  = Request.QueryString;
            var sPara = GetRequestPost(form);

            if (sPara.Count <= 0)
            {
                throw new ArgumentNullException();
            }
            Log.Instence.LogWriteLine(form.ToString());//记录请求关键信息到日志中去
            if (sPara["return_code"] == "SUCCESS" && sPara["return_code"] == "SUCCESS")
            {
                var  sign_type = sPara["sign_type"];
                var  sign      = sPara["sign"];
                var  signValue = WxPayAPI.Sign(sPara, WeixinConfig.PartnerKey);
                bool isVerify  = sign == signValue;
                if (isVerify)
                {
                    var out_trade_no = sPara["out_trade_no"];
                    //TODO 商户处理订单逻辑: 1.注意交易单不要重复处理;2.注意判断返回金额
                    //TODO:postData中携带该次支付的用户相关信息,这将便于商家拿到openid,以便后续提供更好的售后服务,譬如:微信公众好通知用户付款成功。如果不提供服务则可以删除此代码
                    var openid = sPara["openid"];


                    return(Content("SUCCESS"));
                }
                return(Content("FAIL"));
            }
            else
            {
                return(Content("FAIL"));
            }
        }
Пример #3
0
        /// <summary>
        /// 公共API => 支付结果通用通知
        /// http://pay.weixin.qq.com/wiki/doc/api/index.php?chapter=9_7
        /// 微信支付回调,不需要证书
        ///
        /// 应用场景
        /// 支付完成后,微信会把相关支付结果和用户信息发送给商户,商户需要接收处理,并返回应答。
        /// 对后台通知交互时,如果微信收到商户的应答不是成功或超时,微信认为通知失败,微信会通过一定的策略(如30分钟共8次)定期重新发起通知,尽可能提高通知的成功率,但微信不保证通知最终能成功。
        /// 由于存在重新发送后台通知的情况,因此同样的通知可能会多次发送给商户系统。商户系统必须能够正确处理重复的通知。
        /// 推荐的做法是,当收到通知进行处理时,首先检查对应业务数据的状态,判断该通知是否已经处理过,如果没有处理过再进行处理,如果处理过直接返回结果成功。在对业务数据进行状态检查和处理之前,要采用数据锁进行并发控制,以避免函数重入造成的数据混乱。
        /// 技术人员可登进微信商户后台扫描加入接口报警群。
        /// </summary>
        /// <returns></returns>
        // [HttpPost]
        public string Notify()
        {
            WeiXinConfig wxconfig = BMAConfig.WeiXinConfig;
            var          form     = Request.QueryString;
            var          sPara    = GetRequestPost(form);

            if (sPara.Count <= 0)
            {
                //throw new ArgumentNullException();
                //Content("进来了");
                return("进来了");
            }
            BMALog.Instance.Write("111:" + form.ToString());
            if (sPara["return_code"] == "SUCCESS" && sPara["return_code"] == "SUCCESS")
            {
                var  sign_type = sPara["sign_type"];
                var  sign      = sPara["sign"];
                var  signValue = WxPayAPI.Sign(sPara, wxconfig.PartnerKey);
                bool isVerify  = sign == signValue;
                if (isVerify)
                {
                    var out_trade_no = sPara["out_trade_no"];

                    //TODO 商户处理订单逻辑: 1.注意交易单不要重复处理;2.注意判断返回金额
                    var cash_fee = BrnMall.Core.Common.Utils.StrToInt(sPara["cash_fee"]);
                    //取得type
                    int      strtype = 1;
                    string[] arrtype = out_trade_no.Split('_');
                    try
                    {
                        strtype = BrnMall.Core.Common.Utils.StrToInt(arrtype[1]);
                    }
                    catch
                    {
                        BMALog.Instance.Write("获取Type出错,订单号:" + out_trade_no + " 订单金额:" + cash_fee);
                    }
                    //TODO:postData中携带该次支付的用户相关信息,这将便于商家拿到openid,以便后续提供更好的售后服务,譬如:微信公众好通知用户付款成功。如果不提供服务则可以删除此代码
                    var openid = sPara["openid"];

                    try
                    {
                        BrnMall.Core.BLL.SpHelp.SP_CheckPayOrder(out_trade_no, openid, cash_fee, strtype, 1);
                    }
                    catch (Exception ex)
                    {
                        BMALog.Instance.Write(ex.ToString());
                    }
                    //return Content("success");
                    return("success");
                }
                //return Content("fail");
                return("fail");
            }
            else
            {
                // return Content("fail");
                return("fail");
            }
        }
        public void Product(string openid, string total_fee)
        {
            ViewBag.PayOpenId = openid;
            if (string.IsNullOrEmpty(openid) || string.IsNullOrEmpty(total_fee))
            {
                Response.Write("<span style='color:#FF0000;font-size:20px'>" + "页面传参出错,请返回重试" + "</span>");
            }

            //JSAPI支付预处理
            try
            {
                var stringADict = new Dictionary <string, string>();
                stringADict.Add("appid", WeixinConfig.AppID);
                stringADict.Add("mch_id", WeixinConfig.mch_id);
                stringADict.Add("device_info", WeixinConfig.DeviceInfo);
                stringADict.Add("nonce_str", CommonHelper.CreateNonceStr());
                stringADict.Add("body", "统一下单test");
                stringADict.Add("attach", "test");
                stringADict.Add("out_trade_no", CommonHelper.CreateOutTradeNo());
                stringADict.Add("fee_type", "CNY");
                stringADict.Add("total_fee", total_fee);
                stringADict.Add("spbill_create_ip", "8.8.8.8");
                stringADict.Add("time_start", DateTime.Now.ToString("yyyyMMddHHmmss"));
                stringADict.Add("time_expire", DateTime.Now.AddMinutes(10).ToString("yyyyMMddHHmmss"));
                stringADict.Add("goods_tag", "jjj");
                stringADict.Add("notify_url", "");
                stringADict.Add("trade_type", "JSAPI");
                stringADict.Add("product_id", "");
                //stringADict.Add("limit_pay", limit_pay);
                stringADict.Add("openid", openid);
                var _sign     = WxPayAPI.Sign(stringADict, WeixinConfig.PartnerKey);//生成签名字符串
                var _postdata = CommonHelper.GeneralPostdata(stringADict, _sign);
                ViewBag.WxJsApiParam = _postdata;

                dynamic _result = WxPayAPI.UnifiedOrder(WeixinConfig.AppID, WeixinConfig.mch_id, WeixinConfig.DeviceInfo,
                                                        CommonHelper.CreateNonceStr(), "统一下单test", "", "test",
                                                        CommonHelper.CreateOutTradeNo(), "CNY", Convert.ToInt32(total_fee), "8.8.8.8",
                                                        DateTime.Now.ToString("yyyyMMddHHmmss"), DateTime.Now.AddMinutes(10).ToString("yyyyMMddHHmmss"),
                                                        "jjj", "", "JSAPI", "", "no_credit", openid, WeixinConfig.PartnerKey);


                //在页面上显示订单信息
                Response.Write("<span style='color:#00CD00;font-size:20px'>订单详情:</span><br/>");
                if (_result.return_code.ToString().IndexOf("SUCCESS") >= 0)
                {
                    Response.Write("<textarea rows='3' cols='2' style='color:#00CD00;font-size:20px;width:98%;' >" + _result.ToString() + "</textarea>");
                }
                else
                {
                    Response.Write("<textarea rows='3' cols='2' style='color:#00CD00;font-size:20px;width:98%;' >" + _result.return_msg + "</textarea>");
                }
            }
            catch (Exception ex)
            {
                Response.Write("<span style='color:#FF0000;font-size:20px'>" + "下单失败,请返回重试" + "</span>");
            }
        }
Пример #5
0
        public JsonResult Index()
        {
            var          form     = Request.Form;
            var          sPara    = GetRequestPost(form);
            WeiXinConfig wxconfig = BMAConfig.WeiXinConfig;

            if (sPara.Count <= 0)
            {
                throw new ArgumentNullException();
            }
            //LogWriter.Default.WriteInfo(form.ToString());//记录请求关键信息到日志中去
            Logs.Write(form.ToString());
            var out_trade_no     = BrnMall.Core.Common.Utils.GenerateOutTradeNo(); //Guid.NewGuid().ToString();
            var domain           = wxconfig.Domain;
            var body             = sPara["body"];
            var detail           = sPara["detail"];
            var attach           = sPara["attach"];
            var fee_type         = "CNY";
            var total_fee        = int.Parse(sPara["total_fee"]) * 100;
            var trade_type       = sPara["trade_type"];
            var spbill_create_ip = (trade_type == "APP" || trade_type == "NATIVE") ? Request.UserHostName : wxconfig.Spbill_create_ip;
            var time_start       = DateTime.Now.ToString("yyyyMMddHHmmss");
            var time_expire      = DateTime.Now.AddHours(1).ToString("yyyyMMddHHmmss"); //默认1个小时订单过期,开发者可自定义其他超时机制,原则上微信订单超时时间不超过2小时
            var goods_tag        = sPara["goods_tag"];
            var notify_url       = string.Format("{0}/mobile/WXPay/Notify", domain);    //与下面的Notify对应,开发者可自定义其他url地址
            var product_id       = sPara["product_id"];
            var openid           = sPara["openid"];
            var partnerKey       = wxconfig.PartnerKey;
            var content          = WxPayAPI.UnifiedOrder(
                wxconfig.AppID, wxconfig.Mch_id, wxconfig.Device_info, Util.CreateNonce_str(),
                body, detail, attach, out_trade_no, fee_type, total_fee, spbill_create_ip, time_start, time_expire,
                goods_tag, notify_url, trade_type, product_id, openid, partnerKey);

            if (content.return_code.Value == "SUCCESS" && content.result_code.Value == "SUCCESS")
            {
                var result = new
                {
                    prepay_id   = content.prepay_id.Value,
                    trade_type  = content.trade_type.Value,
                    sign        = content.sign.Value,
                    nonce_str   = content.nonce_str.Value,
                    return_code = content.result_code.Value,
                    return_msg  = "",
                };
                return(Json(result));
            }
            else
            {
                var result = new
                {
                    return_code = content.return_code.Value,
                    return_msg  = content.return_msg.Value,
                };
                return(Json(result));
            }
        }
Пример #6
0
        public JsonResult Index()
        {
            var form  = Request.Form;
            var sPara = GetRequestPost(form);

            if (sPara.Count <= 0)
            {
                throw new ArgumentNullException();
            }
            Common.LogHelper.LogError(form.ToString());//记录请求关键信息到日志中去
            var out_trade_no     = Guid.NewGuid().ToString();
            var domain           = System.Configuration.ConfigurationManager.AppSettings["Domain"];
            var body             = sPara["body"];
            var detail           = sPara["detail"];
            var attach           = sPara["attach"];
            var fee_type         = "CNY";
            var total_fee        = int.Parse(sPara["total_fee"]);
            var trade_type       = sPara["trade_type"];
            var spbill_create_ip = (trade_type == "APP" || trade_type == "NATIVE") ? Request.UserHostName : WeixinConfig.spbill_create_ip;
            var time_start       = DateTime.Now.ToString("yyyyMMddHHmmss");
            var time_expire      = DateTime.Now.AddHours(1).ToString("yyyyMMddHHmmss"); //默认1个小时订单过期,开发者可自定义其他超时机制,原则上微信订单超时时间不超过2小时
            var goods_tag        = sPara["goods_tag"];
            var notify_url       = string.Format("{0}/WXPay/Notify", domain);           //与下面的Notify对应,开发者可自定义其他url地址
            var product_id       = sPara["product_id"];
            var openid           = sPara["openid"];
            var partnerKey       = WeixinConfig.PartnerKey;
            var content          = WxPayAPI.UnifiedOrder(
                WeixinConfig.AppID, WeixinConfig.mch_id, WeixinConfig.device_info, Util.CreateNonce_str(),
                body, detail, attach, out_trade_no, fee_type, total_fee, spbill_create_ip, time_start, time_expire,
                goods_tag, notify_url, trade_type, product_id, openid, partnerKey);

            if (content.return_code.Value == "SUCCESS" && content.result_code.Value == "SUCCESS")
            {
                var result = new
                {
                    prepay_id   = content.prepay_id.Value,
                    trade_type  = content.trade_type.Value,
                    sign        = content.sign.Value,
                    nonce_str   = content.nonce_str.Value,
                    return_code = content.result_code.Value,
                    return_msg  = "",
                };
                return(Json(result));
            }
            else
            {
                var result = new
                {
                    return_code = content.return_code.Value,
                    return_msg  = content.return_msg.Value,
                };
                return(Json(result));
            }
        }
        public void OrderQuery(string transactionId, string outTradeNo)
        {
            dynamic _result = WxPayAPI.OrderQuery(WeixinConfig.AppID, WeixinConfig.mch_id, transactionId, outTradeNo, CommonHelper.CreateNonceStr(), WeixinConfig.PartnerKey);

            if (_result.return_code.ToString().IndexOf("SUCCESS") >= 0)
            {
                Response.Write("<textarea rows='3' cols='2' style='color:#00CD00;font-size:20px;width:98%;' >" + _result.ToString() + "</textarea>");
            }
            else
            {
                Response.Write("<textarea rows='3' cols='2' style='color:#00CD00;font-size:20px;width:98%;' >" + _result.return_msg + "</textarea>");
            }
        }
        public void RefundOrder(string transactionId, string outTradeNo, string totalFee, string refundFee)
        {
            dynamic _result = WxPayAPI.RefundOrder(WeixinConfig.AppID, WeixinConfig.mch_id, WeixinConfig.DeviceInfo, CommonHelper.CreateNonceStr(),
                                                   transactionId, outTradeNo, CommonHelper.CreateOutTradeNo(), Convert.ToInt32(totalFee), Convert.ToInt32(refundFee), "CNY", WeixinConfig.mch_id, "REFUND_SOURCE_RECHARGE_FUNDS", WeixinConfig.PartnerKey);

            if (_result.return_code.ToString().IndexOf("SUCCESS") >= 0)
            {
                Response.Write("<textarea rows='3' cols='2' style='color:#00CD00;font-size:20px;width:98%;' >" + _result.ToString() + "</textarea>");
            }
            else
            {
                Response.Write("<textarea rows='3' cols='2' style='color:#00CD00;font-size:20px;width:98%;' >" + _result.return_msg + "</textarea>");
            }
        }
        public void DownloadBill(string billDate, string billType)
        {
            dynamic _result = WxPayAPI.Downloadbill(WeixinConfig.AppID, WeixinConfig.mch_id, WeixinConfig.DeviceInfo, CommonHelper.CreateNonceStr(),
                                                    billDate, billType, "GZIP", WeixinConfig.PartnerKey);

            if (_result.return_code.ToString().IndexOf("SUCCESS") >= 0)
            {
                //订单写入数据库
                Response.Write("<textarea rows='3' cols='2' style='color:#00CD00;font-size:20px;width:98%;' >" + _result.ToString() + "</textarea>");
            }
            else
            {
                Response.Write("<textarea rows='3' cols='2' style='color:#00CD00;font-size:20px;width:98%;' >" + _result.return_msg + "</textarea>");
            }
        }
        public ActionResult NativePay(string productId)
        {
            string _model1 = WxBizPayAPI.Mode1(WeixinConfig.AppID, WeixinConfig.mch_id,
                                               CommonHelper.CreateTimestamp().ToString(),
                                               CommonHelper.CreateNonceStr(), productId, WeixinConfig.PartnerKey);

            //统一下单二维码生成
            dynamic _result = WxPayAPI.UnifiedOrder(
                WeixinConfig.AppID, WeixinConfig.mch_id, WeixinConfig.DeviceInfo, CommonHelper.CreateNonceStr(),
                "贡献一分钱", "", "", CommonHelper.CreateOutTradeNo(), "CNY", 1, "8.8.8.8", DateTime.Now.ToString("yyyyMMddHHmmss"), DateTime.Now.AddMinutes(10).ToString("yyyyMMddHHmmss"),
                "jjj", "", "NATIVE", productId, "no_credit", "", WeixinConfig.PartnerKey);
            dynamic _model2 = WxBizPayAPI.Mode2(_result.code_url);

            ViewBag.Model1 = _model1;
            try
            {
                ViewBag.Model2 = _model2;
            }
            catch { }
            return(View());
        }
Пример #11
0
        /// <summary>
        /// 公共API => 支付结果通用通知
        /// http://pay.weixin.qq.com/wiki/doc/api/index.php?chapter=9_7
        /// 微信支付回调,不需要证书
        ///
        /// 应用场景
        /// 支付完成后,微信会把相关支付结果和用户信息发送给商户,商户需要接收处理,并返回应答。
        /// 对后台通知交互时,如果微信收到商户的应答不是成功或超时,微信认为通知失败,微信会通过一定的策略(如30分钟共8次)定期重新发起通知,尽可能提高通知的成功率,但微信不保证通知最终能成功。
        /// 由于存在重新发送后台通知的情况,因此同样的通知可能会多次发送给商户系统。商户系统必须能够正确处理重复的通知。
        /// 推荐的做法是,当收到通知进行处理时,首先检查对应业务数据的状态,判断该通知是否已经处理过,如果没有处理过再进行处理,如果处理过直接返回结果成功。在对业务数据进行状态检查和处理之前,要采用数据锁进行并发控制,以避免函数重入造成的数据混乱。
        /// 技术人员可登进微信商户后台扫描加入接口报警群。
        /// </summary>
        /// <returns></returns>
        // [HttpPost]
        //public string Notify()
        //{
        //    WeiXinConfig wxconfig = BMAConfig.WeiXinConfig;
        //    //var form = Request.QueryString;
        //    //var sPara = GetRequestPost(form);
        //    var requestContent = "";
        //    using (StreamReader sr = new StreamReader(Request.InputStream))
        //    {
        //        requestContent = sr.ReadToEnd();
        //    }
        //    BMALog.Instance.Write(requestContent);//记录请求关键信息到日志中去
        //    //bool isVerify = false;
        //    var sPara = GetRequestPostByXml(requestContent);
        //    BMALog.Instance.Write("有进来过");
        //    if (sPara.Count <= 0)
        //    {
        //        //throw new ArgumentNullException();
        //        //Content("进来了");
        //        return "进来了";
        //    }
        //    BMALog.Instance.Write("111:" + requestContent);
        //    if (sPara["return_code"] == "SUCCESS" && sPara["return_code"] == "SUCCESS")
        //    {
        //        var sign_type = sPara["sign_type"];
        //        var sign = sPara["sign"];
        //        var signValue = WxPayAPI.Sign(sPara, wxconfig.PartnerKey);
        //        bool isVerify = sign == signValue;
        //        BMALog.Instance.Write("isVerify:" + isVerify + " 返回签名:" + sign + " 本地签名:" + signValue);
        //        //if (isVerify)
        //        //{
        //            var out_trade_no = sPara["out_trade_no"];

        //            //TODO 商户处理订单逻辑: 1.注意交易单不要重复处理;2.注意判断返回金额
        //            var cash_fee = BrnMall.Core.Common.Utils.StrToInt(sPara["cash_fee"]);
        //            //取得type
        //            int strtype = 1;
        //            string[] arrtype = out_trade_no.Split('_');
        //            try
        //            {
        //                strtype = BrnMall.Core.Common.Utils.StrToInt(arrtype[1]);
        //            }
        //            catch
        //            {
        //                BMALog.Instance.Write("获取Type出错,订单号:" + out_trade_no + " 订单金额:" + cash_fee);
        //            }
        //            //TODO:postData中携带该次支付的用户相关信息,这将便于商家拿到openid,以便后续提供更好的售后服务,譬如:微信公众好通知用户付款成功。如果不提供服务则可以删除此代码
        //            var openid = sPara["openid"];

        //            try
        //            {
        //                BrnMall.Core.BLL.SpHelp.SP_CheckPayOrder(out_trade_no, openid, cash_fee, strtype, 1);
        //            }
        //            catch (Exception ex)
        //            {
        //                BMALog.Instance.Write(ex.ToString());
        //            }
        //            //return Content("success");
        //            return "success";
        //       // }
        //        //return Content("fail");
        //        return "fail";
        //    }
        //    else
        //    {
        //        // return Content("fail");
        //        return "fail";
        //    }
        //}

        /// <summary>
        /// 微信退款完成后的回调
        /// </summary>
        /// <returns></returns>
        public ActionResult Refund()
        {
            WeiXinConfig wxconfig       = BMAConfig.WeiXinConfig;
            var          requestContent = "";

            using (StreamReader sr = new StreamReader(Request.InputStream))
            {
                requestContent = sr.ReadToEnd();
            }
            Logs.Write(requestContent);
            // LogWriter.Default.WriteInfo(requestContent);//记录请求关键信息到日志中去
            bool isVerify = false;
            var  sPara    = GetRequestPostByXml(requestContent);

            if (sPara.Count <= 0)
            {
                throw new ArgumentNullException();
            }
            var sign    = sPara["sign"];
            var retcode = sPara["retcode"];

            if (retcode != "0")
            {
                isVerify = false;
            }
            else
            {
                var signValue = WxPayAPI.Sign(sPara, wxconfig.PartnerKey);
                isVerify = sign == signValue;
            }
            if (!isVerify)
            {
                return(Content("fail"));
            }
            //TODO:商户处理订单逻辑

            return(Content("success"));
        }
Пример #12
0
        public ActionResult Notify()
        {
            var doc   = XDocument.Load(Request.InputStream);
            var sPara = doc.Root.Descendants().ToDictionary(x => x.Name.LocalName, x => x.Value);

            if (sPara.Count <= 0)
            {
                throw new ArgumentNullException();
            }

            LogWriter.Default.WriteError("Notify Parameters:" + sPara.ToString());//记录请求关键信息到日志中去

            if (sPara["return_code"] == "SUCCESS" && sPara["result_code"] == "SUCCESS")
            {
                var  sign      = sPara["sign"];
                var  signValue = WxPayAPI.Sign(sPara, WeixinConfig.PartnerKey);
                bool isVerify  = sign == signValue;
                LogWriter.Default.WriteError("Verify:" + isVerify + "|sign/signValue:" + sign + "," + signValue);
                if (isVerify)
                {
                    string out_trade_no   = sPara["out_trade_no"];         //商户订单ID: 1.注意交易单不要重复处理;2.注意判断返回金额
                    string transaction_id = sPara["transaction_id"];       //微信支付订单号
                    string time_end       = sPara["time_end"];             //支付完成时间
                    int    total_fee      = int.Parse(sPara["total_fee"]); //总金额
                    string bank_type      = sPara["bank_type"];            //付款银行

                    //****************************************************************************************
                    //TODO 商户处理订单逻辑: 1.注意交易单不要重复处理;2.注意判断返回金额


                    //TODO:postData中携带该次支付的用户相关信息,这将便于商家拿到openid,以便后续提供更好的售后服务,譬如:微信公众好通知用户付款成功。如果不提供服务则可以删除此代码
                    var openid = sPara["openid"];
                    LogWriter.Default.WriteError("Notify Success, out_trade_no:" + out_trade_no + ",transaction_id" + transaction_id + ",time_end:" + time_end + ",total_fee:" + total_fee + ",bank_type:" + bank_type + ",openid:" + openid);
                    return(Content(string.Format("<xml><return_code><![CDATA[{0}]]></return_code><return_msg><![CDATA[{1}]]></return_msg></xml>", "SUCCESS", "OK")));
                }
            }
            return(Content(string.Format("<xml><return_code><![CDATA[{0}]]></return_code></xml>", "FAIL")));
        }
        public ActionResult JsApiPay(string openid, string total_fee)
        {
            ViewBag.PayOpenId = openid;
            ViewBag.TotleFee  = total_fee;

            if (string.IsNullOrEmpty(openid) || string.IsNullOrEmpty(total_fee))
            {
                Response.Write("<span style='color:#FF0000;font-size:20px'>" + "页面传参出错,请返回重试" + "</span>");
            }

            dynamic _result = WxPayAPI.UnifiedOrder(WeixinConfig.AppID, WeixinConfig.mch_id, WeixinConfig.DeviceInfo,
                                                    CommonHelper.CreateNonceStr(), "统一下单test", "", "test",
                                                    CommonHelper.CreateOutTradeNo(), "CNY", Convert.ToInt32(total_fee), "8.8.8.8",
                                                    DateTime.Now.ToString("yyyyMMddHHmmss"), DateTime.Now.AddMinutes(10).ToString("yyyyMMddHHmmss"),
                                                    "jjj", "", "JSAPI", "", "no_credit", openid, WeixinConfig.PartnerKey);

            if (_result.return_code.ToString().IndexOf("SUCCESS") >= 0)
            {
                var stringADict = new Dictionary <string, string>();
                stringADict.Add("appid", WeixinConfig.AppID);
                stringADict.Add("timeStamp", CommonHelper.CreateTimestamp().ToString());
                stringADict.Add("nonceStr", CommonHelper.CreateNonceStr());
                stringADict.Add("package", "prepay_id=" + _result.prepay_id);
                stringADict.Add("signType", "MD5");
                stringADict.Add("openid", openid);
                var _sign = WxPayAPI.Sign(stringADict, WeixinConfig.PartnerKey);//生成签名字符串
                stringADict.Add("paySign", _sign);

                ViewBag.WxJsApiParam = stringADict;
                Response.Write("<textarea rows='3' cols='2' style='color:#00CD00;font-size:20px;width:98%;' >" + stringADict + "</textarea>");
            }
            else
            {
                Response.Write("<textarea rows='3' cols='2' style='color:#00CD00;font-size:20px;width:98%;' >" + _result.return_msg + "</textarea>");
            }
            return(View());
        }
Пример #14
0
        public ActionResult OrderPay()
        {
            //订单id列表
            string oidList = WebHelper.GetQueryString("oidList");

            string           paySystemName   = "";
            decimal          allSurplusMoney = 0M;
            List <OrderInfo> orderList       = new List <OrderInfo>();

            foreach (string oid in StringHelper.SplitString(oidList))
            {
                //订单信息
                OrderInfo orderInfo = Orders.GetOrderByOid(TypeHelper.StringToInt(oid));
                if (orderInfo != null && orderInfo.Uid == WorkContext.Uid && orderInfo.OrderState == (int)OrderState.WaitPaying && orderInfo.PayMode == 1 && (paySystemName.Length == 0 || paySystemName == orderInfo.PaySystemName))
                {
                    orderList.Add(orderInfo);
                }
                else
                {
                    return(Redirect(Url.Action("index", "home")));
                }

                paySystemName    = orderInfo.PaySystemName;
                allSurplusMoney += orderInfo.SurplusMoney;
            }

            if (orderList.Count < 1 || allSurplusMoney == 0M)
            {
                return(Redirect(Url.Action("index", "home")));
            }
            WeiXinConfig wxconfig  = BMAConfig.WeiXinConfig;
            var          appId     = wxconfig.AppID; //WeixinConfig.AppID;
            var          nonceStr  = Util.CreateNonce_str();
            var          timestamp = DateTime.Now.Ticks.ToString().Substring(0, 10);
            var          domain    = wxconfig.Domain;
            var          url       = Request.Url.ToString().Replace("#", "");// domain + Request.Url.PathAndQuery;

            var jsTickect   = WeiXinHelp.IsExistjsapi_ticket();
            var string1     = "";
            var signature   = WeiXinHelp.GetjsSDK_Signature(nonceStr, jsTickect, timestamp, url); //JSAPI.GetSignature(jsTickect, nonceStr, timestamp, url, out string1);
            var userAgent   = Request.UserAgent;
            var userVersion = userAgent.Substring(userAgent.LastIndexOf("/") + 1);

            //WeiXinConfig wxconfig = BMAConfig.WeiXinConfig;
            //Logs.Write(form.ToString());
            var out_trade_no = orderList[0].OSN; //Guid.NewGuid().ToString();
            //var domain = wxconfig.Domain;
            var body             = "购买创梦星火商城商品";
            var detail           = "购买创梦星火商城商品";
            var attach           = "购买创梦星火商城商品";
            var fee_type         = "CNY";
            var total_fee        = Decimal.ToInt32(orderList[0].SurplusMoney) * 100;// *100;
            var trade_type       = "JSAPI";
            var spbill_create_ip = (trade_type == "APP" || trade_type == "NATIVE") ? Request.UserHostName : wxconfig.Spbill_create_ip;
            var time_start       = DateTime.Now.ToString("yyyyMMddHHmmss");
            var time_expire      = DateTime.Now.AddDays(7).ToString("yyyyMMddHHmmss"); //默认1个小时订单过期,开发者可自定义其他超时机制,原则上微信订单超时时间不超过2小时
            var goods_tag        = "商品";
            var notify_url       = wxconfig.NOTIFY_URL;                                //与下面的Notify对应,开发者可自定义其他url地址
            var product_id       = orderList[0].Oid.ToString();
            var openid           = WorkContext.Openid;
            var partnerKey       = wxconfig.PartnerKey;
            var content          = WxPayAPI.UnifiedOrder(
                wxconfig.AppID, wxconfig.Mch_id, wxconfig.Device_info, Util.CreateNonce_str(),
                body, detail, attach, out_trade_no, fee_type, total_fee, spbill_create_ip, time_start, time_expire,
                goods_tag, notify_url, trade_type, product_id, openid, partnerKey);
            var prepay_id = "";
            //var trade_type = "";
            var paySign = "";
            //var timestamp = "";
            var nonce_str   = "";
            var return_code = "";

            if (content.return_code.Value == "SUCCESS" && content.result_code.Value == "SUCCESS")
            {
                WxPayAPIHelp.WxPayData jsApiParam = new WxPayAPIHelp.WxPayData();
                string payTimeSamp = DateTime.Now.Ticks.ToString().Substring(0, 10);
                jsApiParam.SetValue("appId", wxconfig.AppID);
                jsApiParam.SetValue("timeStamp", payTimeSamp);
                jsApiParam.SetValue("nonceStr", content.nonce_str.Value);
                jsApiParam.SetValue("package", "prepay_id=" + content.prepay_id.Value);
                jsApiParam.SetValue("signType", "MD5");
                //prepay_id = content.prepay_id.Value;
                prepay_id  = content.prepay_id.Value;
                trade_type = content.trade_type.Value;
                paySign    = jsApiParam.MakeSign();

                timestamp   = payTimeSamp;
                nonce_str   = content.nonce_str.Value;
                return_code = content.result_code.Value;
            }
            else
            {
                return(PromptView("错误编号:" + content.return_code.Value + "错误信息:" + content.return_msg.Value));
            }
            OrderPayModel model = new OrderPayModel();

            model.OidList         = oidList;
            model.AllSurplusMoney = allSurplusMoney;
            model.OrderList       = orderList;
            model.PayPlugin       = Plugins.GetPayPluginBySystemName(paySystemName);
            model.nonceStr        = nonceStr;
            model.jsapiTicket     = jsTickect;
            model.nonce_str       = nonce_str;
            model.paySign         = paySign;
            model.signature       = signature;
            model.timestamp       = timestamp;
            model.userAgent       = userAgent;
            model.userVersion     = userVersion;
            model.appId           = appId;
            model.prepay_id       = prepay_id;
            return(View(model));

            //return PromptView("出错了!");
        }
Пример #15
0
        public JsonResult WxPay()
        //public HttpResponseMessage WxPay()
        {
            if (WebHelper.IsGet())
            {
                var result = new
                {
                    return_code = "erro",
                    return_msg  = "请求错误",
                };
                return(Json(result));
                //return new HttpResponseMessage { Content = new StringContent(result.ToString(), System.Text.Encoding.UTF8, "application/json") };
            }
            else
            {
                var          form     = Request.Form;
                var          sPara    = GetRequestPost(form);
                WeiXinConfig wxconfig = BMAConfig.WeiXinConfig;
                if (sPara.Count <= 0)
                {
                    throw new ArgumentNullException();
                }
                //LogWriter.Default.WriteInfo(form.ToString());//记录请求关键信息到日志中去
                BMALog.Instance.Write(form.ToString());
                var out_trade_no     = BrnMall.Core.Common.Utils.GenerateOutTradeNo() + "_" + sPara["paytype"]; //Guid.NewGuid().ToString();
                var domain           = wxconfig.Domain;
                var body             = sPara["body"];
                var detail           = sPara["detail"];
                var attach           = sPara["attach"];
                var fee_type         = "CNY";
                var total_fee        = int.Parse(sPara["total_fee"]) * 100;
                var trade_type       = sPara["trade_type"];
                var spbill_create_ip = (trade_type == "APP" || trade_type == "NATIVE") ? Request.UserHostName : wxconfig.Spbill_create_ip;
                var time_start       = DateTime.Now.ToString("yyyyMMddHHmmss");
                var time_expire      = DateTime.Now.AddHours(1).ToString("yyyyMMddHHmmss"); //默认1个小时订单过期,开发者可自定义其他超时机制,原则上微信订单超时时间不超过2小时
                var goods_tag        = sPara["goods_tag"];
                var notify_url       = wxconfig.NOTIFY_URL;                                 //string.Format("{0}/mob/WXPay/Notify", domain);//与下面的Notify对应,开发者可自定义其他url地址
                var product_id       = sPara["product_id"];
                var openid           = sPara["openid"];
                var partnerKey       = wxconfig.PartnerKey;
                var content          = WxPayAPI.UnifiedOrder(
                    wxconfig.AppID, wxconfig.Mch_id, wxconfig.Device_info, Util.CreateNonce_str(),
                    body, detail, attach, out_trade_no, fee_type, total_fee, spbill_create_ip, time_start, time_expire,
                    goods_tag, notify_url, trade_type, product_id, openid, partnerKey);
                BMALog.Instance.Write("url:" + notify_url + "|||con:" + content);
                if (content.return_code.Value == "SUCCESS" && content.result_code.Value == "SUCCESS")
                {
                    WxPayAPIHelp.WxPayData jsApiParam = new WxPayAPIHelp.WxPayData();
                    string payTimeSamp = DateTime.Now.Ticks.ToString().Substring(0, 10);
                    jsApiParam.SetValue("appId", wxconfig.AppID);
                    jsApiParam.SetValue("timeStamp", payTimeSamp);
                    jsApiParam.SetValue("nonceStr", content.nonce_str.Value);
                    jsApiParam.SetValue("package", "prepay_id=" + content.prepay_id.Value);
                    jsApiParam.SetValue("signType", "MD5");

                    var result = new
                    {
                        prepay_id   = content.prepay_id.Value,
                        trade_type  = content.trade_type.Value,
                        sign        = content.sign.Value,
                        sign1       = jsApiParam.MakeSign(),
                        timestamp   = payTimeSamp,
                        nonce_str   = content.nonce_str.Value,
                        return_code = content.result_code.Value,
                        return_msg  = "",
                    };
                    //string result = "{\"return_code\":\"SUCCESS\",\"sc\":\"123\"}";
                    return(Json(result));
                    //return new HttpResponseMessage { Content = new StringContent(result.ToString(), System.Text.Encoding.UTF8, "application/json") };
                }
                else
                {
                    var result = new
                    {
                        return_code = content.return_code.Value,
                        return_msg  = content.return_msg.Value,
                    };
                    return(Json(result));
                    //return new HttpResponseMessage { Content = new StringContent(result.ToString(), System.Text.Encoding.UTF8, "application/json") };
                }
            }
        }
Пример #16
0
        public ActionResult Index()
        {
            try
            {
                var out_trade_no       = Guid.NewGuid().ToString("N");
                var domain             = System.Configuration.ConfigurationManager.AppSettings["Domain"];
                var body               = "商品描述";
                var detail             = "商品详情";
                var attach             = "";
                var product_id         = "1";
                var openid             = User.Identity.Name;
                var goods_tag          = "";
                var fee_type           = "CNY";
                var total_fee          = 10;
                var trade_type         = "JSAPI";
                var appId              = System.Configuration.ConfigurationManager.AppSettings["AppId"];
                var nonceStr           = Util.CreateNonce_str();
                var timestamp          = Util.CreateTimestamp();
                var success_redict_url = string.Format("{0}/WxPay/Success", domain);
                var url              = domain + Request.Url.PathAndQuery;
                var userAgent        = Request.UserAgent;
                var userVersion      = userAgent.Substring(userAgent.LastIndexOf("MicroMessenger/") + 15, 3);//微信版本号高于或者等于5.0才支持微信支付
                var spbill_create_ip = (trade_type == "APP" || trade_type == "NATIVE") ? Request.UserHostName : WeixinConfig.spbill_create_ip;
                var time_start       = DateTime.Now.ToString("yyyyMMddHHmmss");
                var time_expire      = DateTime.Now.AddHours(1).ToString("yyyyMMddHHmmss"); //默认1个小时订单过期,开发者可自定义其他超时机制,原则上微信订单超时时间不超过2小时

                var notify_url   = string.Format("{0}/WxPay/Notify", domain);               //与下面的Notify对应,开发者可自定义其他url地址
                var partnerKey   = WeixinConfig.PartnerKey;
                var mch_id       = WeixinConfig.mch_id;
                var device_info  = WeixinConfig.device_info;
                var returnXML    = "";
                var paramaterXml = "";
                var content      = WxPayAPI.UnifiedOrder(
                    appId, mch_id, device_info, nonceStr,
                    body, detail, attach, out_trade_no, fee_type, total_fee, spbill_create_ip, time_start, time_expire,
                    goods_tag, notify_url, trade_type, product_id, openid, partnerKey, out returnXML, out paramaterXml);
                LogWriter.Default.WriteError(paramaterXml);
                LogWriter.Default.WriteError(returnXML);
                var prepay_id             = "";
                var sign                  = "";
                var return_code           = "";
                var return_msg            = "";
                var err_code              = "";
                var err_code_des          = "";
                var isUnifiedOrderSuccess = false;
                if (content.return_code.Value == "SUCCESS" && content.result_code.Value == "SUCCESS")
                {
                    prepay_id             = content.prepay_id.Value;
                    sign                  = WxPayAPI.SignPay(appId, timestamp.ToString(), nonceStr, prepay_id, partnerKey);
                    trade_type            = content.trade_type.Value;
                    isUnifiedOrderSuccess = true;
                }
                else
                {
                    return_code           = content.return_code.Value;
                    return_msg            = content.return_msg.Value;
                    isUnifiedOrderSuccess = false;
                }
                if (!isUnifiedOrderSuccess)
                {
                    return(RedirectToAction("Failed", new { msg = "(代码:101)服务器下单失败,请重试" }));
                }
                var model = new JSPayModel
                {
                    appId              = appId,
                    nonceStr           = nonceStr,
                    timestamp          = timestamp,
                    userAgent          = userAgent,
                    userVersion        = userVersion,
                    attach             = "",
                    body               = body,
                    detail             = detail,
                    openid             = openid,
                    product_id         = out_trade_no,
                    goods_tag          = goods_tag,
                    price              = total_fee,
                    total_fee          = total_fee,
                    prepay_id          = prepay_id,
                    trade_type         = trade_type,
                    sign               = sign,
                    return_code        = return_code,
                    return_msg         = return_msg,
                    err_code           = err_code,
                    err_code_des       = err_code_des,
                    success_redict_url = success_redict_url
                };
                return(View(model));
            }
            catch (Exception ex)
            {
                LogWriter.Default.WriteError(ex.Message);
                return(RedirectToAction("Failed", new { msg = "(代码:200)" + ex.Message }));
            }
        }
Пример #17
0
        protected void Page_Load(object sender, EventArgs e)
        {
            StringBuilder sb = new StringBuilder();

            StreamReader reader  = new StreamReader(Request.InputStream);
            String       xmlData = reader.ReadToEnd();
            var          sPara   = GetRequestPostByXml(xmlData);

            if (sPara.Count <= 0)
            {
                throw new ArgumentNullException();
            }

            if (sPara["return_code"] == "SUCCESS" && sPara["result_code"] == "SUCCESS")
            {
                var sign = sPara["sign"];

                Dictionary <string, string> sPara2 = new Dictionary <string, string>();
                foreach (var item in sPara)
                {
                    if (item.Key != "sign")
                    {
                        sPara2.Add(item.Key, item.Value);
                    }
                }

                var  signValue = WxPayAPI.Sign(sPara2, WxConfig.PartnerKey);
                bool isVerify  = sign == signValue;
                if (isVerify)
                {
                    var out_trade_no   = sPara["out_trade_no"];
                    var transaction_id = sPara["transaction_id"];
                    var total_fee      = sPara["total_fee"];

                    decimal pay_money = decimal.Parse(total_fee) / 100;
                    Logger.Info(string.Format("用户订单,微信公众号支付通知,订单号{0},支付单号{1},支付金额{2}", out_trade_no, transaction_id, pay_money));

                    UserInfoManager      uim           = new UserInfoManager();
                    UserFinancialManager ufm           = new UserFinancialManager();
                    DataTable            userfinancial = ufm.GetUserFinancialInfoByPayId(out_trade_no);
                    if (userfinancial != null && userfinancial.Rows.Count == 1)
                    {
                        Hashtable hashufdb = DataTableHelper.DataRowToHashTable(userfinancial.Rows[0]);
                        Hashtable hashuf   = new Hashtable();
                        hashuf["ID"]       = SiteHelper.GetHashTableValueByKey(hashufdb, "ID");
                        hashuf["OrderNum"] = SiteHelper.GetHashTableValueByKey(hashufdb, "OrderNum");
                        hashuf["UserID"]   = SiteHelper.GetHashTableValueByKey(hashufdb, "UserID");
                        hashuf["State"]    = UserFinancialState.Effect.GetHashCode();
                        hashuf["TradeNo"]  = transaction_id;
                        hashuf["TotalFee"] = pay_money;
                        hashuf["PayWay"]   = UserFinancialOperatorWay.WeixinPubPay;
                        decimal changesAmount = 0.00m;
                        decimal.TryParse(SiteHelper.GetHashTableValueByKey(hashufdb, "ChangesAmount"), out changesAmount);
                        bool isSuccess = false;
                        if (Math.Abs(changesAmount) == pay_money)
                        {
                            isSuccess = uim.OrderPayCallback(hashuf);
                        }
                        if (isSuccess)
                        {
                            sb.Append("<xml>");
                            sb.Append("<return_code>SUCCESS</return_code>");
                            sb.Append("<return_msg></return_msg>");
                            sb.Append("</xml>");
                        }
                        else
                        {
                            sb.Append("<xml>");
                            sb.Append("<return_code>FAIL</return_code>");
                            sb.Append("<return_msg>error</return_msg>");
                            sb.Append("</xml>");
                        }
                    }
                }
            }
            else
            {
                sb.Append("<xml>");
                sb.Append("<return_code>FAIL</return_code>");
                sb.Append("<return_msg>error</return_msg>");
                sb.Append("</xml>");
            }

            Response.Write(sb);
        }
Пример #18
0
        public ActionResult Notify()
        {
            var doc   = XDocument.Load(Request.InputStream);
            var sPara = doc.Root.Descendants().ToDictionary(x => x.Name.LocalName, x => x.Value);

            if (sPara.Count <= 0)
            {
                throw new ArgumentNullException();
            }

            LogWriter.Default.WriteError("Notify Parameters:" + sPara.ToString());//记录请求关键信息到日志中去

            if (sPara["return_code"] == "SUCCESS" && sPara["result_code"] == "SUCCESS")
            {
                var  sign      = sPara["sign"];
                var  signValue = WxPayAPI.Sign(sPara, WeixinConfig.PartnerKey);
                bool isVerify  = sign == signValue;
                LogWriter.Default.WriteError("Verify:" + isVerify + "|sign/signValue:" + sign + "," + signValue);
                if (isVerify)
                {
                    string out_trade_no   = sPara["out_trade_no"];         //商户订单ID: 1.注意交易单不要重复处理;2.注意判断返回金额
                    string transaction_id = sPara["transaction_id"];       //微信支付订单号
                    string time_end       = sPara["time_end"];             //支付完成时间
                    int    total_fee      = int.Parse(sPara["total_fee"]); //总金额
                    string bank_type      = sPara["bank_type"];            //付款银行

                    var openid = sPara["openid"];

                    //****************************************************************************************
                    //TODO 商户处理订单逻辑: 1.注意交易单不要重复处理;2.注意判断返回金额
                    T_Order order = null;
                    using (IT_Order repository = new T_OrderRepository())
                    {
                        order = repository.FindFirstOrDefault(o => o.OrderNo == out_trade_no);
                    }

                    if (order != null)
                    {
                        order.PayStatus = 1;
                        T_Shop shop = null;
                        using (IT_Shop repository = new T_ShopRepository())
                        {
                            shop = repository.FindFirstOrDefault(o => o.ID == order.ShopID);
                        }
                        if (shop != null)
                        {
                            string cardNo = string.Empty;
                            var    code   = new Random().Next(1000, 9999).ToString();
                            if (shop.LockType != 1)
                            {
                                WK.Tea.Lock.ApiRequest.CreateCardRequest postEntity = new WK.Tea.Lock.ApiRequest.CreateCardRequest
                                {
                                    communityNo = "1316882760",
                                    roomNo      = shop.RoomNo,
                                    floorNo     = shop.FloorNo,
                                    buildNo     = shop.BuildNo,
                                    startTime   = order.BTime.AddMinutes(-15).ToString("yyMMddHHmm"),
                                    endTime     = order.ETime.AddMinutes(10).ToString("yyMMddHHmm"),
                                    mobile      = string.IsNullOrWhiteSpace(order.Mobile) ? WK.Tea.Lock.ApiRequest.LockApiHelper.Mobile : order.Mobile
                                };
                                WK.Tea.Lock.ApiRequest.CreateCardResponse result =
                                    WK.Tea.Lock.ApiRequest.LockApiHelper.WebApi.Post <WK.Tea.Lock.ApiRequest.CreateCardRequest, WK.Tea.Lock.ApiRequest.CreateCardResponse>("https://api.uclbrt.com/?c=Qrcode&a=getLink", postEntity);

                                cardNo = result.cardNo;
                            }
                            else
                            {
                                var startTime = order.BTime.AddMinutes(-15).ToString("yyMMddHHmm");
                                var endTime   = order.ETime.AddMinutes(10).ToString("yyMMddHHmm");

                                WebApiHelper.CreateInstance().AddLockKey(code, shop.LockID, startTime, endTime);
                            }

                            order.CardNo = cardNo;
                            order.LockPW = code;

                            using (IT_Order repository = new T_OrderRepository())
                            {
                                repository.Update(order);
                            }

                            //TODO:postData中携带该次支付的用户相关信息,这将便于商家拿到openid,以便后续提供更好的售后服务,譬如:微信公众好通知用户付款成功。如果不提供服务则可以删除此代码
                            string url = "http://dc.orangenet.com.cn/Door/Qrcode?orderId=" + order.ID;
                            WeixinTempMsg.SendOrderPaySuccessMsg(openid, url, shop.ShopAddress, order.BTime, order.ETime, order.FeeCode.Value, order.OrderNo);
                            WeixinTempMsg.SendManagerOrderMsg(url, shop.ShopAddress, order.BTime, order.ETime, order.FeeCode.Value, order.OrderNo);
                            WeixinTempMsg.SendSMS(shop.ShopAddress, order.Mobile, shop.ShopPhoneNum, order.BTime, order.ETime, url);
                            //WeixinTempMsg.SendCleanMsg(shop.ShopAddress, order.OrderNo, order.BTime, order.ETime);
                        }
                        else
                        {
                            LogWriter.Default.WriteError("Shop Error, out_trade_no:" + out_trade_no + ", shop is null");
                        }
                    }
                    else
                    {
                        LogWriter.Default.WriteError("Order Error, out_trade_no:" + out_trade_no + ", order is null");
                    }


                    LogWriter.Default.WriteError("Notify Success, out_trade_no:" + out_trade_no + ",transaction_id" + transaction_id + ",time_end:" + time_end + ",total_fee:" + total_fee + ",bank_type:" + bank_type + ",openid:" + openid);
                    return(Content(string.Format("<xml><return_code><![CDATA[{0}]]></return_code><return_msg><![CDATA[{1}]]></return_msg></xml>", "SUCCESS", "OK")));
                }
            }
            return(Content(string.Format("<xml><return_code><![CDATA[{0}]]></return_code></xml>", "FAIL")));
        }
Пример #19
0
    public int RefreshTradeState(DateTime startOrderDate, DateTime endOrderDate)
    {
        List <ProductOrder> poList;
        WeChatPayData       queryOrderPayData;
        int handledRows = 0;

        try
        {
            //获取数据库中指定时间范围的订单
            poList = ProductOrder.FindAllOrders(startOrderDate, endOrderDate);

            for (int i = 0; i < poList.Count; i++)
            {
                try
                {
                    //针对数据库中每个订单查询微信支付状态
                    queryOrderPayData = WxPayAPI.OrderQueryByOutTradeNo(poList[i].OrderID);

                    if (queryOrderPayData != null)
                    {
                        Log.Info(this.GetType().ToString(), "向微信查询订单实际支付状态:" + queryOrderPayData.ToXml());

                        //校验微信支付返回的OpenID与原订单OpenID是否相符
                        if (queryOrderPayData.IsSet("openid"))
                        {
                            if (poList[i].Purchaser.OpenID != queryOrderPayData.GetValue("openid").ToString())
                            {
                                throw new Exception(string.Format("微信支付返回的OpenID:{0}与原订单OpenID:{1}不符", queryOrderPayData.GetValue("openid").ToString(), poList[i].Purchaser.OpenID));
                            }
                        }
                        else
                        {
                            throw new Exception("微信支付没有返回OpenID");
                        }

                        //校验微信支付返回的总金额与原订单金额是否相符
                        if (queryOrderPayData.IsSet("total_fee"))
                        {
                            decimal totalFee;
                            if (decimal.TryParse(queryOrderPayData.GetValue("total_fee").ToString(), out totalFee))
                            {
                                totalFee = totalFee / 100;
                                if (poList[i].OrderPrice != totalFee)
                                {
                                    throw new Exception(string.Format("微信支付返回的订单总金额{0}元与原订单金额{1}元不符", totalFee, poList[i].OrderPrice));
                                }
                            }
                            else
                            {
                                throw new Exception("微信支付返回的订单总金额格式转换错误total_fee");
                            }
                        }
                        else
                        {
                            throw new Exception("微信支付没有返回订单总金额total_fee");
                        }

                        //获取返回的微信支付状态
                        if (queryOrderPayData.IsSet("trade_state"))
                        {
                            //根据查询返回的trade_state设置数据库中用户订单的微信支付实际状态
                            switch (queryOrderPayData.GetValue("trade_state").ToString().ToUpper())
                            {
                            case "SUCCESS":     //支付成功
                                poList[i].TradeState = TradeState.SUCCESS;
                                break;

                            case "REFUND":      //转入退款
                                poList[i].TradeState = TradeState.REFUND;
                                break;

                            case "NOTPAY":      //未支付状态,就没有交易时间time_end
                                poList[i].TradeState = TradeState.NOTPAY;
                                break;

                            case "CLOSED":      //已关闭
                                poList[i].TradeState = TradeState.CLOSED;
                                break;

                            case "REVOKED":     //已撤销(刷卡支付)
                                poList[i].TradeState = TradeState.REVOKED;
                                break;

                            case "USERPAYING":      //用户支付中
                                poList[i].TradeState = TradeState.USERPAYING;
                                break;

                            case "PAYERROR":        //支付失败(其他原因,如银行返回失败)
                                poList[i].TradeState = TradeState.PAYERROR;
                                break;

                            default:        //未知状态,默认为未支付
                                poList[i].TradeState = TradeState.NOTPAY;
                                break;
                            }
                        }
                        else
                        {
                            throw new Exception("微信支付没有返回支付状态trade_state");
                        }

                        //获取微信支付交易流水号、交易时间、交易描述
                        poList[i].TransactionID   = queryOrderPayData.IsSet("transaction_id") ? queryOrderPayData.GetValue("transaction_id").ToString() : string.Empty;
                        poList[i].TransactionTime = queryOrderPayData.IsSet("time_end") ? (DateTime?)DateTime.ParseExact(queryOrderPayData.GetValue("time_end").ToString(), "yyyyMMddHHmmss", System.Globalization.CultureInfo.InvariantCulture) : null;
                        poList[i].TradeStateDesc  = queryOrderPayData.IsSet("trade_state_desc") ? queryOrderPayData.GetValue("trade_state_desc").ToString() : string.Empty;

                        //更新订单支付状态
                        ProductOrder.UpdateTradeState(poList[i]);
                    }
                }
                catch (Exception ex)
                {
                    //对每个订单的异常只记录,不退出循环
                    Log.Error(this.GetType().ToString(), "RefreshTradeState : " + ex.Message);
                }

                handledRows++;
            }
        }
        catch (Exception ex)
        {
            Log.Error(this.GetType().ToString(), "RefreshTradeState : " + ex.Message);
        }

        return(handledRows);
    }