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); }
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); }
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" })); } }
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); } }