Beispiel #1
0
        public async Task <PaymentResult> SendPayment(Contract.Payment payment)
        {
            var content = new StringContent(
                JsonConvert.SerializeObject(payment),
                Encoding.UTF8,
                "application/json");

            using var client = _httpClientFactory.CreateClient();

            HttpResponseMessage response;

            try
            {
                _logger.Log(LogLevel.Debug, $"Sending POST to {_uri}");
                response = await client.PostAsync(_uri, content);
            }
            catch (Exception e)
            {
                _logger.Log(LogLevel.Error, "Failed to communicate with acquiring bank", e);
                throw;
            }

            if (response.StatusCode != HttpStatusCode.OK)
            {
                _logger.Log(LogLevel.Error, "Acquiring bank responded with unexpected status code", response);
                return(null);
            }

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

            var result = JsonConvert.DeserializeObject <PaymentResult>(jsonContent);

            return(result);
        }
        private Database.PaymentDetails CreatePaymentDetails(Contract.Payment payment, PaymentResult result)
        {
            var paymentDetails = _mapper.Map <Database.PaymentDetails>(payment);

            paymentDetails.PaymentId        = result?.PaymentId;
            paymentDetails.PaymentStatus    = result?.PaymentStatus;
            paymentDetails.MaskedCardNumber = _cardNumberMaskingService.MaskCardNumber(payment.CardNumber);
            paymentDetails.TimeStamp        = DateTime.UtcNow;
            return(paymentDetails);
        }
        public async Task <PaymentResult> ProcessNewPayment(Contract.Payment payment)
        {
            var result = await _paymentApiClient.SendPayment(payment);

            var paymentDetails = CreatePaymentDetails(payment, result);

            await _paymentRepository.SavePayment(paymentDetails);

            return(result);
        }
        public async Task <ActionResult <PaymentResult> > ProcessPayment(Contract.Payment payment)
        {
            _logger.Log(LogLevel.Debug, "Incoming POST request");
            var result = await _paymentProcessor.ProcessNewPayment(payment);

            if (result == null)
            {
                return(StatusCode(StatusCodes.Status500InternalServerError));
            }

            return(result);
        }
        public void Setup()
        {
            _apiClient  = new Mock <IPaymentApiClient>();
            _repository = new Mock <IPaymentRepository>();
            _cardNumberMaskingService = new Mock <ICardNumberMaskingService>();
            _mapper = new Mock <IMapper>();

            _paymentProcessor = new PaymentProcessor(_apiClient.Object, _repository.Object, _mapper.Object, _cardNumberMaskingService.Object, new Mock <ILogger <PaymentProcessor> >().Object);

            _newPayment = new Contract.Payment();

            _paymentResult = new PaymentResult();
            _apiClient.Setup(c => c.SendPayment(_newPayment)).ReturnsAsync(_paymentResult);

            _mappedPayment = new PaymentDetails();
            _mapper.Setup(m => m.Map <PaymentDetails>(_newPayment)).Returns(_mappedPayment);

            _maskedCardNumber = "1234********1234";
            _cardNumberMaskingService.Setup(s => s.MaskCardNumber(_newPayment.CardNumber)).Returns(_maskedCardNumber);
        }