示例#1
0
        public async Task <ActionResult <BankPaymentResponse> > ProcessPayment(BankPaymentRequest request)
        {
            if (request.PaymentAmount == 1111)
            {
                return(BadRequest(new BankPaymentResponse()
                {
                    PaymentIdentifier = Guid.NewGuid().ToString(),
                    PaymentErrorCode = "ValidationErrorA"
                }));
            }

            if (request.PaymentAmount == 2222)
            {
                return(StatusCode(500, new BankPaymentResponse()
                {
                    PaymentIdentifier = Guid.NewGuid().ToString(),
                    PaymentErrorCode = "InternalErrorA"
                }));
            }

            return(new BankPaymentResponse()
            {
                PaymentIdentifier = Guid.NewGuid().ToString(),
            });
        }
        public async Task <BankPaymentResponse> Process(BankPaymentRequest paymentRequest)
        {
            var serialisedRequest = JsonConvert.SerializeObject(paymentRequest);
            var httpResponse      = await _httpClient.PostAsync("api/stub", new StringContent(serialisedRequest, Encoding.UTF8, "application/json"));

            var bankResponse = await httpResponse.Content.ReadAsStringAsync();

            return(JsonConvert.DeserializeObject <BankPaymentResponse>(bankResponse));
        }
示例#3
0
 private void AssertThatBankPaymentRequetIsCorrect(BankPaymentRequest actual, ProcessPaymentRequest expected)
 {
     Assert.That(actual, Is.Not.Null);
     Assert.That(actual.PaymentAmount, Is.EqualTo(expected.Amount));
     Assert.That(actual.PaymentCurrency, Is.EqualTo(expected.Currency));
     Assert.That(actual.PaymentCardNumber, Is.EqualTo(expected.CardNumber));
     Assert.That(actual.PaymentExpiryMonthAndDate, Is.EqualTo(expected.ExpiryMonthAndDate));
     Assert.That(actual.PaymentCvv, Is.EqualTo(expected.Cvv));
 }
示例#4
0
        public async Task <IActionResult> Post(BankPaymentRequest bankPaymentRequest)
        {
            await Task.Delay(100);

            var status       = bankPaymentRequest.Amount < 50 ? "Accepted" : "Declined";
            var bankResponse = new BankPaymentResponse(Guid.NewGuid(), status);

            return(Ok(bankResponse));
        }
        public BankPaymentResponse ProcessPayment(BankPaymentRequest bankPaymentRequest)
        {
            _logger.LogInformation($"Sending Payment Request with correlationId {bankPaymentRequest.CorrelationId} to bank ");
            var vendorBank          = _bankFactory.Create(bankPaymentRequest.MerchantDetails.MerchantId);
            var bankPaymentResponse = vendorBank.ProcessPayment(bankPaymentRequest);

            _paymentRepository.CreatePayment(GenerateRepositoryPayment(bankPaymentRequest, bankPaymentResponse), bankPaymentRequest.CorrelationId);

            return(bankPaymentResponse);
        }
        private PaymentInformation GenerateRepositoryPayment(BankPaymentRequest bankPaymentRequest, BankPaymentResponse bankPaymentResponse)
        {
            var payment = new PaymentInformation
            {
                Amount      = bankPaymentRequest.Amount,
                Id          = bankPaymentResponse.PaymentId,
                CardDetails = new CardDetails(bankPaymentRequest.CardDetails.CardNumber.ToString(), bankPaymentRequest.CardDetails.ExpiryDate,
                                              bankPaymentRequest.CardDetails.Currency, bankPaymentRequest.CardDetails.CVV.ToString()),
                MerchantDetails = new MerchantDetails(bankPaymentRequest.MerchantDetails.MerchantId),
                PaymentStatus   = bankPaymentResponse.BankPaymentResponseStatus == BankPaymentResponseStatus.Unsuccessful ? "Unsuccessful" : "Successful"
            };

            payment.CardDetails.Obfuscate(_dataObfuscator);

            return(payment);
        }
        public void SaveOrUpdateBankPaymentRequest()
        {
            BankPaymentRequest BankPaymentRequest = CurrentBankPaymentRequest;

            BankPaymentRequest.RequestNo      = View.GetRequestNo;
            BankPaymentRequest.ProcessDate    = Convert.ToDateTime(DateTime.Today.ToShortDateString());
            BankPaymentRequest.ProgressStatus = ProgressStatus.InProgress.ToString();
            BankPaymentRequest.AppUser        = _adminController.GetUser(CurrentUser().Id);
            BankPaymentRequest.PaymentMethod  = View.GetPaymentMethod;
            if (CurrentBankPaymentRequest.BankPaymentRequestStatuses.Count == 0)
            {
                SaveBankPaymentRequestStatus();
            }
            GetCurrentApprover();

            _controller.SaveOrUpdateEntity(BankPaymentRequest);
        }
        public async Task <BankPaymentResponseWithStatus> ProcessPayment(BankPaymentRequest request)
        {
            var url = _configuration["Dependencies:AcquiringBank:ProcessPaymentEndpointUrl"];

            var content      = JsonConvert.SerializeObject(request);
            var httpResponse = await _client.PostAsync(url, new StringContent(content, System.Text.Encoding.Default, "application/json"));

            // This class should also support non-json responses (eg an exception)

            var response = JsonConvert.DeserializeObject <BankPaymentResponse>(await httpResponse.Content.ReadAsStringAsync());

            return(new BankPaymentResponseWithStatus()
            {
                ResponseBody = response,
                StatusCode = httpResponse.StatusCode
            });
        }
示例#9
0
        public async Task Given_valid_request_when_ProcessPayment_then_passes_correct_request_to_bank()
        {
            BankPaymentRequest requestSentToBank = null;

            _paymentRepositoryMock.Setup(x => x.Save(It.IsAny <PaymentEntity>()))
            .Returns(Task.CompletedTask);
            _paymentRepositoryMock.Setup(x => x.Update(It.IsAny <PaymentEntity>()))
            .Returns(Task.CompletedTask);
            _bankClientMock.Setup(x => x.ProcessPayment(It.IsAny <BankPaymentRequest>()))
            .Callback((BankPaymentRequest request) => requestSentToBank = request)
            .ReturnsAsync(GetSuccessfulResponseFromBank());

            var request = PaymentRequestBuilder.BuildValidPaymentRequest();

            var response = await _client.Post <ProcessPaymentRequest, ProcessPaymentResponse>("/payments", request);

            AssertThatBankPaymentRequetIsCorrect(requestSentToBank, request);

            // Alternative solution is to use Verify command which compares properties of the bank request passed as an argument with the expected values
        }
        public PaymentGatewayServiceShould()
        {
            paymentReference   = Guid.NewGuid();
            paymentRequest     = CreatePaymentRequest();
            bankPaymentRequest = new BankPaymentRequest("4485063526474709", "01/20", 20.00m, "GBP", 123);
            bankApiMock        = new Mock <IBankApiClient>();
            var bankPaymentDetail   = new BankPaymentDetail(paymentReference, "Accepted", "4485063526474709", "01/20", 20.00m, "GBP", 123);
            var bankPaymentResponse = new BankPaymentResponse(paymentReference, "Accepted");
            var paymentResponse     = new PaymentResponse(paymentReference, "Accepted");
            var paymentDetail       = new PaymentDetail(paymentReference, "Accepted", "4***********4709", "01/20", 20.00m, "GBP", 123);

            bankApiMock.Setup(service => service.Process(It.IsAny <BankPaymentRequest>()))
            .Returns(Task.FromResult(bankPaymentResponse));
            bankApiMock.Setup(service => service.GetPaymentDetail(paymentReference)).Returns(Task.FromResult(bankPaymentDetail));
            bankPaymentMapperMock = new Mock <IBankPaymentMapper>();
            bankPaymentMapperMock.Setup(mapper => mapper.MapRequest(It.IsAny <PaymentRequest>())).Returns(bankPaymentRequest);
            bankPaymentMapperMock.Setup(mapper => mapper.MapResponse(It.IsAny <BankPaymentResponse>()))
            .Returns(paymentResponse);
            bankPaymentMapperMock.Setup(mapper => mapper.MapDetail(It.IsAny <BankPaymentDetail>()))
            .Returns(paymentDetail);
            applicationLoggerMock = new Mock <IApplicationLogger>();
            paymentGatewayService = new PaymentGatewayService(bankApiMock.Object, bankPaymentMapperMock.Object, applicationLoggerMock.Object);
        }
示例#11
0
     public BankPaymentResponse ProcessPayment(BankPaymentRequest bankPaymentRequest)
     {
         if (bankPaymentRequest.Amount <= 0)
         {
             return new BankPaymentResponse
                    {
                        BankPaymentResponseStatus = BankPaymentResponseStatus.Unsuccessful,
                        PaymentId = Guid.NewGuid(),
                        Message   = "Unsuccessful Payment - Random reason"
                    }
         }
         ;
         else
         {
             return new BankPaymentResponse
                    {
                        BankPaymentResponseStatus = BankPaymentResponseStatus.Successful,
                        PaymentId = Guid.NewGuid(),
                        Message   = "Successful Payment"
                    }
         };
     }
 }
示例#12
0
        public Task <BankPaymentResponse> ProcessPaymentAsync(BankPaymentRequest request)
        {
            if (!request.Currency.Equals("GBP"))
            {
                return(Task.FromResult(new BankPaymentResponse
                {
                    Identifier = Guid.NewGuid().ToString(),
                    Success = false,
                    Error = "Unsupported currency",
                }));
            }

            if (request.Amount > AmountLimit)
            {
                return(Task.FromResult(new BankPaymentResponse
                {
                    Identifier = Guid.NewGuid().ToString(),
                    Success = false,
                    Error = "Insufficient funds",
                }));
            }
            else if (request.Amount >= 0)
            {
                return(Task.FromResult(new BankPaymentResponse
                {
                    Identifier = Guid.NewGuid().ToString(),
                    Success = true,
                }));
            }

            return(Task.FromResult(new BankPaymentResponse
            {
                Identifier = Guid.NewGuid().ToString(),
                Success = false,
                Error = "Invalid amount",
            }));
        }
示例#13
0
        public async Task <BankPaymentResponse> RequestPayment(BankPaymentRequest payment)
        {
            var json = await Task.Factory.StartNew(() => JsonConvert.SerializeObject(payment));

            var request = new HttpRequestMessage
            {
                RequestUri = BuildUri("Payment"),
                Method     = HttpMethod.Post,
                Content    = new StringContent(json, Encoding.UTF8, "application/json")
            };

            HttpResponseMessage response;

            try
            {
                response = await GetClient().SendAsync(request);
            }
            catch (Exception e)
            {
                throw new BankClientException(e.Message);
            }

            if (!response.IsSuccessStatusCode)
            {
                throw new BankClientException(response);
            }

            var result = await response.Content.ReadAsStringAsync();

            var bankResponse = JsonConvert.DeserializeObject <PaymentResponse>(result);

            var clientResponse = _mapper.Map <PaymentResponse, BankPaymentResponse>(bankResponse);

            clientResponse.Approved = bankResponse.StatusCode == "10000";

            return(clientResponse);
        }
示例#14
0
        public async Task <BankPaymentResponse> ProcessPayment(BankPaymentRequest requestModel)
        {
            using var request = new HttpRequestMessage
                  {
                      RequestUri = new Uri($"{_acquiringBankSettings.ApiUrl}/api/payment"),
                      Method     = HttpMethod.Post,
                      Content    = requestModel.ToStringContent()
                  };

            var response = await _httpClient.SendAsync(request);

            if (!response.IsSuccessStatusCode)
            {
                return(new BankPaymentResponse
                {
                    PaymentIdentifier = Guid.NewGuid().ToString(),
                    PaymentStatus = PaymentStatus.Failed
                });
            }

            var responseContent = await response.Content.ReadAsStringAsync();

            return(responseContent.FromJson <BankPaymentResponse>());
        }
        public async Task <BankPaymentResponse> ProcessPayment(BankPaymentRequest requestModel)
        {
            using var request = new HttpRequestMessage
                  {
                      RequestUri = new Uri($"{_acquiringBankSettings.ApiUrl}/api/payment"),
                      Method     = HttpMethod.Post,
                      Content    = requestModel.ToStringContent()
                  };

            var response = await _httpClient.SendAsync(request);

            if (!response.IsSuccessStatusCode)
            {
                _logger.Error($"acquring bank payment failed. error: {response.ReasonPhrase}");
                return(new BankPaymentResponse
                {
                    PaymentStatus = PaymentStatus.Failed
                });
            }

            var responseContent = await response.Content.ReadAsStringAsync();

            return(responseContent.FromJson <BankPaymentResponse>());
        }
示例#16
0
        public async Task <BankPaymentResponse> ProcessCardPost(BankPaymentRequest paymentRequest)
        {
            var retval = await _client.PostAsync <BankPaymentResponse>(paymentRequest, "/process-card");

            return(retval);
        }
示例#17
0
 public async Task <PaymentResult> ProceedPaymentAsync(BankPaymentRequest request)
 {
     return(await Task.Factory.StartNew <PaymentResult>(() =>
                                                        new PaymentResult { PaymentId = Guid.NewGuid().ToString(), StatusCode = PaymentStatusCode.Success }));
 }
 public void SaveOrUpdateBankPaymentRequest(BankPaymentRequest BankPaymentRequest)
 {
     _controller.SaveOrUpdateEntity(BankPaymentRequest);
 }
 public void DeleteBankPaymentRequest(BankPaymentRequest BankPaymentRequest)
 {
     _controller.DeleteEntity(BankPaymentRequest);
 }