Ejemplo n.º 1
0
        public async Task <PaymentServiceResponse> MakePayment(PaymentViewModel payment)
        {
            var gatewayResult = new PaymentGatewayResponse();

            if (payment.Amount <= 20)
            {
                gatewayResult = await _cheapPaymentGateway.ProcessPayment(payment.CreditCardNumber, payment.CardHolder, payment.Amount);
            }
            else if (payment.Amount <= 500)
            {
                gatewayResult = await _expensivePaymentGateway.ProcessPayment(payment.CreditCardNumber, payment.CardHolder, payment.Amount);

                if (gatewayResult.StatusCode != 200)
                {
                    gatewayResult = await _cheapPaymentGateway.ProcessPayment(payment.CreditCardNumber, payment.CardHolder, payment.Amount);
                }
            }
            else if (payment.Amount > 500)
            {
                int numberOfRetries = 3;
                int i = 0;
                while (i < numberOfRetries)
                {
                    gatewayResult = await _premiumPaymentGateway.ProcessPayment(payment.CreditCardNumber, payment.CardHolder, payment.Amount);

                    if (gatewayResult.StatusCode == 200)
                    {
                        break;
                    }
                    i++;
                }
            }
            if (gatewayResult.StatusCode == 200)
            {
                SavePayment(payment, gatewayResult.PaymentStatus);
            }
            var result = new PaymentServiceResponse {
                StatusCode = gatewayResult.StatusCode, Message = gatewayResult.Message
            };

            return(result);
        }
Ejemplo n.º 2
0
        public PaymentResponse ProcessPayment(Payment payment)
        {
            PaymentResponse response = null;

            IPaymentGateway gateway;

            if (payment.Amount < 20)
            {
                gateway  = new ICheapPaymentGateway();
                response = gateway.ProcessPayment(payment);
            }
            else if (payment.Amount > 20 && payment.Amount <= 500)
            {
                gateway  = new IExpensivePaymentGateway();
                response = gateway.ProcessPayment(payment);
                if (!response.Success)
                {
                    gateway  = new ICheapPaymentGateway();
                    response = gateway.ProcessPayment(payment);
                }
            }
            else
            {
                gateway = new IPremiumPaymentGateway();
                var retries = 3;
                while (retries > 0)
                {
                    response = gateway.ProcessPayment(payment);
                    if (response.Success)
                    {
                        return(response);
                    }

                    retries--;
                }
                response.ErrorMessage += " Retried: 3 times.";
            }
            return(response);
        }
Ejemplo n.º 3
0
        public async Task <IActionResult> ProcessPayment(PaymentDto payment)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(new { message = "Bad Request", errors = "Invalid credentials provided" }));
            }

            //Strip any non-numeric values
            payment.CreditCardNumber = Regex.Replace(payment.CreditCardNumber, @"[^\d]", "");
            if (Utilities.IsModelValid(payment))
            {
                var model = new Payment();
                try
                {
                    model = _mapper.Map <Payment>(payment);

                    if (model.Amount < 21)
                    {
                        await _cheapPayment.ProcessPayment(model);
                    }
                    else if (model.Amount < 501)
                    {
                        try
                        {
                            await _expensivePayment.ProcessPayment(model);
                        }
                        catch (Exception)
                        {
                            await _cheapPayment.ProcessPayment(model);
                        }
                    }
                    else
                    {
                        try
                        {
                            await _premiumPayment.ProcessPayment(model);
                        }
                        catch (Exception)
                        {
                            int i = 1;
                            do
                            {
                                var response = await _cheapPayment.ProcessPayment(model);

                                if (response)
                                {
                                    break;
                                }
                                i++;
                            }while (i < 4);
                        }
                    }
                }
                catch (Exception e)
                {
                    _logger.LogError(e.Message);
                }

                try
                {
                    var result = await _transactionRepository.GetById(model.Id);

                    return(Ok(result));
                }
                catch (Exception e)
                {
                    _logger.LogError(e.Message);
                }
            }
            return(StatusCode(500, "internal error"));
        }
        public async Task <bool> ProcessPayment(PaymentRequest paymentRequest)
        {
            var result = await _premiumPaymentGateway.ProcessPayment(paymentRequest);

            return(result);
        }
        public async Task <IActionResult> ProcessPayment([FromBody] PaymentToCreateDTO model)
        {
            model.CreditCardNumber = Regex.Replace(model.CreditCardNumber, @"[^\d]", "");
            var validator = new PaymentValidator();
            var validate  = await validator.ValidateAsync(model);

            if (!validate.IsValid)
            {
                var errors = validator.GetErrorMessage(validate.Errors);
                return(BadRequest(new { message = "Bad request", errors }));
            }

            Payment payment;

            try
            {
                payment = _mapper.Map <Payment>(model);

                if (model.Amount < 21)
                {
                    await _cheapPayment.ProcessPayment(payment);
                }
                else if (model.Amount < 501)
                {
                    try
                    {
                        await _expensivePayment.ProcessPayment(payment);
                    }
                    catch (Exception)
                    {
                        await _cheapPayment.ProcessPayment(payment);
                    }
                }
                else
                {
                    try
                    {
                        await _premiumPayment.ProcessPayment(payment);
                    }
                    catch (Exception)
                    {
                        int i = 1;
                        do
                        {
                            var response = await _cheapPayment.ProcessPayment(payment);

                            if (response)
                            {
                                break;
                            }
                            i++;
                        }while (i < 4);
                    }
                }
            }
            catch (Exception e)
            {
                _logger.LogError(e.Message);
                return(StatusCode(500, new { message = "Internal error", errors = "Data access processing error" }));
            }

            try
            {
                var result = await _transactionRepository.GetByPaymentId(payment.Id);

                return(Ok(new { message = "Success", data = result }));
            }
            catch (Exception e)
            {
                _logger.LogError(e.Message);
                return(StatusCode(500, new { message = "Internal error", errors = "Data access processing error" }));
            }
        }
Ejemplo n.º 6
0
        public bool ProcessPaymentGreaterThan500(PaymentDetail paymentDetail, int transactionType = 0)
        {
            var referenceNumberrr = Utility.Utility.GenerateReferenceNumber();

            paymentDetail.PaymentReference = referenceNumberrr;
            paymentDetail.PaymentLogs      = new List <PaymentLog> {
                new PaymentLog {
                    Amount = paymentDetail.Amount, PaymentDate = DateTime.Now, PaymentState = PaymentState.Pending, PaymentGateway = PaymentGateway.ExpensiveGateway, PaymentReference = referenceNumberrr
                }
            };
            detailRepository.Add(paymentDetail);
            detailRepository.Save();

            var premiumPaymentResult = premiumPaymentGateway.ProcessPayment(paymentDetail, transactionType);
            var paymentLogg          = paymentLogRepository.GetPaymentLogByFilter(c => c.PaymentReference == referenceNumberrr);//.FirstOrDefault();

            if (premiumPaymentResult.Code == ResponseCodes.OK)
            {
                paymentLogg.PaymentState = PaymentState.Processed;
                paymentLogRepository.Update(paymentLogg);
                paymentLogRepository.Save();
                return(true);
            }
            else
            {
                paymentLogg.PaymentState = PaymentState.Failed;
                paymentLogRepository.Update(paymentLogg);
                paymentLogRepository.Save();


                int count = 1;
                while (count < 4)
                {
                    var logg = paymentLogRepository.Add(new PaymentLog {
                        PaymentDetailId = paymentLogg.PaymentDetailId, PaymentReference = referenceNumberrr, Amount = paymentDetail.Amount, PaymentGateway = PaymentGateway.PremiumGateway, PaymentState = PaymentState.Pending
                    });
                    if (!(paymentLogRepository.Save() > 0))
                    {
                        return(false);
                    }
                    var premiumPaymentResultt = premiumPaymentGateway.ProcessPayment(paymentDetail, transactionType);
                    var paymentLogPremium     = paymentLogRepository.GetPaymentLogByFilter(c => c.PaymentReference == referenceNumberrr && c.PaymentGateway == PaymentGateway.PremiumGateway && c.PaymentState == PaymentState.Pending);//.FirstOrDefault();

                    if (premiumPaymentResultt.Code == ResponseCodes.OK)
                    {
                        paymentLogPremium.PaymentState = PaymentState.Processed;
                        paymentLogRepository.Update(paymentLogPremium);
                        paymentLogRepository.Save();
                        return(true);
                    }
                    else
                    {
                        paymentLogPremium.PaymentState = PaymentState.Failed;
                        paymentLogRepository.Update(paymentLogPremium);
                        paymentLogRepository.Save();
                        count++;
                    }
                }
                return(false);
            }
        }