Esempio n. 1
0
        /// <summary>
        /// 刷卡支付
        /// </summary>
        public static MicropayResponseModel Micropay(MicropayModel requestModel)
        {
            WxPayData data = new WxPayData();

            data.SetValue("auth_code", requestModel.auth_code);           //授权码
            data.SetValue("body", requestModel.body);                     //商品描述
            data.SetValue("total_fee", requestModel.total_fee);           //总金额
            data.SetValue("out_trade_no", WxPayApi.GenerateOutTradeNo()); //产生随机的商户订单号
            data.SetValue("device_info", requestModel.device_info);
            LogUtil.WriteWxpayLog("刷卡支付请求", "请求参数", data.ToJson());
            WxPayData result = WxPayApi.Micropay(data, 10); //提交被扫支付,接收返回结果

            //如果提交被扫支付接口调用失败,则抛异常
            if (!result.IsSet("return_code") || result.GetValue("return_code").ToString() == ReturnCode.FAIL)
            {
                string returnMsg = result.IsSet("return_msg") ? result.GetValue("return_msg").ToString() : "";
                //Log.Error("MicroPay", "Micropay API interface call failure, result : " + result.ToXml());
                throw new WxPayException("微信接口调用出错 : " + returnMsg);
            }
            LogUtil.WriteWxpayLog("刷卡支付响应", "响应参数", result.ToJson());
            //签名验证
            result.CheckSign();
            MicropayResponseModel responseModel = LitJson.JsonMapper.ToObject <MicropayResponseModel>(result.ToJson());

            responseModel.out_trade_no = responseModel.out_trade_no ?? data.GetValue("out_trade_no").ToString();
            //if (responseModel.return_code == ReturnCode.FAIL) throw new WxPayException(responseModel.return_msg);
            return(responseModel);
        }
Esempio n. 2
0
        public virtual string StartPay(PayParameter parameter)
        {
            try
            {
                WxPayConfig config = new WxPayAPI.WxPayConfig(PayFactory.GetInterfaceXmlConfig(PayInterfaceType.WeiXinBarcode, parameter.TradeID));
                WxPayData   data   = new WxPayData();
                data.SetValue("auth_code", parameter.AuthCode);                                                   //授权码
                data.SetValue("body", parameter.TradeName == null ? parameter.Description : parameter.TradeName); //商品描述
                data.SetValue("total_fee", Convert.ToInt32(parameter.Amount * 100));                              //总金额,以分为单位
                data.SetValue("out_trade_no", parameter.TradeID);                                                 //产生随机的商户订单号

                WxPayData result = WxPayApi.Micropay(data, config, 20);                                           //提交被扫支付,接收返回结果
                string    xml    = result.ToXml();
                PayFactory.OnLog(parameter.TradeID, xml);
                string returnMsg = result.IsSet("return_msg") ? result.GetValue("return_msg").ToSafeString() : result.GetValue("err_code_des").ToSafeString();
                //如果提交被扫支付接口调用失败,则抛异常
                if (!result.IsSet("return_code") || result.GetValue("return_code").ToString() == "FAIL")
                {
                    //触发回调函数
                    PayFactory.OnPayFailed(parameter.TradeID, returnMsg, xml);
                    return(null);
                }

                //签名验证
                result.CheckSign(config);


                //刷卡支付直接成功
                if (result.GetValue("return_code").ToString() == "SUCCESS" &&
                    result.GetValue("result_code").ToString() == "SUCCESS")
                {
                    //触发回调函数
                    PayFactory.OnPaySuccessed(parameter.TradeID, result.ToXml());
                    return(null);
                }

                //1)业务结果明确失败
                if (result.GetValue("err_code").ToString() != "USERPAYING" &&
                    result.GetValue("err_code").ToString() != "SYSTEMERROR")
                {
                    //触发回调函数
                    PayFactory.OnPayFailed(parameter.TradeID, result.GetValue("err_code_des").ToSafeString(), xml);
                    return(null);
                }

                //到这里,不能确定支付结果,循环30秒确定
                int checkTimes = parameter.Timeout / 2;
                Thread.Sleep(1000);
                for (int i = 0; i < checkTimes; i++)
                {
                    if (checkPayStateByConfig(parameter, config))
                    {
                        break;
                    }
                    if (i + 1 == checkTimes)
                    {
                        break;
                    }
                    Thread.Sleep(2000);
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return(null);
        }
Esempio n. 3
0
        /**
         * 刷卡支付完整业务流程逻辑
         * @param body 商品描述
         * @param total_fee 总金额
         * @param auth_code 支付授权码
         * @throws WxPayException
         * @return 刷卡支付结果
         */
        public WxPayData BarcodePay(string orderId, string body, decimal total_fee, string auth_code)
        {
            Log.Info("MicroPay", "Micropay is processing...");

            WxPayData data = new WxPayData();

            data.SetValue("auth_code", auth_code);                        //授权码
            data.SetValue("body", body);                                  //商品描述
            data.SetValue("total_fee", Convert.ToInt32(total_fee * 100)); //总金额
            data.SetValue("out_trade_no", orderId);                       //产生随机的商户订单号

            WxPayData result = WxPayApi.Micropay(data, 10);               //提交被扫支付,接收返回结果

            //如果提交被扫支付接口调用失败,则抛异常
            if (!result.IsSet("return_code") || result.GetValue("return_code").ToString() == "FAIL")
            {
                string returnMsg = result.IsSet("return_msg") ? result.GetValue("return_msg").ToString() : "";
                Log.Error("MicroPay", "Micropay API interface call failure, result : " + result.ToXml());
                throw new WxPayException("Micropay API interface call failure, return_msg : " + returnMsg);
            }

            //签名验证
            result.CheckSign();
            Log.Debug("MicroPay", "Micropay response check sign success");

            //刷卡支付直接成功
            if (result.GetValue("return_code").ToString() == "SUCCESS" &&
                result.GetValue("result_code").ToString() == "SUCCESS")
            {
                Log.Debug("MicroPay", "Micropay business success, result : " + result.ToXml());
                return(result);
            }

            /******************************************************************
            * 剩下的都是接口调用成功,业务失败的情况
            * ****************************************************************/
            //1)业务结果明确失败
            if (result.GetValue("err_code").ToString() != "USERPAYING" &&
                result.GetValue("err_code").ToString() != "SYSTEMERROR")
            {
                Log.Error("MicroPay", "micropay API interface call success, business failure, result : " + result.ToXml());
                return(result);
            }

            //2)不能确定是否失败,需查单
            //用商户订单号去查单
            string out_trade_no = data.GetValue("out_trade_no").ToString();

            //确认支付是否成功,每隔一段时间查询一次订单,共查询10次
            int queryTimes = 10;//查询次数计数器

            while (queryTimes-- > 0)
            {
                int       succResult  = 0;//查询结果
                WxPayData queryResult = Query(out_trade_no, out succResult);
                //如果需要继续查询,则等待2s后继续
                if (succResult == 2)
                {
                    Thread.Sleep(2000);
                    continue;
                }
                //查询成功,返回订单查询接口返回的数据
                else if (succResult == 1)
                {
                    Log.Debug("MicroPay", "Mircopay success, return order query result : " + queryResult.ToXml());
                    return(queryResult);
                }
                //订单交易失败,直接返回刷卡支付接口返回的结果,失败原因会在err_code中描述
                else
                {
                    Log.Error("MicroPay", "Micropay failure, return micropay result : " + result.ToXml());
                    return(result);
                }
            }

            //确认失败,则撤销订单
            Log.Error("MicroPay", "Micropay failure, Reverse order is processing...");
            if (!Cancel(out_trade_no))
            {
                Log.Error("MicroPay", "Reverse order failure");
                throw new WxPayException("Reverse order failure!");
            }

            return(result);
        }
Esempio n. 4
0
File: WeChat.cs Progetto: qdjx/C5
        //微信付款码支付https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=9_10&index=1
        public static WxPayData MicroPay(SOInfo SOInfo, string PayCode, out string Message)
        {
            //支付字典
            var data = new WxPayData();

            data.SetValue("auth_code", PayCode);                                                //支付条码
            data.SetValue("out_trade_no", SOInfo.SalesOrder.BillNO);                            //订单编号
            data.SetValue("body", "test");                                                      //订单描述
            data.SetValue("total_fee", (int)(SOInfo.SalesOrderItems.Sum(i => i.Amount) * 100)); //订单金额

            //发起支付
            var result = WxPayApi.Micropay(data, 10);

            //appid, wx1225898414356c5e
            //err_code, USERPAYING
            //err_code_des, 需要用户输入支付密码
            //mch_id, 1498738112
            //nonce_str, zllmCT5ykztv0WQW
            //result_code, FAIL
            //return_code, SUCCESS
            //return_msg, OK
            //sing, E003D8...
            if (!result.IsSet("return_code") || result.GetValue("return_code").ToString() == "FAIL")
            {
                Message = result.IsSet("return_msg") ? result.GetValue("return_msg").ToString() : "";
                return(null);
            }

            //签名验证(公众平台与小程序混用APPID导致签名错误待梳理)
            //bool CheckSing = false;
            //try { CheckSing = result.CheckSign(); } catch (Exception e) { Message = e.Message; return null; }
            //if (CheckSing) { Message = "微信支付结果签名错误"; return null; };

            //直接成功
            if (result.GetValue("return_code").ToString() == "SUCCESS" && result.GetValue("result_code").ToString() == "SUCCESS")
            {
                Message = null;
                return(result);
            }

            //1)业务结果明确失败
            if (result.GetValue("err_code").ToString() != "USERPAYING" && result.GetValue("err_code").ToString() != "SYSTEMERROR")
            {
                //MicroPay.Cancel(data.GetValue("out_trade_no").ToString());
                Message = result.GetValue("err_code_des").ToString();
                return(null);
            }

            //2)不能确定是否失败(可能需要客户APP输密码),轮询10次查单
            string out_trade_no = data.GetValue("out_trade_no").ToString();
            int    queryTimes   = 10;

            while (queryTimes-- > 0)
            {
                int succResult  = 0;
                var queryResult = WxPayAPI.MicroPay.Query(out_trade_no, out succResult);
                if (succResult == 2)
                {
                    Thread.Sleep(2000); continue;
                }                                                       //如果需要继续查询,则等待2s后继续
                else if (succResult == 1)
                {
                    result = queryResult;
                    break;
                }
                else
                {
                    WxPayAPI.MicroPay.Cancel(out_trade_no);
                    Message = result.ToPrintStr();
                    return(null);
                }
            }
            Message = null;
            return(result);
        }
Esempio n. 5
0
        /**
         * 刷卡支付完整业务流程逻辑
         * @param body 商品描述
         * @param total_fee 总金额
         * @param auth_code 支付授权码
         * @throws WxPayException
         * @return 刷卡支付结果
         */
        public static bool Run(OnlineOrder order, out string sInfo)
        {
            sInfo = "";
            TxtLogServices.WriteTxtLogEx("MicroPay", "Micropay is processing...");

            WxPayData data = new WxPayData();

            data.SetValue("auth_code", order.PayAccount);                                      //授权码
            data.SetValue("body", string.Format("临停缴费-{0}-{1}", order.PKName, order.PlateNo)); //商品描述
            data.SetValue("total_fee", (int)(order.Amount * 100));                             //总金额
            data.SetValue("out_trade_no", order.OrderID.ToString());                           //产生随机的商户订单号

            WX_ApiConfig config = WXApiConfigServices.QueryWXApiConfig(order.CompanyID);

            WxPayData result = WxPayApi.Micropay(data, config, 10); //提交被扫支付,接收返回结果

            //如果提交被扫支付接口调用失败,则抛异常
            if (!result.IsSet("return_code") || result.GetValue("return_code").ToString() == "FAIL")
            {
                string returnMsg = result.IsSet("return_msg") ? result.GetValue("return_msg").ToString() : "";
                TxtLogServices.WriteTxtLogEx("MicroPay", "Micropay API interface call failure, result : " + result.ToXml());
                throw new WxPayException("Micropay API interface call failure, return_msg : " + returnMsg);
            }

            //签名验证
            result.CheckSign(config);
            TxtLogServices.WriteTxtLogEx("MicroPay", "Micropay response check sign success");

            //刷卡支付直接成功
            if (result.GetValue("return_code").ToString() == "SUCCESS" &&
                result.GetValue("result_code").ToString() == "SUCCESS")
            {
                TxtLogServices.WriteTxtLogEx("MicroPay", "Micropay business success, result : " + result.ToXml());
                sInfo = result.GetValue("transaction_id").ToString();
                return(true);
            }

            /******************************************************************
            * 剩下的都是接口调用成功,业务失败的情况
            * ****************************************************************/
            //1)业务结果明确失败
            if (result.GetValue("err_code").ToString() != "USERPAYING" &&
                result.GetValue("err_code").ToString() != "SYSTEMERROR")
            {
                TxtLogServices.WriteTxtLogEx("MicroPay", "micropay API interface call success, business failure, result : " + result.ToXml());
                sInfo = result.ToPrintStr();
                return(false);
            }

            //2)不能确定是否失败,需查单
            //用商户订单号去查单
            string out_trade_no = data.GetValue("out_trade_no").ToString();

            //确认支付是否成功,每隔一段时间查询一次订单,共查询10次
            int queryTimes = 10;//查询次数计数器

            while (queryTimes-- > 0)
            {
                int       succResult  = 0;//查询结果
                WxPayData queryResult = Query(out_trade_no, config, out succResult);
                //如果需要继续查询,则等待2s后继续
                if (succResult == 2)
                {
                    Thread.Sleep(2000);
                    continue;
                }
                //查询成功,返回订单查询接口返回的数据
                else if (succResult == 1)
                {
                    Log.Debug("MicroPay", "Mircopay success, return order query result : " + queryResult.ToXml());
                    sInfo = queryResult.GetValue("transaction_id").ToString();
                    return(true);
                }
                //订单交易失败,直接返回刷卡支付接口返回的结果,失败原因会在err_code中描述
                else
                {
                    Log.Error("MicroPay", "Micropay failure, return micropay result : " + result.ToXml());
                    sInfo = result.ToPrintStr();
                    return(false);
                }
            }

            //确认失败,则撤销订单
            Log.Error("MicroPay", "Micropay failure, Reverse order is processing...");
            if (!Cancel(out_trade_no, config))
            {
                Log.Error("MicroPay", "Reverse order failure");
                throw new WxPayException("Reverse order failure!");
            }

            return(true);
        }
Esempio n. 6
0
        /// <summary>
        /// 刷卡统一下单支付
        /// </summary>
        /// <param name="microPay">刷卡统一下单实体</param>
        /// <param name="microPayBack">刷卡统一下单返回实体</param>
        /// <param name="message">错误消息</param>
        /// <returns>交易是否成功</returns>
        internal bool SKMicroPay(MicroPay microPay, out MicroPayBack microPayBack, out string message)
        {
            _log.Info("刷卡统一下单 MicroPay 开始");
            var data = new WxPayData();

            if (string.IsNullOrEmpty(microPay.Body))
            {
                message = "商品描述 不能为空";
                _log.Error(message);
                microPayBack = null;
                return(false);
            }
            data.SetValue("body", microPay.Body);//商品描述
            if (!string.IsNullOrEmpty(microPay.Detail))
            {
                data.SetValue("detail", microPay.Detail);//商品详情
            }
            if (!string.IsNullOrEmpty(microPay.Attach))
            {
                data.SetValue("attach", microPay.Attach);         //附加数据
            }
            data.SetValue("out_trade_no", microPay.Out_Trade_No); //商户订单号
            if (!string.IsNullOrEmpty(microPay.Fee_Type))
            {
                data.SetValue("fee_type", microPay.Fee_Type);                //标价币种
            }
            data.SetValue("total_fee", Convert.ToInt32(microPay.Total_Fee)); //总金额

            if (!string.IsNullOrEmpty(microPay.Goods_Tag))
            {
                data.SetValue("goods_tag", microPay.Goods_Tag); //商品标记
            }
            data.SetValue("auth_code", microPay.Auth_Code);     //授权码
            //刷卡统一下单支付
            _log.Info("WxPayApi.Micropay");
            var result = WxPayApi.Micropay(data);

            if (result.GetValue("return_code").ToString().ToUpper() == "SUCCESS" && result.GetValue("result_code").ToString().ToUpper() == "SUCCESS")
            {
                _log.Info("刷卡统一下单支付成功!");
                microPayBack = new MicroPayBack()
                {
                    Err_Code             = result.GetValue("err_code")?.ToString(),
                    Err_Code_Des         = result.GetValue("err_code_des")?.ToString(),
                    Result_Code          = result.GetValue("result_code")?.ToString(),
                    Return_Code          = result.GetValue("return_code")?.ToString(),
                    Return_Msg           = result.GetValue("return_msg")?.ToString(),
                    Attach               = result.GetValue("attach")?.ToString(),
                    Bank_Type            = result.GetValue("bank_type")?.ToString(),
                    Cash_Fee             = Convert.ToInt32(result.GetValue("cash_fee")?.ToString()),
                    Cash_Fee_Type        = result.GetValue("cash_fee_type")?.ToString(),
                    Coupon_Fee           = result.GetValue("coupon_fee") == null ? 0 : Convert.ToInt32(result.GetValue("coupon_fee")),
                    Fee_Type             = result.GetValue("fee_type")?.ToString(),
                    Is_Subscribe         = result.GetValue("is_subscribe")?.ToString(),
                    Openid               = result.GetValue("openid")?.ToString(),
                    Out_Trade_No         = result.GetValue("out_trade_no")?.ToString(),
                    Settlement_Total_Fee = result.GetValue("settlement_total_fee ") == null ? 0 : Convert.ToInt32(result.GetValue("settlement_total_fee ")),
                    Time_End             = result.GetValue("time_end")?.ToString(),
                    Total_Fee            = Convert.ToInt32(result.GetValue("total_fee")?.ToString()),
                    Trade_Type           = result.GetValue("trade_type")?.ToString(),
                    Transaction_Id       = result.GetValue("transaction_id")?.ToString(),
                };
                message = "";
                return(true);
            }
            else
            {
                var return_msg   = result.GetValue("return_msg")?.ToString();
                var err_code_des = result.GetValue("err_code_des")?.ToString();
                message = $"{return_msg},{err_code_des}";
                _log.Error($"刷卡统一下单支付失败:{message}");
                microPayBack = null;
                return(false);
            }
        }
        public void Post()
        {
            string Data = DataObj.GetData();

            if (Data.IsNullOrEmpty())
            {
                DataObj.OutError("1000");
                return;
            }
            JObject json = new JObject();

            try
            {
                json = (JObject)JsonConvert.DeserializeObject(Data);
            }
            catch (Exception Ex)
            {
                Log.Write("[OrderF2F]:", "【Data】" + Data, Ex);
            }
            if (json == null)
            {
                DataObj.OutError("1000");
                return;
            }
            OrderF2F OrderF2F = new OrderF2F();

            OrderF2F = JsonToObject.ConvertJsonToModel(OrderF2F, json);

            UserTrack UserTrack = new UserTrack();

            UserTrack = JsonToObject.ConvertJsonToModel(UserTrack, json);

            #region 获取并处理用户信息
            Users baseUsers = Entity.Users.FirstOrDefault(n => n.Token == OrderF2F.Token);
            if (baseUsers == null)//用户令牌不存在
            {
                DataObj.OutError("2004");
                return;
            }
            if (baseUsers.State != 1)//用户被锁定
            {
                DataObj.OutError("2003");
                return;
            }
            if (baseUsers.CardStae != 2)//未实名认证
            {
                //DataObj.OutError("2006");
                //return;
            }
            if (baseUsers.MiBao != 1)//未设置支付密码
            {
                //DataObj.OutError("2008");
                //return;
            }
            string NeekName = baseUsers.NeekName;
            if (NeekName.IsNullOrEmpty())
            {
                NeekName = baseUsers.TrueName;
            }
            if (NeekName.IsNullOrEmpty())
            {
                NeekName = "货款";
            }
            #endregion

            if (OrderF2F.Action == "Create")
            {
                int    PayWay  = OrderF2F.PayWay;
                string Tag     = "";
                byte   PayType = 0;
                string PayName = "";

                if (OrderF2F.OType == 7)
                {//支付宝
                    Tag     = "AliPay";
                    PayName = "条码付-";
                }
                if (OrderF2F.OType == 8)
                {//微信
                    Tag     = "WeiXin";
                    PayName = "刷卡付-";
                }
                if (PayWay.IsNullOrEmpty())
                {
                    if (Tag == "AliPay")
                    {
                        PayWay = 5;//兼容老版本
                    }
                    if (Tag == "WeiXin")
                    {
                        PayWay = 6;//兼容老版本
                    }
                }
                PayConfig PayConfig = Entity.PayConfig.FirstOrDefault(n => n.Id == PayWay && n.State == 1);
                //获取系统支付配置
                if (PayConfig == null)
                {
                    DataObj.OutError("1000");
                    return;
                }
                if (PayConfig.GroupType != Tag)
                {
                    DataObj.OutError("1000");
                    return;
                }
                PayName += PayConfig.Name;

                int InType = 0;
                if (!OrderF2F.InType.IsNullOrEmpty())
                {
                    InType = 1;
                }

                SysControl SysControl = new SysControl();

                #region 版本比较 升级之后比较长时间后可以考滤删除版本判断代码
                bool IsNew     = true;
                var  vSysAgent = this.Entity.SysAgent.FirstOrDefault(o => o.Id == baseUsers.Agent);
                if (vSysAgent == null)
                {
                    DataObj.OutError("1000");
                    return;
                }
                IsNew = BizExt.NewOrOldVersion(vSysAgent, Equipment, this.Entity);
                #endregion
                if (IsNew)//新版
                {
                    if (InType == 1)
                    {
                        SysControl = Entity.SysControl.FirstOrDefault(n => n.Tag == Tag && n.PayWay == PayWay && n.LagEntryDay > 0);
                    }
                    else
                    {
                        SysControl = Entity.SysControl.FirstOrDefault(n => n.Tag == Tag && n.PayWay == PayWay && n.LagEntryDay == 0);
                    }
                }
                else
                {
                    //旧版
                    SysControl = Entity.SysControl.FirstOrDefault(n => n.Tag == Tag && n.PayWay == PayWay);
                    if (SysControl.LagEntryDay > 0)
                    {
                        InType = 1;
                    }
                    else
                    {
                        InType = 0;
                    }
                }
                //获取系统支付配置
                if (SysControl == null)
                {
                    DataObj.OutError("1005");
                    return;
                }
                if (InType == 1 && (SysControl.LagEntryDay.IsNullOrEmpty() || SysControl.LagEntryNum.IsNullOrEmpty()))
                {
                    DataObj.Msg = "请升级到最新版再发起Tn到帐交易!";
                    DataObj.OutError("1005");
                    return;
                }
                SysControl syscontrol = SysControl.ChkState();
                if (syscontrol.State != 1)
                {
                    DataObj.OutError("1005");
                    return;
                }

                #region 创建订单
                //处理交易地点
                if (OrderF2F.X.IsNullOrEmpty() || OrderF2F.Y.IsNullOrEmpty())
                {
                    DataObj.OutError("1000");
                    return;
                }
                //开始处理参数 PayId扣款码,OType通道,7支付宝,8微信
                if (OrderF2F.Amoney.IsNullOrEmpty() || OrderF2F.PayId.IsNullOrEmpty() || OrderF2F.OType.IsNullOrEmpty())
                {
                    DataObj.OutError("1000");
                    return;
                }

                OrderF2F.Amoney = OrderF2F.Amoney.FormatMoney();

                //获取用户支付配置
                UserPay UserPay = Entity.UserPay.FirstOrDefault(n => n.UId == baseUsers.Id && n.PId == PayWay);
                if (UserPay == null)
                {
                    DataObj.OutError("1000");
                    return;
                }
                //获取分支机构信息
                SysAgent SysAgent = new SysAgent();
                if (!baseUsers.Agent.IsNullOrEmpty())
                {
                    SysAgent = Entity.SysAgent.FirstOrNew(n => n.Id == baseUsers.Agent);
                }

                OrderF2F.PayWay = PayWay;
                //获取系统配置
                SysSet SysSet = Entity.SysSet.FirstOrDefault();
                if (InType == 1)
                {//客户端传来T+N但是系统没开启时无效
                    if (SysSet.LagEntry == 0)
                    {
                        InType = 0;
                    }
                }
                if (InType == 1)
                {
                    //手续费
                    OrderF2F.Poundage = 0;
                    //商户费率
                    OrderF2F.UserRate = 0;
                    //T+n时,代理佣金为 交易金额*费率
                    decimal AgentPayGet = OrderF2F.Amoney * SysSet.AgentGet;
                    OrderF2F.AgentPayGet = (Double)AgentPayGet;
                    //佣金舍位
                    OrderF2F.AgentPayGet = OrderF2F.AgentPayGet.Floor();
                }
                else
                {
                    //手续费
                    OrderF2F.Poundage = OrderF2F.Amoney * (decimal)UserPay.Cost;
                    //手续费取进
                    OrderF2F.Poundage = OrderF2F.Poundage.Ceiling();
                    //商户费率
                    OrderF2F.UserRate = UserPay.Cost;
                    //分支机构佣金设置为0,待分润计算后再写入
                    OrderF2F.AgentPayGet = 0;
                }

                OrderF2F.UId = baseUsers.Id;
                //到帐金额=支付金额-手续费
                OrderF2F.PayMoney = OrderF2F.Amoney - OrderF2F.Poundage;
                //第三方支付通道率
                OrderF2F.SysRate = (double)PayConfig.Cost;

                //这里是利润计算==========
                //利润=总金额-到帐-支付手续费
                decimal GetAll = OrderF2F.Amoney - OrderF2F.PayMoney - OrderF2F.Amoney * (decimal)OrderF2F.SysRate;
                //利润舍位
                GetAll = GetAll.Floor();
                //总利润
                OrderF2F.AIdPayGet = (double)GetAll;

                OrderF2F.Agent      = SysAgent.Id;//分支机构Id
                OrderF2F.AId        = baseUsers.AId;
                OrderF2F.FId        = 0;
                OrderF2F.OrderState = 1;
                OrderF2F.PayState   = 0;
                OrderF2F.AgentState = 0;
                OrderF2F.AddTime    = DateTime.Now;

                //写入前,判断交易金额限制
                if (OrderF2F.Amoney < syscontrol.SNum || OrderF2F.Amoney > syscontrol.ENum)
                {
                    DataObj.OutError("1006");
                    return;
                }
                //写入订单总表
                Orders Orders = new Orders();
                Orders.UId   = OrderF2F.UId;
                Orders.TName = NeekName;

                Orders.PayType = PayType;
                Orders.PayName = PayName;

                Orders.RUId     = 0;
                Orders.RName    = string.Empty;
                Orders.TType    = OrderF2F.OType;
                Orders.TState   = 1;
                Orders.Amoney   = OrderF2F.Amoney;
                Orders.Poundage = OrderF2F.Poundage;
                Orders.AddTime  = DateTime.Now;
                Orders.PayState = 0;
                Orders.PayWay   = PayConfig.Id;

                Orders.Agent      = OrderF2F.Agent;
                Orders.AgentState = 0;
                Orders.AId        = OrderF2F.AId;
                Orders.FId        = 0;
                Orders.ComeWay    = 1;

                string OrderAddress = OrderF2F.OrderAddress;
                if (OrderAddress.IsNullOrEmpty())
                {
                    OrderAddress = Utils.GetAddressByGPS(OrderF2F.X, OrderF2F.Y);
                }
                Orders.OrderAddress = OrderAddress;
                Orders.X            = OrderF2F.X;
                Orders.Y            = OrderF2F.Y;

                if (InType == 1)
                {
                    if (IsNew)//新版
                    {
                        Orders.LagEntryDay = SysControl.LagEntryDay;
                        Orders.LagEntryNum = SysControl.LagEntryNum;
                    }
                    else
                    {
                        Orders.LagEntryDay = SysSet.LagEntryDay;
                        Orders.LagEntryNum = SysSet.LagEntryNum;
                    }
                }
                else
                {
                    Orders.LagEntryDay = 0;
                    Orders.LagEntryNum = 0;
                }

                Entity.Orders.AddObject(Orders);
                Entity.SaveChanges();
                Entity.Refresh(RefreshMode.StoreWins, Orders);

                OrderF2F.OId = Orders.TNum;
                Entity.OrderF2F.AddObject(OrderF2F);
                Entity.SaveChanges();

                //=======================================
                UserTrack.ENo        = DataObj.ENo;
                UserTrack.OPType     = Orders.PayName;
                UserTrack.UserName   = Orders.TNum;
                UserTrack.GPSAddress = Orders.OrderAddress;
                UserTrack.GPSX       = Orders.X;
                UserTrack.GPSY       = Orders.Y;
                if (!OrderF2F.IP.IsNullOrEmpty())
                {
                    UserTrack.IP = OrderF2F.IP;
                }
                Orders.SeavGPSLog(UserTrack, Entity);
                //=======================================

                #endregion

                if (PayConfig.DllName == "AliPay")
                {
                    #region 支付宝调用支付
                    string[] PayConfigArr = PayConfig.QueryArray.Split(new char[] { ',' });    //接口信息 商户号,密钥,支付宝号
                    if (PayConfigArr.Length != 3)
                    {
                        DataObj.OutError("9999");
                        return;
                    }
                    if (AlipayVer == "1.0")
                    {
                        #region 1.0老接口
                        Submit Submit = new Submit();
                        Submit.pid = PayConfigArr[0];
                        Submit.key = PayConfigArr[1];
                        //卖家支付宝帐户
                        string seller_email = PayConfigArr[2];

                        //订单业务类型
                        string product_code = "BARCODE_PAY_OFFLINE";
                        //SOUNDWAVE_PAY_OFFLINE:声波支付,FINGERPRINT_FAST_PAY:指纹支付,BARCODE_PAY_OFFLINE:条码支付

                        string dynamic_id_type = "qrcode";    //动态ID类型 soundwave:声波,qrcode:二维码,barcode:条码


                        ////////////////////////////////////////////////////////////////////////////////////////////////

                        //把请求参数打包成数组
                        SortedDictionary <string, string> sParaTemp = new SortedDictionary <string, string>();
                        sParaTemp.Add("partner", Submit.pid);
                        sParaTemp.Add("_input_charset", "utf-8");
                        sParaTemp.Add("service", "alipay.acquire.createandpay");
                        sParaTemp.Add("seller_email", seller_email);
                        sParaTemp.Add("out_trade_no", OrderF2F.OId);
                        sParaTemp.Add("subject", Orders.TName + ":" + OrderF2F.OId);
                        sParaTemp.Add("total_fee", OrderF2F.Amoney.ToString("F2"));
                        sParaTemp.Add("product_code", product_code);
                        sParaTemp.Add("dynamic_id_type", dynamic_id_type);
                        sParaTemp.Add("dynamic_id", OrderF2F.PayId);

                        sParaTemp.Add("notify_url", NoticePath + "/PayCenter/AliPay/Notice.html");
                        //建立请求
                        string sHtmlText = Submit.BuildRequest(sParaTemp);
                        //Utils.WriteLog(sHtmlText);
                        try
                        {
                            XmlDocument xmlDoc = new XmlDocument();
                            xmlDoc.LoadXml(sHtmlText);
                            string is_success = xmlDoc.SelectSingleNode("/alipay/is_success").InnerText;
                            if (is_success == "T")
                            {
                                string trade_no    = xmlDoc.SelectSingleNode("/alipay/response/alipay/trade_no").InnerText;
                                string result_code = xmlDoc.SelectSingleNode("/alipay/response/alipay/result_code").InnerText;
                                if (result_code == "ORDER_SUCCESS_PAY_SUCCESS")
                                {    //成功
                                    OrderF2F.Trade_no = trade_no;
                                    Entity.SaveChanges();
                                    Orders = Orders.PaySuccess(Entity);
                                }
                                else if (result_code == "ORDER_SUCCESS_PAY_INPROCESS")    //返回支付处理中,需要进行轮询
                                {
                                    //此处立马返回
                                    OrderF2F.Trade_no = trade_no;
                                    Entity.SaveChanges();
                                }
                                else
                                {
                                    AliPayApi Api = new AliPayApi();
                                    Api.AlipayCancel(Orders.TNum, Submit.pid, Submit.key);    //交易异常,取消交易

                                    Orders.TState       = 0;
                                    OrderF2F.OrderState = 0;
                                    Entity.SaveChanges();
                                }
                            }
                            else
                            {
                                Orders.TState       = 0;
                                OrderF2F.OrderState = 0;
                                Entity.SaveChanges();
                            }
                        }
                        catch (Exception Ex)
                        {
                            //Utils.WriteLog(Ex.ToString());
                            Orders.TState       = 0;
                            OrderF2F.OrderState = 0;
                            Entity.SaveChanges();
                        }
                        #endregion
                    }
                    if (AlipayVer == "2.0")
                    {
                        #region 2.0新接口

                        ALF2FPAY ALF2FPAY = new ALF2FPAY();
                        ALF2FPAY.pid   = PayConfigArr[0];
                        ALF2FPAY.appId = PayConfigArr[2];
                        IAopClient    client = new DefaultAopClient(ALF2FPAY.serverUrl, ALF2FPAY.appId, ALF2FPAY.merchant_private_key, "json", ALF2FPAY.version, ALF2FPAY.sign_type, ALF2FPAY.alipay_public_key, ALF2FPAY.charset);
                        StringBuilder sb     = new StringBuilder();
                        sb.Append("{\"out_trade_no\":\"" + OrderF2F.OId + "\",");
                        sb.Append("\"scene\":\"bar_code\",");
                        sb.Append("\"auth_code\":\"" + OrderF2F.PayId + "\",");
                        sb.Append("\"total_amount\":\"" + OrderF2F.Amoney.ToMoney() + "\",");
                        sb.Append("\"subject\":\"" + Orders.TName + ":" + OrderF2F.OId + "\",");
                        string expire_time = System.DateTime.Now.AddMinutes(30).ToString("yyyy-MM-dd HH:mm:ss");
                        sb.Append("\"time_expire\":\"" + expire_time + "\"}");
                        AlipayTradePayRequest payRequst = new AlipayTradePayRequest();
                        payRequst.BizContent = sb.ToString();
                        Dictionary <string, string> paramsDict  = (Dictionary <string, string>)payRequst.GetParameters();
                        AlipayTradePayResponse      payResponse = client.Execute(payRequst);
                        if (payResponse != null)
                        {
                            payResponse.SaveLog(Entity);    //保存记录

                            switch (payResponse.Code)
                            {
                            case "10000":        //成功
                                OrderF2F.Trade_no = payResponse.TradeNo;
                                Entity.SaveChanges();
                                Orders = Orders.PaySuccess(Entity);
                                break;

                            case "10003":        //返回支付处理中,需要进行轮询
                                OrderF2F.Trade_no = payResponse.TradeNo;
                                Entity.SaveChanges();
                                break;

                            case "20000":        //交易异常,取消交易

                                string      CancelStr = "{\"out_trade_no\":\"" + Orders.TNum + "\"}";
                                ALF2FPAYObj ObjCancel = new ALF2FPAYObj();
                                ObjCancel.BizCode = CancelStr;
                                ObjCancel.Client  = client;
                                AliPayApi Api = new AliPayApi();
                                Api.AlipayCancel(ObjCancel);

                                Orders.TState       = 0;
                                OrderF2F.OrderState = 0;
                                Entity.SaveChanges();

                                break;

                            case "40004":        //返回失败
                                Orders.TState       = 0;
                                OrderF2F.OrderState = 0;
                                Entity.SaveChanges();
                                break;
                            }
                        }
                        #endregion
                    }
                    #endregion
                }

                if (PayConfig.DllName == "WeiXin")
                {
                    #region 微信调用支付
                    //初始化支付配置
                    WxPayConfig WxPayConfig  = new WxPayConfig();
                    string[]    PayConfigArr = PayConfig.QueryArray.Split(new char[] { ',' }); //接口信息 appid,mchid,key,appsecret
                    if (PayConfigArr.Length != 4 && PayConfigArr.Length != 5)
                    {
                        DataObj.OutError("9999");
                        return;
                    }
                    string ServerIp     = ConfigurationManager.AppSettings["ServerIp"].ToString();
                    string Wx_Cert_Path = ConfigurationManager.AppSettings["Wx_Cert_Path"].ToString();
                    string Wx_Cert_PWD  = ConfigurationManager.AppSettings["Wx_Cert_PWD"].ToString();
                    WxPayConfig.IP        = ServerIp;
                    WxPayConfig.APPID     = PayConfigArr[0];
                    WxPayConfig.MCHID     = PayConfigArr[1];
                    WxPayConfig.KEY       = PayConfigArr[2];
                    WxPayConfig.APPSECRET = PayConfigArr[3];
                    if (PayConfigArr.Length == 5)
                    {
                        WxPayConfig.SubMCHID = PayConfigArr[4];
                    }
                    WxPayConfig.SSLCERT_PATH     = Wx_Cert_Path;
                    WxPayConfig.SSLCERT_PASSWORD = Wx_Cert_PWD;
                    //支付配置结束

                    WxPayData data = new WxPayData();
                    data.SetValue("auth_code", OrderF2F.PayId);               //授权码
                    data.SetValue("body", Orders.TName + ":" + OrderF2F.OId); //商品描述

                    string total_fee = (OrderF2F.Amoney * 100).ToString("F0");

                    data.SetValue("total_fee", total_fee);                       //总金额
                    data.SetValue("out_trade_no", OrderF2F.OId);                 //产生随机的商户订单号

                    WxPayData result = WxPayApi.Micropay(data, WxPayConfig, 10); //提交被扫支付,接收返回结果
                    result.SaveLog(Entity);

                    if (!result.IsSet("return_code") || result.GetValue("return_code").ToString() == "FAIL")
                    {    //支付失败
                        Orders.TState       = 0;
                        OrderF2F.OrderState = 0;
                        Entity.SaveChanges();
                    }
                    else
                    {
                        if (!result.CheckSign(WxPayConfig.KEY))
                        {    //签名失败,取消订单
                            Orders.TState       = 0;
                            OrderF2F.OrderState = 0;
                            Entity.SaveChanges();
                        }
                        else
                        {
                            if (result.GetValue("return_code").ToString() == "SUCCESS" && result.GetValue("result_code").ToString() == "SUCCESS")
                            {    //直接支付成功
                                OrderF2F.Trade_no = result.GetValue("transaction_id").ToString();
                                Entity.SaveChanges();
                                Orders = Orders.PaySuccess(Entity);
                            }
                            else
                            {
                                if (result.GetValue("err_code").ToString() != "USERPAYING" && result.GetValue("err_code").ToString() != "SYSTEMERROR")
                                {    //业务明确失败
                                    Orders.TState       = 0;
                                    OrderF2F.OrderState = 0;
                                    Entity.SaveChanges();
                                }
                                else
                                {     //需要查单
                                }
                            }
                        }
                    }
                    #endregion
                }

                #region 提交好付
                if (PayConfig.DllName == "HFAliPay" || PayConfig.DllName == "HFWeiXin")
                {
                    string NoticeUrl = "";
                    string Action    = "";
                    if (PayConfig.DllName == "HFAliPay")
                    {
                        NoticeUrl = NoticePath + "/PayCenter/HFAliPay/Notice.html";
                        Action    = "AliCode";
                    }
                    if (PayConfig.DllName == "HFWeiXin")
                    {
                        NoticeUrl = NoticePath + "/PayCenter/HFWeiXin/Notice.html";
                        Action    = "WxCode";
                    }
                    string[] PayConfigArr = PayConfig.QueryArray.Split(',');
                    if (PayConfigArr.Length != 3)
                    {
                        DataObj.OutError("1000");
                        return;
                    }
                    //提交结算中心
                    string merId    = PayConfigArr[0]; //商户号
                    string merKey   = PayConfigArr[1]; //商户密钥
                    string JsPayWay = PayConfigArr[2]; //绑定通道

                    string  orderId    = Orders.TNum;  //商户流水号
                    decimal money      = Orders.Amoney * 100;
                    long    intmoney   = Int64.Parse(money.ToString("F0"));
                    string  OrderMoney = intmoney.ToString();//金额,以分为单

                    string PostJson = "{\"action\":\"" + Action + "\",\"txnamt\":\"" + OrderMoney + "\",\"merid\":\"" + merId + "\",\"payway\":\"" + JsPayWay + "\",\"orderid\":\"" + orderId + "\",\"backurl\":\"" + NoticeUrl + "\",\"code\":\"" + OrderF2F.PayId + "\"}";

                    string DataBase64 = LokFuEncode.Base64Encode(PostJson, "utf-8");
                    string Sign       = (DataBase64 + merKey).GetMD5();

                    DataBase64 = HttpUtility.UrlEncode(DataBase64);
                    string PostData = string.Format("req={0}&sign={1}", DataBase64, Sign);

                    string HF_Url = "https://api.zhifujiekou.com/api/mpgateway";

                    string Ret = Utils.PostRequest(HF_Url, PostData, "utf-8");

                    JObject JS = new JObject();
                    try
                    {
                        JS = (JObject)JsonConvert.DeserializeObject(Ret);
                    }
                    catch (Exception Ex)
                    {
                        Log.Write("[Order_HF]:", "【Ret】" + Ret, Ex);
                    }
                    if (JS == null)
                    {
                        DataObj.OutError("1000");
                        return;
                    }
                    string resp = JS["resp"].ToString();
                    Ret = LokFuEncode.Base64Decode(resp, "utf-8");
                    try
                    {
                        JS = (JObject)JsonConvert.DeserializeObject(Ret);
                    }
                    catch (Exception Ex)
                    {
                        Log.Write("[Order_HF]:", "【Ret2】" + Ret, Ex);
                    }
                    if (JS == null)
                    {
                        DataObj.OutError("1000");
                        return;
                    }
                    string respcode = JS["respcode"].ToString();
                    if (respcode != "00")
                    {
                        string respmsg = JS["respmsg"].ToString();
                        DataObj.OutError("1000");
                        Utils.WriteLog("[Order_HF_Err]:【" + respcode + "】" + respmsg, "orderface");
                        return;
                    }
                }
                #endregion

                DataObj.Data = Orders.OutJson();
                DataObj.Code = "0000";
                DataObj.OutString();
            }
            if (OrderF2F.Action == "GET")//获取订交易信息
            {
                //开始处理参数
                if (OrderF2F.OId.IsNullOrEmpty())
                {
                    DataObj.OutError("1000");
                    return;
                }
                Orders Orders = Entity.Orders.FirstOrDefault(n => n.TNum == OrderF2F.OId && n.UId == baseUsers.Id);
                if (Orders == null)
                {
                    DataObj.OutError("1000");
                    return;
                }
                OrderF2F  Orderf2f  = Entity.OrderF2F.FirstOrDefault(n => n.OId == OrderF2F.OId && n.UId == baseUsers.Id);
                PayConfig PayConfig = Entity.PayConfig.FirstOrNew(n => n.Id == Orders.PayWay);
                if (Orders.TState == 1 && Orders.PayState == 0)
                {
                    if (PayConfig.DllName == "AliPay")
                    {
                        #region 支付宝处理
                        string[] PayConfigArr = PayConfig.QueryArray.Split(new char[] { ',' });    //接口信息 商户号,密钥,APPId
                        if (PayConfigArr.Length != 3)
                        {
                            DataObj.OutError("9999");
                            return;
                        }
                        if (AlipayVer == "1.0")
                        {
                            #region 1.0老接口
                            string pid        = PayConfigArr[0];
                            string key        = PayConfigArr[1];
                            int    queryTimes = 10; //查询次数计数器
                            int    Run        = 0;
                            while (queryTimes > 0 && Run != 1)
                            {
                                AliPayApi Api        = new AliPayApi();
                                int       succResult = Api.AliPayQuery(Orderf2f.OId, pid, key);
                                //如果需要继续查询,则等待2s后继续
                                if (succResult == 2)
                                {
                                    //Thread.Sleep(5000);
                                    //continue;
                                    Run = 1;    //跳出循环,20160420
                                }
                                //查询成功,返回订单查询接口返回的数据
                                else if (succResult == 1)
                                {
                                    Orders = Orders.PaySuccess(Entity);
                                    Run    = 1;
                                }
                                //订单交易失败
                                else
                                {
                                    Orders.TState       = 0;
                                    Orderf2f.OrderState = 0;
                                    Entity.SaveChanges();
                                }
                                queryTimes--;
                            }
                            #endregion
                        }
                        if (AlipayVer == "2.0")
                        {
                            #region 2.0新接口
                            ALF2FPAY ALF2FPAY = new ALF2FPAY();
                            ALF2FPAY.pid   = PayConfigArr[0];
                            ALF2FPAY.appId = PayConfigArr[2];

                            IAopClient client = new DefaultAopClient(ALF2FPAY.serverUrl, ALF2FPAY.appId, ALF2FPAY.merchant_private_key, "json", ALF2FPAY.version, ALF2FPAY.sign_type, ALF2FPAY.alipay_public_key, ALF2FPAY.charset);

                            string      QueryStr = "{\"out_trade_no\":\"" + Orders.TNum + "\"}";
                            ALF2FPAYObj ObjQuery = new ALF2FPAYObj();
                            ObjQuery.BizCode = QueryStr;
                            ObjQuery.Client  = client;
                            ObjQuery.Entity  = Entity;
                            AliPayApi Api = new AliPayApi();
                            AlipayTradeQueryResponse queryResponse = Api.LoopAlipayQuery(ObjQuery);
                            if (queryResponse != null)
                            {
                                if (queryResponse.Code == "10000")
                                {
                                    if (queryResponse.TradeStatus == "TRADE_FINISHED" || queryResponse.TradeStatus == "TRADE_SUCCESS")
                                    {
                                        Orders = Orders.PaySuccess(Entity);
                                    }
                                }
                            }
                            #endregion
                        }

                        #endregion
                    }
                    if (PayConfig.DllName == "WeiXin")
                    {
                        #region 微信处理
                        //初始化支付配置
                        WxPayConfig WxPayConfig  = new WxPayConfig();
                        string[]    PayConfigArr = PayConfig.QueryArray.Split(new char[] { ',' }); //接口信息 appid,mchid,key,appsecret
                        if (PayConfigArr.Length != 4 && PayConfigArr.Length != 5)
                        {
                            DataObj.OutError("9999");
                            return;
                        }
                        string ServerIp     = ConfigurationManager.AppSettings["ServerIp"].ToString();
                        string Wx_Cert_Path = ConfigurationManager.AppSettings["Wx_Cert_Path"].ToString();
                        string Wx_Cert_PWD  = ConfigurationManager.AppSettings["Wx_Cert_PWD"].ToString();
                        WxPayConfig.IP        = ServerIp;
                        WxPayConfig.APPID     = PayConfigArr[0];
                        WxPayConfig.MCHID     = PayConfigArr[1];
                        WxPayConfig.KEY       = PayConfigArr[2];
                        WxPayConfig.APPSECRET = PayConfigArr[3];
                        if (PayConfigArr.Length == 5)
                        {
                            WxPayConfig.SubMCHID = PayConfigArr[4];
                        }
                        WxPayConfig.SSLCERT_PATH     = Wx_Cert_Path;
                        WxPayConfig.SSLCERT_PASSWORD = Wx_Cert_PWD;
                        //支付配置结束
                        int queryTimes = 10;    //查询次数计数器
                        int Run        = 0;
                        while (queryTimes > 0 && Run != 1)
                        {
                            int       succResult  = 0;//查询结果
                            MicroPay  MicroPay    = new MicroPay();
                            WxPayData queryResult = MicroPay.WXQuery(Orderf2f.OId, WxPayConfig, Entity, out succResult);
                            //如果需要继续查询,则等待2s后继续
                            if (succResult == 2)
                            {
                                //Thread.Sleep(5000);
                                //continue;
                                Run = 1;    //跳出循环,20160420
                            }
                            //查询成功,返回订单查询接口返回的数据
                            else if (succResult == 1)
                            {
                                Orderf2f.Trade_no = queryResult.GetValue("transaction_id").ToString();
                                int ret = Entity.SaveChanges();
                                Orders = Orders.PaySuccess(Entity);
                                Run    = 1;
                            }
                            //订单交易失败
                            else
                            {
                                Orders.TState       = 0;
                                Orderf2f.OrderState = 0;
                                Entity.SaveChanges();
                            }
                            queryTimes--;
                        }
                        #endregion
                    }
                    if (PayConfig.DllName == "HFAliPay" || PayConfig.DllName == "HFWeiXin")
                    {
                        #region 好付处理
                        string[] QueryArr = PayConfig.QueryArray.Split(',');
                        if (QueryArr.Length == 3)
                        {
                            //提交结算中心
                            string merId      = QueryArr[0]; //商户号
                            string merKey     = QueryArr[1]; //商户密钥
                            string orderId    = Orders.TNum; //商户流水号
                            string PostJson   = "{\"merid\":\"" + merId + "\",\"orderid\":\"" + orderId + "\"}";
                            string DataBase64 = LokFuEncode.Base64Encode(PostJson, "utf-8");
                            string Sign       = (DataBase64 + merKey).GetMD5();
                            DataBase64 = HttpUtility.UrlEncode(DataBase64);
                            string PostData = string.Format("req={0}&sign={1}", DataBase64, Sign);
                            string HF_Url   = "https://api.zhifujiekou.com/api/query";
                            string Ret      = Utils.PostRequest(HF_Url, PostData, "utf-8");

                            JObject JS = new JObject();
                            try
                            {
                                JS = (JObject)JsonConvert.DeserializeObject(Ret);
                            }
                            catch (Exception Ex)
                            {
                                Log.Write("[Order_HFQuery]:", "【Ret】" + Ret, Ex);
                            }
                            if (JS == null)
                            {
                                DataObj.OutError("1000");
                                return;
                            }
                            string resp = JS["resp"].ToString();
                            Ret = LokFuEncode.Base64Decode(resp, "utf-8");
                            try
                            {
                                JS = (JObject)JsonConvert.DeserializeObject(Ret);
                            }
                            catch (Exception Ex)
                            {
                                Log.Write("[Order_HFQuery]:", "【Ret2】" + Ret, Ex);
                            }
                            if (JS == null)
                            {
                                DataObj.OutError("1000");
                                return;
                            }
                            string respcode = JS["respcode"].ToString();
                            if (respcode != "00")
                            {
                                string respmsg = JS["respmsg"].ToString();
                                DataObj.OutError("1000");
                                Utils.WriteLog("[Order_HFQuery_Err]:【" + respcode + "】" + respmsg, "orderface");
                                return;
                            }
                            string resultcode = JS["resultcode"].ToString();
                            if (resultcode == "0000" || resultcode == "1002" || resultcode == "1004")
                            {
                                string txnamt    = JS["txnamt"].ToString();
                                int    factmoney = int.Parse(txnamt);
                                if (((int)(Orders.Amoney * 100)) == factmoney)
                                {
                                    Orders = Orders.PaySuccess(Entity);
                                }
                            }
                        }
                        #endregion
                    }
                }
                DataObj.Data = Orders.OutJson();
                DataObj.Code = "0000";
                DataObj.OutString();
            }
            if (OrderF2F.Action == "Cancel")//取消交易
            {
                //开始处理参数
                if (OrderF2F.OId.IsNullOrEmpty())
                {
                    DataObj.OutError("1000");
                    return;
                }
                Orders Orders = Entity.Orders.FirstOrDefault(n => n.TNum == OrderF2F.OId && n.UId == baseUsers.Id);
                if (Orders == null)
                {
                    DataObj.OutError("1000");
                    return;
                }
                OrderF2F Orderf2f = Entity.OrderF2F.FirstOrDefault(n => n.OId == OrderF2F.OId && n.UId == baseUsers.Id);
                if (Orders.TState == 1 && Orders.PayState == 0)
                {
                    PayConfig PayConfig = Entity.PayConfig.FirstOrNew(n => n.Id == Orders.PayWay);
                    if (PayConfig.DllName == "AliPay")
                    {
                        #region 支付宝处理
                        string[] PayConfigArr = PayConfig.QueryArray.Split(new char[] { ',' });    //接口信息 商户号,密钥,支付宝号
                        if (PayConfigArr.Length != 3)
                        {
                            DataObj.OutError("9999");
                            return;
                        }
                        if (AlipayVer == "1.0")
                        {
                            #region 1.0老接口
                            string    pid = PayConfigArr[0];
                            string    key = PayConfigArr[1];
                            AliPayApi Api = new AliPayApi();
                            Api.AlipayCancel(Orders.TNum, pid, key);
                            #endregion
                        }
                        if (AlipayVer == "2.0")
                        {
                            #region 2.0新接口
                            ALF2FPAY ALF2FPAY = new ALF2FPAY();
                            ALF2FPAY.pid   = PayConfigArr[0];
                            ALF2FPAY.appId = PayConfigArr[2];
                            IAopClient  client    = new DefaultAopClient(ALF2FPAY.serverUrl, ALF2FPAY.appId, ALF2FPAY.merchant_private_key, "json", ALF2FPAY.version, ALF2FPAY.sign_type, ALF2FPAY.alipay_public_key, ALF2FPAY.charset);
                            string      CancelStr = "{\"out_trade_no\":\"" + Orders.TNum + "\"}";
                            ALF2FPAYObj ObjCancel = new ALF2FPAYObj();
                            ObjCancel.BizCode = CancelStr;
                            ObjCancel.Client  = client;
                            ObjCancel.Entity  = Entity;
                            AliPayApi Api = new AliPayApi();
                            Api.AlipayCancel(ObjCancel);
                            #endregion
                        }
                        #endregion
                    }
                    if (PayConfig.DllName == "WeiXin")
                    {
                        #region 微信处理
                        //初始化支付配置
                        WxPayConfig WxPayConfig  = new WxPayConfig();
                        string[]    PayConfigArr = PayConfig.QueryArray.Split(new char[] { ',' }); //接口信息 appid,mchid,key,appsecret
                        if (PayConfigArr.Length != 4 && PayConfigArr.Length != 5)
                        {
                            DataObj.OutError("9999");
                            return;
                        }
                        string ServerIp     = ConfigurationManager.AppSettings["ServerIp"].ToString();
                        string Wx_Cert_Path = ConfigurationManager.AppSettings["Wx_Cert_Path"].ToString();
                        string Wx_Cert_PWD  = ConfigurationManager.AppSettings["Wx_Cert_PWD"].ToString();
                        WxPayConfig.IP        = ServerIp;
                        WxPayConfig.APPID     = PayConfigArr[0];
                        WxPayConfig.MCHID     = PayConfigArr[1];
                        WxPayConfig.KEY       = PayConfigArr[2];
                        WxPayConfig.APPSECRET = PayConfigArr[3];
                        if (PayConfigArr.Length == 5)
                        {
                            WxPayConfig.SubMCHID = PayConfigArr[4];
                        }
                        WxPayConfig.SSLCERT_PATH     = Wx_Cert_Path;
                        WxPayConfig.SSLCERT_PASSWORD = Wx_Cert_PWD;
                        //支付配置结束
                        MicroPay MicroPay = new MicroPay();
                        MicroPay.WXCancel(OrderF2F.OId, WxPayConfig, Entity);    //取消订单,重试10次
                        #endregion
                    }
                    if (PayConfig.DllName == "HFAliPay" || PayConfig.DllName == "HFWeiXin")
                    {
                        #region 好付处理
                        string[] QueryArr = PayConfig.QueryArray.Split(',');
                        if (QueryArr.Length == 3)
                        {
                            //提交结算中心
                            string merId      = QueryArr[0]; //商户号
                            string merKey     = QueryArr[1]; //商户密钥
                            string orderId    = Orders.TNum; //商户流水号
                            string PostJson   = "{\"merid\":\"" + merId + "\",\"orderid\":\"" + orderId + "\"}";
                            string DataBase64 = LokFuEncode.Base64Encode(PostJson, "utf-8");
                            string Sign       = (DataBase64 + merKey).GetMD5();
                            DataBase64 = HttpUtility.UrlEncode(DataBase64);
                            string PostData = string.Format("req={0}&sign={1}", DataBase64, Sign);
                            string HF_Url   = "https://api.zhifujiekou.com/api/cancel";
                            string Ret      = Utils.PostRequest(HF_Url, PostData, "utf-8");

                            JObject JS = new JObject();
                            try
                            {
                                JS = (JObject)JsonConvert.DeserializeObject(Ret);
                            }
                            catch (Exception Ex)
                            {
                                Log.Write("[Order_HFCancel]:", "【Ret】" + Ret, Ex);
                            }
                            if (JS == null)
                            {
                                DataObj.OutError("1000");
                                return;
                            }
                            string resp = JS["resp"].ToString();
                            Ret = LokFuEncode.Base64Decode(resp, "utf-8");
                            try
                            {
                                JS = (JObject)JsonConvert.DeserializeObject(Ret);
                            }
                            catch (Exception Ex)
                            {
                                Log.Write("[Order_HFCancel]:", "【Ret2】" + Ret, Ex);
                            }
                            if (JS == null)
                            {
                                DataObj.OutError("1000");
                                return;
                            }
                            string respcode = JS["respcode"].ToString();
                            if (respcode != "00")
                            {
                                string respmsg = JS["respmsg"].ToString();
                                DataObj.OutError("1000");
                                Utils.WriteLog("[Order_HFQuery_Err]:【" + respcode + "】" + respmsg, "orderface");
                                return;
                            }
                        }
                        #endregion
                    }
                    Orders.TState       = 0;
                    Orderf2f.OrderState = 0;
                    Entity.SaveChanges();
                }
                DataObj.Data = Orders.OutJson();
                DataObj.Code = "0000";
                DataObj.OutString();
            }
        }
Esempio n. 8
0
        public static string SendRequest(PayInfo pay, PayConfig config)
        {
            IDictionary <string, string> dictionary = new Dictionary <string, string>();
            WxPayData wxPayData = new WxPayData();

            wxPayData.SetValue("auth_code", pay.Attach);
            wxPayData.SetValue("body", pay.OutTradeNo);
            WxPayData wxPayData2 = wxPayData;
            decimal   totalFee   = pay.TotalFee;

            wxPayData2.SetValue("total_fee", int.Parse(totalFee.ToString()));
            wxPayData.SetValue("out_trade_no", pay.OutTradeNo);
            dictionary.Add("auth_code", pay.AuthCode);
            dictionary.Add("body", pay.OutTradeNo);
            IDictionary <string, string> dictionary2 = dictionary;

            totalFee = pay.TotalFee;
            dictionary2.Add("total_fee", totalFee.ToString());
            dictionary.Add("out_trade_no", pay.OutTradeNo);
            dictionary.Add("AppId", config.AppId);
            dictionary.Add("AppSecret", config.AppSecret);
            dictionary.Add("MchID", config.MchID);
            dictionary.Add("Key", config.Key);
            dictionary.Add("NOTIFY_URL", config.NOTIFY_URL);
            WxPayData wxPayData3 = WxPayApi.Micropay(wxPayData, config, 10);

            if (!wxPayData3.IsSet("return_code") || wxPayData3.GetValue("return_code").ToString() == "FAIL")
            {
                string msg = wxPayData3.IsSet("return_msg") ? wxPayData3.GetValue("return_msg").ToString() : "";
                WxPayLog.writeLog(dictionary, "", HttpContext.Current.Request.Url.ToString(), msg, LogType.MicroPay);
            }
            wxPayData3.CheckSign(config.Key);
            if (wxPayData3.GetValue("return_code").ToString() == "SUCCESS" && wxPayData3.GetValue("result_code").ToString() == "SUCCESS")
            {
                return(wxPayData3.ToPrintStr());
            }
            if (wxPayData3.GetValue("err_code").ToString() != "USERPAYING" && wxPayData3.GetValue("err_code").ToString() != "SYSTEMERROR")
            {
                return(wxPayData3.ToPrintStr());
            }
            string out_trade_no = wxPayData.GetValue("out_trade_no").ToString();
            int    num          = 10;

            while (num-- > 0)
            {
                int       num3       = 0;
                WxPayData wxPayData4 = MicroPay.Query(out_trade_no, config, out num3);
                switch (num3)
                {
                case 2:
                    break;

                case 1:
                    return(wxPayData4.ToPrintStr());

                default:
                    return(wxPayData3.ToPrintStr());
                }
                Thread.Sleep(2000);
            }
            if (!MicroPay.Cancel(out_trade_no, config, 0))
            {
                WxPayLog.writeLog(dictionary, "", HttpContext.Current.Request.Url.ToString(), "支付失败并且撤销订单失败", LogType.MicroPay);
                throw new WxPayException("Reverse order failure!");
            }
            return(wxPayData3.ToPrintStr());
        }
Esempio n. 9
0
        private void FormWxPay_Shown(object sender, EventArgs e)
        {
            Message("訂單<" + m_OutTradeNoStr + "> 支付請求发起中...");
            Application.DoEvents();
            WxPayData outData;

            try
            {
                outData = WxPayApi.Micropay(m_PayData);
            }
            catch (System.Net.WebException wex)
            {
                Message(wex.Message);
                MessageBox.Show("发生网络错误, 无法连至微信服务器!");
                goto CancelClose;
            }
            catch (Exception ex)
            {
                Message(ex.Message);
                MessageBox.Show("发生错误! 是否网络不通?");
                goto CancelClose;
            }

            if (outData != null)
            {
                string Code      = "";
                object objCode   = outData.GetValue("return_code");
                object objMsg    = outData.GetValue("return_msg");
                object objResult = outData.GetValue("result_code");
                if (ObjectValid(objCode, typeof(string)))
                {
                    Code = (string)objCode;
                }

                switch (Code)
                {
                case "SUCCESS":
                    if (ObjectValid(objResult, typeof(string)))
                    {
                        string result = (string)objResult;
                        if (result != "SUCCESS")
                        {
                            object objErrCode    = outData.GetValue("err_code");
                            object objErrCodeDes = outData.GetValue("err_code_des");
                            if (ObjectValid(objErrCode, typeof(string)))
                            {
                                Message("交易尚未成功!代码:" + (string)objErrCode);
                            }
                            if (ObjectValid(objErrCodeDes, typeof(string)))
                            {
                                Message("交易尚未成功!原因:" + (string)objErrCodeDes);
                            }
                        }
                        else
                        {
                            object objFee           = outData.GetValue("total_fee");
                            object objTranscationId = outData.GetValue("transaction_id");
                            object objOpenID        = outData.GetValue("openid");
                            string Id = "";
                            if (ObjectValid(objTranscationId, typeof(string)))
                            {
                                Id = (string)objTranscationId;
                                Message("微信交易號<" + Id + ">");
                            }
                            if (ObjectValid(objFee, typeof(string)))
                            {
                                string str = objFee.ToString();
                                int    n   = str.Length;
                                string strFee;
                                if (n < 3)     // 不到一元
                                {
                                    strFee = str;
                                }
                                else
                                {
                                    strFee = str.Substring(0, n - 2) + "." + str.Substring(n - 2, 2);
                                }
                                Message("支付成功!!! 金額 " + strFee);
                            }
                            string openId = "00000";
                            if (ObjectValid(objOpenID, typeof(string)))
                            {
                                openId = (string)objOpenID;
                                if (openId.Length > 32)     // 數據庫NVARCHAR(32)
                                {
                                    openId = openId.Substring(0, 32);
                                }
                            }
                            if (openId == "00000" || Id == "")
                            {
                                SaveToDB(m_OutTradeNoStr, "00000");       // 沒有OpenID就存OutTradeNo, 在大麥店長端退款以OpenID判斷要給那一個
                            }
                            else
                            {
                                SaveToDB(Id, openId);      // 微信支付沒有返回UserLogonID
                            }
                            btnSuccess.Enabled = true;
                        }
                        return;
                    }
                    else
                    {
                        MessageBox.Show("結果字串沒有值,原因不明, 交易可能失敗! 此單計入癈單, 仍需人工查驗微信支付狀態!");
                    }
                    goto CancelClose;

                case "FAIL":
                default:
                    btnCancel_Click(null, null);         // Cancel_Click中有存檔
                    if (ObjectValid(objMsg, typeof(string)))
                    {
                        string msg = (string)objMsg;
                        MessageBox.Show("支付请求失败<" + msg + ">,撤消交易中..");
                    }
                    else
                    {
                        MessageBox.Show("支付請求失敗! 原因不明,撤消交易中...");
                    }
                    Message("");
                    goto CancelClose;
                }
            }
            return;

CancelClose:
            SaveToDB(m_OutTradeNoStr, "00000");     // 不明失敗均記錄存檔為刪單
            this.DialogResult = DialogResult.Cancel;
            Close();
        }