public async Task <int> InitialiseAsync(FulfillRequest request, string merchantId)
        {
            var existing = await _context.Payments.FirstOrDefaultAsync(x => x.CorrelationId == request.CorrelationId);

            if (existing is null)
            {
                var payment = new Payment
                {
                    Amount          = request.Amount,
                    CardNumber      = request.CardNumber,
                    CreatedDate     = DateTime.Now,
                    CorrelationId   = request.CorrelationId,
                    CurrencyCode    = request.CurrencyCode,
                    CVV             = request.CVV,
                    ExpiryMonthYear = request.ExpiryMonthYear,
                    MerchantId      = merchantId,
                    Status          = PaymentStatus.Pending
                };
                _context.Add(payment);
                await _context.SaveChangesAsync();

                _logger.LogInformation($"Payment Initilised | Correlation Id: {request.CorrelationId}");

                return(payment.Id);
            }
            else if (existing.Status != PaymentStatus.Pending)
            {
                _logger.LogCritical($"Payment has already been completed | Correlation Id: {request.CorrelationId}");
                throw new Exception("Payment has already been completed");
            }

            return(existing.Id);
        }
Beispiel #2
0
        public async Task <ActionResult <FulfillResponse> > Fulfill(FulfillRequest request)
        {
            var detector = new CreditCardDetector(request.CardNumber);

            if (!detector.IsValid())
            {
                _logger.LogError($"Invalid Card Number | Correlation Id: {request.CorrelationId}");
                return(BadRequest("Invalid card number"));
            }

            var merchantId = HttpContext.User.Identity.Name;
            var id         = await _paymentService.InitialiseAsync(request, merchantId);

            var bankRequest = new BankFulfillRequest
            {
                ExpiryMonthYear = request.ExpiryMonthYear,
                CardNumber      = request.CardNumber,
                Amount          = request.Amount,
                CurrencyCode    = request.CurrencyCode,
                CVV             = request.CVV,
                MerchantId      = merchantId
            };

            var result = await _clientFactory.GetClient(request.CardNumber).FulfillAsync(bankRequest);

            var status = GetStatus(result.Status);
            await _paymentService.FulfillAsync(id, status, result.TransactionId);

            return(Ok(new FulfillResponse
            {
                BankTransactionId = result.TransactionId,
                Status = status
            }));
        }
Beispiel #3
0
 public FulFillResponse Fulfill(FulfillRequest request)
 {
     return(new FulFillResponse
     {
         TransactionId = Guid.NewGuid(),
         Status = request.Amount % 5 == 0 ? Status.Failure : Status.Success
     });
 }
        public async Task <FulfillResponse> Fulfill(FulfillRequest request)
        {
            var content = new StringContent(JsonSerializer.Serialize(request), Encoding.UTF8, "application/json");

            var response = await _client.PostAsync("Payment", content);

            response.EnsureSuccessStatusCode();

            using var responseStream = await response.Content.ReadAsStreamAsync();

            return(await JsonSerializer.DeserializeAsync <FulfillResponse>(responseStream));
        }