public async Task <BankResponse> ExecuteAsync(BankCardRequest bankCardRequest)
        {
            var response = new BankResponse()
            {
                Id = Guid.NewGuid().ToString()
            };

            switch (bankCardRequest.Amount)
            {
            case 100:
                response.Status  = BankResponseStatus.Failed;
                response.Details = "invalid amount";
                break;

            case 200:
                response.Status  = BankResponseStatus.Failed;
                response.Details = "insufficient funds";
                break;

            case 300:
                response.Status  = BankResponseStatus.Failed;
                response.Details = "card blocked";
                break;

            default:
                response.Status  = BankResponseStatus.Success;
                response.Details = "authorised";
                break;
            }

            return(await Task.Run(() => response));
        }
        /// <summary>
        /// Processes a card payment
        /// </summary>
        /// <param name="cardPaymentRequest">payment request from merchant</param>
        /// <param name="merchant">Merchant details</param>
        /// <returns></returns>
        public async Task <CardPaymentResponse> ProcessAsync(CardPaymentRequest cardPaymentRequest, Merchant merchant)
        {
            var cardPaymentContext = _modelConverter.CreateCardPaymentContext(cardPaymentRequest, merchant);

            _logger.LogInformation($"Initiating transaction for {cardPaymentContext.MerchantId} {cardPaymentContext.MerchantReference}");

            //Generate transaction with unique id in pending state
            var transaction = await _transactionService.InitialiseTransactionAsync(cardPaymentContext);

            _logger.LogInformation($"Transaction {transaction.TransactionId} created for {cardPaymentContext.MerchantId} {cardPaymentContext.MerchantReference}");

            var bankCardRequest = new BankCardRequest()
            {
                CardDetail = cardPaymentContext.CardDetail,
                Amount     = cardPaymentContext.Amount,
                Cvv        = cardPaymentRequest.Cvv,
                Reference  = cardPaymentContext.MerchantReference,
                GatewayId  = transaction.TransactionId
            };

            // go to bank and get the response
            var response = await _bankService.ExecuteAsync(bankCardRequest);

            _logger.LogInformation($"Bank response for TId={transaction.TransactionId} Bank [{response.Id} {response.Status}]");

            // Update the transaction with bank response
            var finalTransaction = await _transactionService.UpdateTransactionAsync(transaction.TransactionId, response);

            _logger.LogInformation($"TId={transaction.TransactionId} updated with bank response [{response.Id} {response.Status}]");

            return(_modelConverter.MapToCardPaymentResponse(finalTransaction));
        }
Ejemplo n.º 3
0
 public ActionResult ProcessPayment([FromBody] BankCardRequest request)
 {
     return(Ok(new BankResponse()
     {
         PaymentResponseId = Guid.NewGuid(),
         Message = "SUCCESS"
     }));
 }