예제 #1
0
        /// <summary>
        /// Process a tranction through an acquirer
        /// </summary>
        /// <param name="transactionRepresenter"></param>
        /// <param name="bankURL"></param>
        /// <returns></returns>
        public async Task <BankResponseDto> ProcessTransactionAsync(TransactionRepresenter transactionRepresenter, string bankURL)
        {
            if (transactionRepresenter == null || bankURL == null)
            {
                return(null);
            }

            //Process transaction through acquirer
            var bankResponse = await _apiService.ProcessTransactionAsync(transactionRepresenter, bankURL)
                               .ConfigureAwait(false);

            var bankResponseData = await bankResponse.Content
                                   .ReadAsStringAsync()
                                   .ConfigureAwait(false);


            var json = JsonConvert.DeserializeObject <BankResponse>(bankResponseData);
            var transactionCreationRepresenter = new BankResponseDto
            {
                BankResponseID = json.BankResponseID,
                Status         = json.Status.ToString(),
                SubStatus      = json.SubStatus.ToString(),
            };

            return(transactionCreationRepresenter);
        }
예제 #2
0
        public void GivenIReceiveTheFollowingResponseFromTheBankService(BankResponseDto bankResponseDto)
        {
            var bankResponse = new BankResponse
            {
                PaymentId     = bankResponseDto.PaymentId,
                PaymentStatus = bankResponseDto.PaymentStatus,
                ProcessedDate = bankResponseDto.ProcessedDate
            };

            bankService.SetBankResponse(bankResponse);
        }
        private static StringContent SetExpectedResponse()
        {
            var bankResponse = new BankResponseDto
            {
                BankResponseID = new Guid(),
                Status         = TransactionStatus.Successful.ToString(),
                SubStatus      = TransactionSubStatus.Successful.ToString(),
            };
            var expectedResponse = new StringContent(JsonConvert.SerializeObject(bankResponse));

            return(expectedResponse);
        }
        public void GivenFalseAuthorizationFromBank_MakePayment_Returns401UnauthorizedResponse()
        {
            var bank             = new Mock <IAcquiringBank>();
            var testBankResponse = new BankResponseDto(testId, false);

            bank.Setup(x => x.PaymentIsApproved(It.IsAny <PaymentRequestDto>())).Returns(testBankResponse);
            var sut = new PaymentController(bank.Object, paymentStore.Object, paymentRequestValidator.Object);

            var result = sut.MakePayment(testPaymentRequestDto);

            Assert.IsInstanceOf <StatusCodeResult>(result.Result);
            Assert.AreEqual(StatusCodes.Status401Unauthorized, (result.Result as StatusCodeResult).StatusCode);
        }
예제 #5
0
        public async Task <BankResponseDto> PostPayment(PaymentRequestDto paymentRequestDto, Merchant currentUser, string bankUrl)
        {
            BankResponseDto bankResponseDto = new BankResponseDto();

            var response = CommunicationUtils.ConnectToBank($"{bankUrl}/payment", Method.POST, paymentRequestDto);

            if (response.ResponseStatus == ResponseStatus.Completed && response.StatusCode == HttpStatusCode.OK)
            {
                bankResponseDto = JsonConvert.DeserializeObject <BankResponseDto>(response.Content);

                await SavePaymentDetails(paymentRequestDto, bankResponseDto, currentUser);
            }

            return(bankResponseDto);
        }
        public void Setup()
        {
            bank             = new Mock <IAcquiringBank>();
            testBankResponse = new BankResponseDto(testId, testStatus);
            bank.Setup(x => x.PaymentIsApproved(It.IsAny <PaymentRequestDto>())).Returns(testBankResponse);

            paymentStore = new Mock <IPaymentStorage>();
            paymentStore.Setup(x => x.Store(It.IsAny <int>(), It.IsAny <PaymentStorageObject>()));

            paymentRequestValidator = new Mock <IPaymentRequestValidator>();
            paymentRequestValidator.Setup(x => x.IsValid(It.IsAny <PaymentRequestDto>())).Returns(true);

            sut = new PaymentController(bank.Object, paymentStore.Object, paymentRequestValidator.Object);

            testExpiry            = DateTime.Now.AddDays(1);
            testPaymentRequestDto = new PaymentRequestDto(testCardNum, testExpiry, testCurrency, testAmount, testCvv);
            testPaymentResponse   = new PaymentResponseDto(testPaymentRequestDto, testBankResponse);
        }
        public Task <BankResponseDto> ProcessPaymentRequestAsync(Payment payment)
        {
            var bankResponse = new BankResponseDto();

            bankResponse.BankProcessId = Guid.NewGuid();

            payment.SetBankResponseId(bankResponse.BankProcessId);

            switch (payment.Amount)
            {
            case double val when val > 3000:
                bankResponse.Status = PaymentProcessingStatus.Rejected;
                payment.Rejected();
                break;

            default:
                bankResponse.Status = PaymentProcessingStatus.Success;
                payment.Success();
                break;
            }

            return(Task.FromResult(bankResponse));
        }
예제 #8
0
        private async Task SavePaymentDetails(PaymentRequestDto paymentRequestDto, BankResponseDto bankResponseDto, Merchant currentUser)
        {
            PaymentDetails paymentDetails = new PaymentDetails()
            {
                Identifier = bankResponseDto.Identifier,
                Status     = bankResponseDto.Status,
                Amount     = paymentRequestDto.Amount,
                Card       = new Card()
                {
                    CardNumber  = paymentRequestDto.Card.CardNumber,
                    Cvv         = paymentRequestDto.Card.Cvv,
                    ExpiryMonth = paymentRequestDto.Card.ExpiryMonth,
                    ExpiryYear  = paymentRequestDto.Card.ExpiryYear,
                },
                Currency = paymentRequestDto.Currency,
                Merchant = currentUser,
                Date     = DateTime.Now
            };

            await repository.PostPaymentDetails(paymentDetails);

            await unitOfWork.CompleteAsync();
        }
예제 #9
0
 private static Transaction GetTransactionEntity(
     BankResponseDto bankResponse,
     TransactionRepresenter transactionRepresenter,
     TransactionDetails transactionDetails,
     CardDetails cardEntity)
 {
     return(new Transaction
     {
         Amount = transactionRepresenter.Amount,
         Card = cardEntity,
         CardDetailsID = cardEntity.CardDetailsID,
         Currency = transactionDetails.Currency,
         CurrencyId = transactionDetails.Currency.CurrencyId,
         Merchant = transactionDetails.Merchant,
         MerchantID = transactionDetails.Merchant.MerchantID,
         TransactionID = Guid.NewGuid(),
         Bank = transactionDetails.Bank,
         BankID = transactionDetails.Bank.BankID,
         BankReferenceID = bankResponse.BankResponseID,
         Status = bankResponse.Status,
         SubStatus = bankResponse.SubStatus
     });
 }
        //POST: /api/Payments/Post
        public async Task <ActionResult <BankResponseDto> > Post([FromBody] PaymentRequestDto paymentRequestDto)
        {
            CardValidation cardValidation = new CardValidation(paymentRequestDto.Card);

            if (!cardValidation.IsValid)
            {
                return(BadRequest(new { message = "Card data is incorrect." }));
            }

            ClaimsPrincipal currentUser     = this.User;
            var             currentUserName = currentUser.FindFirst("login").Value;
            var             user            = await _userManager.FindByNameAsync(currentUserName);

            BankResponseDto bankResponseDto = await paymentService.PostPayment(paymentRequestDto, user, _options.Value.BankUrl);

            if (bankResponseDto != null)
            {
                return(Ok(bankResponseDto));
            }
            else
            {
                return(NotFound(new { message = "Bank could not process the request" }));
            }
        }
예제 #11
0
        public async Task <IActionResult> ProcessTransaction([FromBody] TransactionRepresenter transaction)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            if (transaction == null)
            {
                return(BadRequest("Transaction data not found"));
            }

            if (await _transactionDetailsValidatorService.ValidateAsync(transaction).ConfigureAwait(false))
            {
                return(BadRequest(_transactionDetailsValidatorService.GetErrors()));
            }

            var creditCardValidationResult = CreditCardHelper.IsCreditCardInfoValid(transaction);

            if (!creditCardValidationResult)
            {
                return(BadRequest("Invalid Credit Card data"));
            }

            var transactionDetails = _transactionDetailsValidatorService.GetTransactionDetails();
            var cardEntity         = await _cardDetailsService.CreateCardDetailsAsync(transaction).ConfigureAwait(false);


            BankResponseDto bankResponse = await _bankService.ProcessTransactionAsync(transaction, transactionDetails.Bank.BankURL).ConfigureAwait(false);

            Transaction transactionEntity = GetTransactionEntity(bankResponse, transaction, transactionDetails, cardEntity);

            await _transactionService.CreateTransactionAsync(transactionEntity).ConfigureAwait(false);

            return(Ok(transactionEntity));
        }
예제 #12
0
 public PaymentResponseDto(PaymentRequestDto paymentRequest, BankResponseDto bankResponse)
 {
     this.paymentRequest = paymentRequest;
     this.bankResponse   = bankResponse;
 }