/// <summary> /// Process Payment Request by sending request to acquiring Bank /// </summary> /// <param name="request">Payment request to send</param> /// <returns>Processed response from bank</returns> public async Task <PaymentResponse> ProcessAsync(PaymentRequest request) { if (await _paymentValidator.ValidateAsync(request)) { PaymentResponse response = await _billingAdapter.SendRequestAsync(request); if (response != null) { await _repository.SavePaymentRecordAsync(new PaymentRecord() { ExternalID = request.ExternalID, BillingID = response.BillingTransactionID, Amount = request.Amount, CardExpirationMonth = request.ExpiryMonth, CardExpirationYear = request.ExpiryYear, CardNumber = _encryptor.Encrypt(request.CardNumber), CurrencyCode = request.CurrencyCode, CVV = request.Cvv, BillingSuccess = response.Success }); } return(await Task.FromResult(response)); } else { throw new ApiException("Validation failed", "500"); } }
public async Task <ActionResult> Post([FromBody] Payment payment) { if (payment == null) { return(BadRequest()); } var validationResult = await _paymentValidator.ValidateAsync(payment); if (!validationResult.IsValid) { return(Ok(new PaymentGatewayResult { Success = false, Errors = validationResult.Errors.Select(x => x.ErrorMessage).ToList() })); } var paymentResult = await _paymentGatewayService.Save(payment); if (paymentResult.PaymentStatus != PaymentStatus.Successful) { //Perhaps you could output the reason here for the user but for now a generic message return(Ok(new PaymentGatewayResult { Success = false, Errors = new List <string>() { Resources.PaymentUnsuccessful } })); } return(Ok(new { Success = true })); }