/// <summary>
        /// Process a payment
        /// </summary>
        /// <param name="processPaymentRequest">Payment info required for an order processing</param>
        /// <returns>Process payment result</returns>
        public ProcessPaymentResult ProcessPayment(ProcessPaymentRequest processPaymentRequest)
        {
            var                      result                   = new ProcessPaymentResult();
            TokenResponse            tokenResponse            = null;
            PaymentExecutionResponse paymentExecutionResponse = null;

            var storeScope = GetActiveStoreScopeConfiguration(_storeService, _workContext);
            var payPalPlusBrasilPaymentSettings = _settingService.LoadSetting <PayPalPlusBrasilPaymentSettings>(storeScope);

            string username = payPalPlusBrasilPaymentSettings.RestAPIClientId;
            string password = payPalPlusBrasilPaymentSettings.RestAPISecrect;

            var payerIdPayPal = processPaymentRequest.CustomValues["PayerIdPayPal"].ToString();

            var paymentIdPayPal = processPaymentRequest.CustomValues["PaymentIdPayPal"].ToString();

            var paymentCreationMessage = new PaymentCreationMessage()
            {
                PayerId = payerIdPayPal
            };

            using (var token = new Token(payPalPlusBrasilPaymentSettings.UseSandbox))
            {
                tokenResponse = token.CreateAsync(username, password).ConfigureAwait(false).GetAwaiter().GetResult();
            }

            using (var paymentExecution = new PaymentExecution(payPalPlusBrasilPaymentSettings.UseSandbox))
            {
                paymentExecutionResponse = paymentExecution.CreateAsync(paymentCreationMessage, paymentIdPayPal, tokenResponse.AcessToken).ConfigureAwait(false).GetAwaiter().GetResult();
            }

            SalePaymentExecution SalePaymentExecution = GetSalePaymentExecution(paymentExecutionResponse);

            string stateExecution = SalePaymentExecution.State;

            if (stateExecution == "completed")
            {
                result.AuthorizationTransactionId = SalePaymentExecution.Id;

                result.NewPaymentStatus = PaymentStatus.Paid;
            }
            else
            {
                result.AuthorizationTransactionId = SalePaymentExecution.Id;

                result.NewPaymentStatus = PaymentStatus.Pending;
            }

            return(result);
        }
 private SalePaymentExecution GetSalePaymentExecution(PaymentExecutionResponse executionResponse)
 {
     return(executionResponse.Transactions[0].RelatedResources[0].Sale);
 }