Beispiel #1
0
        public async Task <PaymentStateDto> ProcessPayment(PaymentRequestDto paymentRequestDto)
        {
            var paymentEntity = _mapper.Map <PaymentRequestDto, Payment>(paymentRequestDto);

            paymentEntity = await _paymentRepository.Create(paymentEntity);

            var paymentStateEntity = new PaymentState()
            {
                Payment = paymentEntity, PaymentId = paymentEntity.PaymentId, CreatedDate = DateTime.Now, State = PaymentStateEnum.Pending.ToString()
            };

            paymentStateEntity = await _paymentStateRepository.Create(paymentStateEntity);

            //save to db here
            //send request to various gateway here
            if (paymentRequestDto.Amount <= 20)
            {
                var paymentStateDto = await ProcessPaymentStateDto(_cheapPaymentGateway, paymentRequestDto, paymentEntity);

                return(paymentStateDto);
            }
            else if (paymentRequestDto.Amount > 20 && paymentRequestDto.Amount <= 500)
            {
                PaymentStateDto paymentStateDto = new PaymentStateDto()
                {
                    PaymentState = PaymentStateEnum.Failed, PaymentStateDate = DateTime.Now
                };
                int tryCount = 0;
                try
                {
                    paymentStateDto = await ProcessPaymentStateDto(_expensivePaymentGateway, paymentRequestDto, paymentEntity);

                    if (paymentStateDto != null && paymentStateDto.PaymentState == PaymentStateEnum.Processed)
                    {
                        return(paymentStateDto);
                    }
                    else
                    {
                        tryCount++;
                        paymentStateDto = await ProcessPaymentStateDto(_cheapPaymentGateway, paymentRequestDto, paymentEntity);

                        return(paymentStateDto);
                    }
                }
                catch (Exception ex)
                {
                    //log exception
                    if (tryCount == 0)
                    {
                        paymentStateDto = await ProcessPaymentStateDto(_cheapPaymentGateway, paymentRequestDto, paymentEntity);

                        return(paymentStateDto);
                    }
                }
                return(paymentStateDto);
            }
            else
            {
                int             tryCount        = 0;
                PaymentStateDto paymentStateDto = new PaymentStateDto()
                {
                    PaymentState = PaymentStateEnum.Failed, PaymentStateDate = DateTime.Now
                };;
                while (tryCount < 3)
                {
                    try
                    {
                        paymentStateDto = await ProcessPaymentStateDto(_expensivePaymentGateway, paymentRequestDto, paymentEntity);

                        if (paymentStateDto != null && paymentStateDto.PaymentState == PaymentStateEnum.Processed)
                        {
                            return(paymentStateDto);
                        }
                    }
                    catch (Exception ex)
                    {
                        //log error
                    }
                    finally
                    {
                        tryCount++;
                    }
                }
                return(paymentStateDto);
            }
            throw new Exception("Payment could not be processed");
        }
Beispiel #2
0
        public async Task Test_PaymentRequestService_Pay(PaymentRequestDto paymentRequestDto, PaymentStateDto cheapGatewayResponseDto, int timesCheapGatewayCalled, PaymentStateDto expensiveGatewayResponseDto, int timesExpensiveGatewayCalled, PaymentStateEnum expectedPaymentStateEnum)
        {
            //arrange

            _cheapPaymentGateway.Setup(s => s.ProcessPayment(paymentRequestDto)).Returns(cheapGatewayResponseDto);
            _expensivePaymentGateway.Setup(s => s.ProcessPayment(paymentRequestDto)).Returns(expensiveGatewayResponseDto);


            //act
            var paymentStateDto = await _paymentRequestService.Pay(paymentRequestDto);

            //assert
            Assert.IsNotNull(paymentStateDto);
            Assert.AreEqual(paymentStateDto.PaymentState, expectedPaymentStateEnum);
            _cheapPaymentGateway.Verify(s => s.ProcessPayment(paymentRequestDto), Times.Exactly(timesCheapGatewayCalled));
            _expensivePaymentGateway.Verify(s => s.ProcessPayment(paymentRequestDto), Times.Exactly(timesExpensiveGatewayCalled));
        }
Beispiel #3
0
        public async Task <dynamic> ProcessPayment(RequestDto request)
        {
            if (request == null)
            {
                return(BadRequest(ModelState));
            }

            if (!ValidateCreditCard(request.CreditCardNumber))
            {
                ModelState.AddModelError("", "Credit Card Number is invalid!");
                return(StatusCode(404, ModelState));
            }

            if (!ValidateExpirationDate(request.ExpirationDate))
            {
                ModelState.AddModelError("", "Card expired!");
                return(StatusCode(404, ModelState));
            }

            if (request.SecurityCode.Length > 0 && !ValidateSecurityCode(request.SecurityCode))
            {
                ModelState.AddModelError("", "Security code is invalid!");
                return(StatusCode(404, ModelState));
            }

            if (!ValidateAmount(request.Amount))
            {
                ModelState.AddModelError("", "Amount can't be negative!");
                return(StatusCode(404, ModelState));
            }

            var requestObj = _mapper.Map <Request>(request);

            var addRequest = _expensivePaymentGateway.AddRequest(requestObj);

            dynamic process;

            if (request.Amount <= 20)
            {
                process = await _cheapPaymentGateway.ProcessPayment(requestObj);
            }
            else if (request.Amount > 20 && request.Amount <= 500)
            {
                process = await _expensivePaymentGateway.ProcessPayment(requestObj);
            }
            else
            {
                process = await _premiumPaymentService.ProcessPayment(requestObj);
            }


            var state = new PaymentStateDto
            {
                RequestId = addRequest.Id,
                Status    = process
            };

            var stateObj = _mapper.Map <PaymentState>(state);

            _expensivePaymentGateway.AddPaymentState(stateObj);

            return(process);
        }
        public async Task <PaymentStateDto> MakePayment(PaymentCreateDto paymentCreateDto)
        {
            var paymentEntity = _mapper.Map <PaymentCreateDto, Payment>(paymentCreateDto);

            paymentEntity = await _paymentRepository.CreatePaymentRecord(paymentEntity);

            var paymentStateEntity = new PaymentState()
            {
                Payment = paymentEntity, PaymentId = paymentEntity.PaymentId, DateCreated = DateTime.Now, State = PaymentStateEnum.Pending.ToString()
            };

            paymentStateEntity = await _paymentStateRepository.CreatePaymentRecord(paymentStateEntity);

            //implement payment gateway processing and make records persistent on DB
            if (paymentCreateDto.Amount <= 20)
            {
                var paymentStateDto = await ProcessPaymentStateDto(_cheapPaymentGateway, paymentCreateDto, paymentEntity);

                return(paymentStateDto);
            }
            else if (paymentCreateDto.Amount > 20 && paymentCreateDto.Amount <= 500)
            {
                PaymentStateDto paymentStateDto = new PaymentStateDto()
                {
                    PaymentState = PaymentStateEnum.Failed, PaymentStateDate = DateTime.Now
                };
                int tryCount = 0;
                try
                {
                    paymentStateDto = await ProcessPaymentStateDto(_expensivePaymentGateway, paymentCreateDto, paymentEntity);

                    if (paymentStateDto != null && paymentStateDto.PaymentState == PaymentStateEnum.Processed)
                    {
                        return(paymentStateDto);
                    }
                    else
                    {
                        tryCount++;
                        paymentStateDto = await ProcessPaymentStateDto(_cheapPaymentGateway, paymentCreateDto, paymentEntity);

                        return(paymentStateDto);
                    }
                }
                catch (Exception ex)
                {
                    if (tryCount == 0)
                    {
                        paymentStateDto = await ProcessPaymentStateDto(_cheapPaymentGateway, paymentCreateDto, paymentEntity);

                        return(paymentStateDto);
                    }
                }
                return(paymentStateDto);
            }
            else
            {
                int             tryCount        = 0;
                PaymentStateDto paymentStateDto = new PaymentStateDto()
                {
                    PaymentState = PaymentStateEnum.Failed, PaymentStateDate = DateTime.Now
                };;
                while (tryCount < 3)
                {
                    try
                    {
                        paymentStateDto = await ProcessPaymentStateDto(_expensivePaymentGateway, paymentCreateDto, paymentEntity);

                        if (paymentStateDto != null && paymentStateDto.PaymentState == PaymentStateEnum.Processed)
                        {
                            return(paymentStateDto);
                        }
                    }
                    catch (Exception ex)
                    {
                        //_logger.LogError(ex, ex.Message);
                    }
                    finally
                    {
                        tryCount++;
                    }
                }
                return(paymentStateDto);
            }
            throw new Exception("Payment could not be processed");
        }