public CardPaymentRequestStatus ProcessCardPaymentRequest(CardPayment cardPayment, int retryCount)
        {
            var result = CardPaymentRequestStatus.NotRequest;
            // SZXResult szxResult = PaymentsService.YeepayCardPayments(cardPayment); //卡内金额全部充值
            SZXResult szxResult = PaymentsService.YeepayCardPartialPayments(cardPayment); //部分充值


            LogHelper.WriteInfo(string.Format("Processing card payment with OrderNo : {0}, request result : {1}", cardPayment.OrderNo, szxResult == null ? "null" : szxResult.R1_Code));
            if (szxResult == null || string.IsNullOrEmpty(szxResult.R1_Code)) // retry
            {
                if (retryCount == -1)
                {
                    result = CardPaymentRequestStatus.RequestFailed;
                }
                else
                {
                    cardPayment.RequestDateTime = DateTime.Now;
                    retryCount++;
                    result = CardPaymentRequestStatus.RequestFailed;

                    if (retryCount <= retryTimesLimitation)
                    {
                        RedisService.AddItemToQueue <CardPayment>(BillingConsts.KEY_CARD_PAYMENT_REQUEST_RETRY_QUEUE + retryCount, cardPayment);
                    }
                    else // final failed
                    {
                        Order currentOrder = oracleRepo.Single <Order>(cardPayment.OrderID);
                        SetFailedOrderStatus(CardPaymentRequestStatus.RequestFailed, currentOrder);
                        //record the info for retry manually
                        var cardPaymentInfoForRetry = EntityMapping.Auto <CardPayment, CardPaymentRetry>(cardPayment);
                        var AddRes = oracleRepo.Add <CardPaymentRetry>(cardPaymentInfoForRetry);
                    }
                }
            }
            else
            {
                CardPaymentRequestStatus requestStatus = (CardPaymentRequestStatus)szxResult.R1_Code.ToInt32();
                Order currentOrder = oracleRepo.Single <Order>(cardPayment.OrderID);

                if (currentOrder != null)
                {
                    switch (requestStatus)
                    {
                    case CardPaymentRequestStatus.Success:
                        SetSuccessOrderStatus(currentOrder);
                        result = requestStatus;
                        break;

                    default:
                        SetFailedOrderStatus(requestStatus, currentOrder);
                        result = requestStatus;
                        break;
                    }
                }
            }
            return(result);
        }
Exemplo n.º 2
0
        //[Fact]
        //public void GetMobileInfoByPhoneNumber_test()
        //{
        //    IRepository repository = new SimpleRepository(ConnectionStrings.Key_ORACLE_LOG, SimpleRepositoryOptions.None);

        //    //var mobile = SMSService.GetMobileInfoByPhoneNumber("");

        //    var citys = repository.All<City>();
        //    var province = repository.All<Province>();



        //}

        // [Fact]
        public void SMSCallbackLogicTest()
        {
            //IRepository repository = new SimpleRepository(ConnectionStrings.KEY_ORACLE_GENERAL, SimpleRepositoryOptions.RunMigrations);
            //repository.Add<Partner>(new Partner() { CallbackURL = "http://fh_charge.auroraorbit.com/sms_callback.ashx", PartnerNo = "1" });

            IRedisService       realRedisService = new RedisService();
            PaymentNotification pn = new PaymentNotification()
            {
                OutOrderNo  = "outOrderNo",
                CallbackURL = "http://fh_charge.auroraorbit.com/sms_callback.ashx",
                OrderNo     = "orderNo",
                ResultCode  = 2
            };

            //realRedisService.AddItemToQueue<PaymentNotification>();
            realRedisService.AddItemToQueue <PaymentNotification>(BillingConsts.KEY_CARD_PAYMENT_CALLBACK_PROCESSING_QUEUE, pn);
        }
 private int RetryNotify(PaymentNotification callbackInfo, int retryCount)
 {
     callbackInfo.LastRequestDate = DateTime.Now;
     retryCount++;
     if (retryCount <= retryTimesLimitation)
     {
         RedisService.AddItemToQueue <PaymentNotification>(BillingConsts.KEY_CARD_PAYMENT_CALLBACK_RETRY_QUEUE + retryCount, callbackInfo);
     }
     else// final failed
     {
         Order currentOrder = oracleRepo.Single <Order>(s => s.OrderNo == callbackInfo.OrderNo);
         if (currentOrder.OrderStatus == OrderStatus.Processing)
         {
             //processing status without operation
         }
         else
         {
             FailedNofity(callbackInfo, currentOrder);
         }
     }
     return(retryCount);
 }
        private void SetFailedOrderStatus(CardPaymentRequestStatus resultCode, Order currentOrder)
        {
            currentOrder.OrderStatus = OrderStatus.Failed;
            currentOrder.CardPaymentRequestStatus = resultCode;
            int updateRet = oracleRepo.Update <Order>(currentOrder);

            if (!string.IsNullOrEmpty(currentOrder.CallBackUrl))
            {
                RedisService.AddItemToQueue <PaymentNotification>(BillingConsts.KEY_CARD_PAYMENT_CALLBACK_PROCESSING_QUEUE,
                                                                  new PaymentNotification
                {
                    ResultCode      = (int)CardPaymentCallBackStatus.RequestError,
                    OrderNo         = currentOrder.OrderNo,
                    Description     = CardPaymentDataDict.CardPaymentRequestStatusDesc[((int)resultCode).ToString()],
                    RequestAmount   = currentOrder.Amount,
                    OutOrderNo      = currentOrder.OutOrderNo,
                    SuccessAmount   = 0.0f,
                    CallbackURL     = currentOrder.CallBackUrl,
                    LastRequestDate = DateTime.Now
                }
                                                                  );
            }
        }