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);
        }
Esempio n. 2
0
        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);
        }
Esempio n. 3
0
        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));
        }