public ProcessPaymentResult Process(PaymentProcessingContext context)
        {
            if (String.IsNullOrEmpty(context.CurrencyCode))
            {
                var storeSettings = _settingsService.Get<GlobalSettings>();
                context.CurrencyCode = storeSettings.Currency;
            }

            var settings = context.ProcessorConfig as PayPalConfig;

            var result = CreatePayPalPayment(context, settings);
            var paymentStatus = PaymentStatus.Failed;

            if (result.state == "approved")
            {
                paymentStatus = PaymentStatus.Success;
            }
            else if (result.state == "canceled")
            {
                paymentStatus = PaymentStatus.Cancelled;
            }
            else // expired, failed
            {
                paymentStatus = PaymentStatus.Failed;
            }

            return new ProcessPaymentResult
            {
                PaymentStatus = paymentStatus,
                ThirdPartyTransactionId = result.id
            };
        }
        public ProcessPaymentResult Process(PaymentProcessingContext context)
        {
            if (context.Amount < (decimal)1.19)
                throw new FormatException("Amount cannot be less than € 1,19");

            var settings = context.ProcessorConfig as IDealConfig;

            var instance = CommerceInstance.Current.Name;
            var httpContext = HttpContextAccessor();
            var reportUrl = Strings.AreaName + "/iDeal/Callback?instance=" + instance;
            var returnUrl = Strings.AreaName
                + "/iDeal/Return?instance=" + instance
                + "&paymentId=" + context.Payment.Id
                + "&commerceReturnUrl=" + HttpUtility.UrlEncode(context.ReturnUrl);

            var idealFetch = new IdealFetch(
                settings.PartnerId
                , context.Payment.Description
                , reportUrl.ToFullUrl(httpContext)
                , returnUrl.ToFullUrl(httpContext)
                , ""
                , context.Amount
            );

            if (idealFetch.Error)
                throw new PaymentProcessorException(idealFetch.ErrorMessage);

            return ProcessPaymentResult.Pending(idealFetch.Url, idealFetch.TransactionId);
        }
        private string GetCallbackUrl(string action, PaymentProcessingContext request)
        {
            var instance = CommerceInstance.Current.Name;
            var url = Strings.AreaName + "/Buckaroo/" + action + "?instance=" + instance;
            if (action.StartsWith("return", StringComparison.OrdinalIgnoreCase))
            {
                url += "&commerceReturnUrl=" + HttpUtility.UrlEncode(request.ReturnUrl);
            }

            return url.ToFullUrl(HttpContextAccessor());
        }
        private GatewayRequest CreateGatewayRequest(AuthorizeNetConfig settings, PaymentProcessingContext paymentRequest)
        {
            var request = new CardPresentAuthorizeAndCaptureRequest(
                    paymentRequest.Amount,
                    paymentRequest.Parameters[AuthorizeNetConstants.CreditCardNumber],
                    paymentRequest.Parameters[AuthorizeNetConstants.CreditCardExpireMonth],
                    paymentRequest.Parameters[AuthorizeNetConstants.CreditCardExpireYear]
            );

            request.AddCardCode(paymentRequest.Parameters[AuthorizeNetConstants.CreditCardCvv2]);

            return request;
        }
        public ProcessPaymentResult Process(PaymentProcessingContext context)
        {
            var settings = context.ProcessorConfig as BuckarooConfig;

            var serviceId = context.Parameters[BuckarooConstants.Parameters.ServiceId];

            var parameters = new NameValueCollection();

            parameters.Add("Brq_websitekey", settings.WebsiteKey);
            parameters.Add("Brq_amount", context.Amount.ToString("f2", CultureInfo.InvariantCulture));
            parameters.Add("Brq_invoicenumber", context.Payment.Id.ToString());
            parameters.Add("Brq_currency", context.CurrencyCode);
            parameters.Add("Brq_description", "#" + context.Payment.Description);
            parameters.Add("brq_culture", "en-US");

            parameters.Add("Brq_return", GetCallbackUrl("Return", context));
            parameters.Add("Brq_push", GetCallbackUrl("Push", context));

            parameters.Add("Brq_payment_method", serviceId);
            parameters.Add("Brq_service_" + serviceId + "_action", "Pay");

            parameters.Add("add_paymentId", context.Payment.Id.ToString());

            if (serviceId == BuckarooConstants.Services.SimpleSEPADirectDebit)
            {
                parameters.Add("brq_service_" + serviceId + "_customeraccountname", context.Parameters[BuckarooConstants.Parameters.SEPA_CustomerAccountName]);
                parameters.Add("brq_service_" + serviceId + "_CustomerBIC", context.Parameters[BuckarooConstants.Parameters.SEPA_CustomerBIC]);
                parameters.Add("brq_service_" + serviceId + "_CustomerIBAN", context.Parameters[BuckarooConstants.Parameters.SEPA_CustomerIBAN]);
                parameters.Add("brq_service_" + serviceId + "_MandateReference", settings.CreditDebitMandateReference);
                parameters.Add("brq_service_" + serviceId + "_MandateDate", settings.CreditDebitMandateDate);
            }

            parameters.Add("Brq_signature", BuckarooUtil.GetSignature(parameters, settings.SecretKey));

            // TODO: Check documentation and see how to do this without redirect
            throw new NotImplementedException();
        }
        public ProcessPaymentResult Process(PaymentProcessingContext context)
        {
            var settings = context.ProcessorConfig as AuthorizeNetConfig;

            var authRequest = CreateGatewayRequest(settings, context);
            var gateway = new Gateway(settings.LoginId, settings.TransactionKey, settings.SandboxMode);
            var response = gateway.Send(authRequest, context.Payment.Description);

            var result = new ProcessPaymentResult();

            if (response.Approved)
            {
                result.PaymentStatus = PaymentStatus.Success;
            }
            else
            {
                result.PaymentStatus = PaymentStatus.Failed;
                result.Message = response.ResponseCode + ": " + response.Message;
            }

            result.ThirdPartyTransactionId = response.TransactionID;

            return result;
        }
        private CreditCard CreateCreditCard(PaymentProcessingContext request)
        {
            var card = new CreditCard
            {
                number = request.Parameters[PayPalConstants.CreditCardNumber],
                type = request.Parameters[PayPalConstants.CreditCardType],
                expire_month = Convert.ToInt32(request.Parameters[PayPalConstants.CreditCardExpireMonth]),
                expire_year = Convert.ToInt32(request.Parameters[PayPalConstants.CreditCardExpireYear]),
                cvv2 = request.Parameters[PayPalConstants.CreditCardCvv2]
            };

            // If the website don't pass in customer info,
            // then we try to fill these info automatically
            var orderId = request.Payment.OrderId;
            var order = _orderService.Find(orderId);

            card.first_name = order.Customer.FirstName;
            card.last_name = order.Customer.LastName;

            // TODO: Add billing address

            return card;
        }
 private Transaction CreateTransaction(PaymentProcessingContext request)
 {
     return new Transaction
     {
         amount = new Amount
         {
             total = request.Payment.Amount.ToString("f2", CultureInfo.InvariantCulture),
             currency = request.CurrencyCode
         },
         description = request.Payment.Description
     };
 }
        private PayPalRest.Payment CreatePayPalPayment(PaymentProcessingContext request, PayPalConfig settings)
        {
            var config = new Dictionary<string, string>();
            config.Add("mode", settings.SandboxMode ? "sandbox" : "live");

            var credentials = new OAuthTokenCredential(settings.ClientId, settings.ClientSecret, config);
            var accessToken = credentials.GetAccessToken();
            var payment = new PayPalRest.Payment
            {
                intent = "sale",
                payer = new Payer
                {
                    payment_method = "credit_card",
                    funding_instruments = new List<PayPalRest.FundingInstrument>
                    {
                        new PayPalRest.FundingInstrument
                        {
                            credit_card = CreateCreditCard(request)
                        }
                    }
                },
                transactions = new List<Transaction> { CreateTransaction(request) }
            };

            return payment.Create(new APIContext(accessToken)
            {
                Config = config
            });
        }