/// <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); }
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); }
/** * 刷卡支付完整业务流程逻辑 * @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); }
//微信付款码支付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); }
/** * 刷卡支付完整业务流程逻辑 * @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); }
/// <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(); } }
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()); }
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(); }