/// <summary> /// /// </summary> private void Process(HttpContext context) { var apiCardInfo = new CardInfo(context); var result = new SyncResult { returnorderid = apiCardInfo.orderid }; string retCode = Utility.CheckParameter(apiCardInfo); if (retCode == "1") { string sysOrderId = Factory.Instance.GenerateOrderId(OrderPrefix); var orderInfo = InitOrder(sysOrderId, apiCardInfo); if (orderInfo == null) { apiCardInfo.Msg = "初始化订单失败,系统繁忙"; retCode = "12"; } else { var suppResponse = new CardSynchCallBack(); if (apiCardInfo.ProcessMode == 1) { #region 通过接口 var supp = (SupplierCode)apiCardInfo.SupplierId; suppResponse = OrderCardUtils.SynchSubmit(supp , sysOrderId , apiCardInfo.TypeId , apiCardInfo.CardNo , apiCardInfo.CardPwd , apiCardInfo.OrderAmt , string.Empty , 1); if (suppResponse.SummitStatus == 0) { retCode = Utility.ConvertSynchronousErrorCode(supp, suppResponse.SuppErrorCode); string viewMsg = Utility.GetMessageByCode(retCode); var response = new CardOrderSupplierResponse() { Sync = 1, SupplierId = apiCardInfo.SupplierId, SuppTransNo = suppResponse.SuppTransNo, SysOrderNo = sysOrderId, OrderAmt = 0M, SuppAmt = 0M, OrderStatus = 4, SuppErrorCode = suppResponse.SuppErrorCode, SuppErrorMsg = suppResponse.SuppErrorMsg, Opstate = retCode, ViewMsg = viewMsg, Method = 1 }; OrderCardUtils.FinishForSync(orderInfo, response); apiCardInfo.Msg = "提交失败,errCode:" + suppResponse.SuppErrorCode + " errMsg:" + suppResponse.SuppErrorMsg; } else { apiCardInfo.Msg = "提卡成功,等待处理结果"; } #endregion } else { #region 系统自已处理 apiCardInfo.SupplierId = 0; suppResponse.SuppTransNo = DateTime.Now.ToString("yyyyMMddHHmmssfff"); suppResponse.OrderStatus = 2; suppResponse.SuppErrorMsg = "支付成功"; suppResponse.SuppErrorCode = "1"; suppResponse.SuccAmt = apiCardInfo.OrderAmt; #endregion } if (apiCardInfo.ProcessMode == 2 || suppResponse.OrderStatus == 2) { #region 系统自处理 var resInfo = new CardProcessResultInfo { supplierId = 0, orderid = sysOrderId, supplierOrder = suppResponse.SuppTransNo, status = 2, opstate = "1", msg = suppResponse.SuppErrorMsg, userViewMsg = suppResponse.SuppErrorMsg, tranAMT = suppResponse.SuccAmt, suppAmt = 0M, errtype = suppResponse.SuppErrorCode, method = apiCardInfo.ProcessMode, count = 0 }; apiCardInfo.Msg = "提卡成功,等待处理结果"; var process = new SystemProcessCard(); var tmr = new System.Threading.Timer(process.Process, resInfo, 1000, 0); resInfo.tmr = tmr; #endregion } } } if (retCode != "1") { #region 记录日志 if (this.DebuglogOpen) { var debugInfo = new viviapi.Model.Sys.debuginfo { userid = apiCardInfo.UserId, addtime = DateTime.Now, bugtype = viviapi.Model.Sys.debugtypeenum.卡类订单, errorcode = retCode, errorinfo = apiCardInfo.Msg, userorder = apiCardInfo.orderid, url = context.Request.RawUrl, detail = "" }; Debuglog.Insert(debugInfo); } #endregion } result.returncode = retCode; string responseText = Utility.GetResponseText(result, apiCardInfo.APIkey); context.Response.Write(responseText); }
/// <summary> /// 5:ip验证错误 /// 6:数字签名错误 /// 7:无效的商户号 /// 8:无效单据号 /// 9:无效的产品类型ID /// 10:无效的产品ID /// 11:无效的卡 /// 12:系统错误 /// </summary> /// <param name="cardInfo"></param> /// <returns></returns> public static string CheckParameter(CardInfo cardInfo) { string errCode = ""; if (cardInfo == null) { cardInfo = new CardInfo(); cardInfo.Msg = "参数有误"; return("12"); } errCode = CheckParamsEmpty(cardInfo); if (!string.IsNullOrEmpty(errCode)) { return("12"); } errCode = CheckParamsLength(cardInfo); if (!string.IsNullOrEmpty(errCode)) { return("12"); } if (!Card.Utility.VerifyCardNoFormat(cardInfo.cardno)) { cardInfo.Msg = "参数 [cardno] 格式不正确"; return("11"); } cardInfo.CardNo = cardInfo.cardno.Trim(); if (!Card.Utility.VerifyCardPwdFormat(cardInfo.cardpwd)) { cardInfo.Msg = "参数 [cardpwd] 格式不正确"; return("11"); } cardInfo.CardPwd = cardInfo.cardpwd.Trim(); if (string.IsNullOrEmpty(errCode)) { cardInfo.CardNo = cardInfo.cardno.Trim(); cardInfo.CardPwd = cardInfo.CardPwd.Trim(); } #region typeId int typeId = GetChannelTypeId(cardInfo.typeid, cardInfo.cardno); if (typeId == 0) { cardInfo.Msg = "[typeid]: 无效的产品类型ID"; return("9"); } cardInfo.TypeId = typeId; int cardType = Card.Utility.CodeMapping(typeId); cardInfo.CardType = cardType; #endregion #region userId int userId = 0; if (!int.TryParse(cardInfo.userid, out userId)) { cardInfo.Msg = "商户ID[userid] 格式不正确"; return("7"); } cardInfo.UserId = userId; #endregion #region cardValue decimal cardValue = 0M; if (!decimal.TryParse(cardInfo.money, out cardValue)) { cardInfo.Msg = "金额[value] 格式不正确"; return("12"); } cardInfo.OrderAmt = decimal.ToInt32(cardValue); #endregion #region userInfo var userInfo = BLL.User.Factory.GetCacheUserBaseInfo(userId); if (userInfo == null) { cardInfo.Msg = "商户不存在"; return("7");// } if (userInfo.Status != 2) { cardInfo.Msg = "商户状态不正常"; return("7");// } cardInfo.APIkey = userInfo.APIKey; cardInfo.ManageId = userInfo.manageId; #endregion if (!CheckSign(cardInfo, userInfo.APIKey)) { cardInfo.Msg = "签名失败"; return("6");// } #region chanelInfo string chanelNo = cardType.ToString("0000") + cardInfo.OrderAmt.ToString(CultureInfo.InvariantCulture); var chanelInfo = Channel.GetModel(chanelNo, userId, true); if (chanelInfo == null) { cardInfo.Msg = chanelNo + "通道不存在"; return("10");//不支持该类卡或者该面值的卡 } else if (chanelInfo.isOpen != 1) { cardInfo.Msg = chanelNo + "暂时停止该类卡或者该面值的卡交易"; return("10");//业务状态不可用,未开通此类卡业务 } else if (!chanelInfo.supplier.HasValue) { cardInfo.Msg = "未设置销卡接口"; return("12");// } cardInfo.ChanelNo = chanelNo; cardInfo.SupplierId = chanelInfo.supplier.Value; #endregion #region 数据库 检查 var chkresult = BLL.Order.Card.Factory.Instance.CheckCardInfo(userId , cardInfo.orderid , typeId , cardInfo.cardno , cardInfo.cardpwd , cardInfo.OrderAmt); if (chkresult == null) { cardInfo.Msg = "系统故障,服务器忙"; return("12"); } else { cardInfo.ProcessMode = 1; switch (chkresult.IsRepeat) { case 1: if (chkresult.Makeup == 1) { cardInfo.SupplierId = chkresult.Supplierid; cardInfo.ProcessMode = 2; //自身处理 #region 补单 if (String.Equals(chkresult.Cardpwd, cardInfo.CardPwd, StringComparison.CurrentCultureIgnoreCase)) { if (chkresult.Isclose == 0) { #region 继续补充 int balance = decimal.ToInt32(chkresult.CardBalance); if (balance > 0) { if (cardInfo.OrderAmt <= balance) { cardInfo.ProcessMode = 2; //自身处理 } else if (cardInfo.OrderAmt > balance) { cardInfo.Msg = "卡内余额不足"; return("11"); //卡余额不足 } } else { cardInfo.Msg = "充值卡无效"; return("11"); //卡余额不足 } #endregion } else { cardInfo.Msg = "充值卡无效"; return("11"); //不可以继续 补充了 } } else { cardInfo.Msg = "卡密码不正确"; return("11"); //卡密不对 } #endregion } else { cardInfo.ProcessMode = 1; //通过接口处理 } break; case 4: case 5: if (String.Equals(chkresult.Cardpwd, cardInfo.CardPwd, StringComparison.CurrentCultureIgnoreCase)) { cardInfo.Msg = "订单内容重复"; return("8"); } break; case 6: cardInfo.Msg = "订单号已经存在"; return("12"); case 7: cardInfo.Msg = "提交次数过多"; return("12"); case 8: cardInfo.Msg = "充值卡无效"; return("11"); } } #endregion return("1"); }
/// <summary> /// /// </summary> /// <param name="orderid"></param> /// <param name="info"></param> /// <returns></returns> OrderCardInfo InitOrder(string orderid, CardInfo info) { try { var order = new OrderCardInfo { ordertype = 1, orderid = orderid, userid = info.UserId, userorder = info.orderid, typeId = info.TypeId, cardType = info.CardType, cardNo = info.CardNo, cardPwd = info.CardPwd, paymodeId = info.ChanelNo, refervalue = info.OrderAmt, faceValue = 0M, attach = info.ext, referUrl = HttpContext.Current.Request.UrlReferrer != null ? HttpContext.Current.Request.UrlReferrer.ToString() : string.Empty, clientip = ServerVariables.TrueIP, addtime = DateTime.Now, completetime = DateTime.Now, notifycontext = string.Empty, notifycount = 0, notifystat = 0, notifyurl = info.url, payRate = 0M, supplierId = info.SupplierId, supplierOrder = string.Empty, server = RuntimeSetting.ServerId, manageId = info.ManageId, cardnum = 1, resultcode = "", ismulticard = 0, status = 1, ovalue = string.Empty, opstate = "", msg = info.Msg, userViewMsg = info.Msg, errtype = "", Desc = info.Msg, version = info.Version, withhold_type = 0, makeup = (byte)(info.ProcessMode == 2 ? 1 : 0) }; order.cus_field1 = info.typeid; order.cus_field2 = info.productid; if (order.manageId <= 0) { order.agentId = viviapi.BLL.User.Factory.GetPromID(info.UserId); } if (info.ProcessMode == 1) { viviapi.Cache.WebCache.GetCacheService().AddObject(order.orderid, order, ExpiresTime); } OrderBll.Insert(order); return(order); } catch (Exception ex) { ExceptionHandler.HandleException(ex); return(null); } }