public async Task <(bool Success, Payment Data, string Errors)> MakePayment(Payment payment, Guid merchantId) { var validationErrors = string.Join("\n", _businessRulesValidator.Validate(payment)); if (validationErrors.Length > 0) { return(false, payment, validationErrors); } payment.Merchant = new Merchant { MerchantId = merchantId }; await _paymentRepository.Create(payment); // Little silly business rule that allows the choice of payment provider var providerName = (payment.CardNumber.Trim()[0] - '4') > 0 ? "LehmanSisters" : "DebitSuisse"; var paymentProvider = _paymentProviderFactory.Create(providerName); var paymentProcessResults = await paymentProvider.ProcessPayment(payment); payment.Status = paymentProcessResults.Success ? PaymentStatus.Succeeded : PaymentStatus.Failed; payment.Transaction = paymentProcessResults.TranscactionIdentifier; payment.RejectionReasons = string.Join(Environment.NewLine, paymentProcessResults.RejectionReasons); await _paymentRepository.Update(payment); return(paymentProcessResults.Success, payment, payment.RejectionReasons); }
public PaymentServiceMakePaymentTests() { _input = new Payment { Amount = 120.49m, CardNumber = "1234-1234-1234-1234", Currency = Currency.GBP, CVV = 333, ExpiryYear = DateTime.Now.Year + 1, ExpiryMonth = DateTime.Now.Month + 1 }; _paymentProcessResults = new PaymentProcessResults { Success = true, TranscactionIdentifier = "111111111111111", }; _paymentRepository = Substitute.For <IPaymentRepository>(); _paymentProvider = Substitute.For <IPaymentProvider>(); _paymentProviderFactory = Substitute.For <IPaymentProviderFactory>(); _paymentRepository.Create(Arg.Do <Payment>(p => _persistedPayment = p)); _paymentProvider.ProcessPayment(Arg.Any <Payment>()).Returns(_paymentProcessResults); _paymentProviderFactory.Create(Arg.Any <string>()).Returns(_paymentProvider); _target = new PaymentService(_paymentRepository, new BusinessRulesValidator(), _paymentProviderFactory); }
public async Task <IActionResult> Confirm(Guid paymentId) { if (paymentId == Guid.Empty) { VerifyGatewayResult failModel = VerifyGatewayResult.Failed("Ödeme bilgisi geçersiz."); return(View("Fail", failModel)); } //get transaction by identifier PaymentTransaction payment = await _paymentService.GetByOrderNumber(paymentId); if (payment == null) { VerifyGatewayResult failModel = VerifyGatewayResult.Failed("Ödeme bilgisi geçersiz."); return(View("Fail", failModel)); } PaymentGatewayRequest bankRequest = JsonConvert.DeserializeObject <PaymentGatewayRequest>(payment.BankRequest); if (bankRequest == null) { VerifyGatewayResult failModel = VerifyGatewayResult.Failed("Ödeme bilgisi geçersiz."); return(View("Fail", failModel)); } if (!IPAddress.TryParse(bankRequest.CustomerIpAddress, out IPAddress ipAddress)) { bankRequest.CustomerIpAddress = HttpContext.Connection.RemoteIpAddress.ToString(); } if (bankRequest.CustomerIpAddress == "::1") { bankRequest.CustomerIpAddress = "127.0.0.1"; } IPaymentProvider provider = _paymentProviderFactory.Create(bankRequest.BankName); //set callback url bankRequest.CallbackUrl = new Uri($"{Request.GetHostUrl(false)}{Url.RouteUrl("Callback", new { paymentId = payment.OrderNumber })}"); //gateway request PaymentGatewayResult gatewayResult = await provider.ThreeDGatewayRequest(bankRequest); //check result status if (!gatewayResult.Success) { VerifyGatewayResult failModel = VerifyGatewayResult.Failed(gatewayResult.ErrorMessage); return(View("Fail", failModel)); } //html content if (gatewayResult.HtmlContent) { return(View(model: gatewayResult.HtmlFormContent)); } //create form submit with parameters string model = _paymentProviderFactory.CreatePaymentFormHtml(gatewayResult.Parameters, gatewayResult.GatewayUrl); return(View(model: model)); }