Ejemplo n.º 1
0
        /// <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);
        }
Ejemplo n.º 2
0
        /// <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");
        }
Ejemplo n.º 3
0
        /// <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);
            }
        }