public CheckoutResult CheckoutWithPayPalExpressCheckout(Dictionary <string, string> payPalVariables)
        {
            string token   = payPalVariables["token"];
            string payerId = payPalVariables["PayerID"];

            PayPalExpressCheckoutPaymentProvider payPalExpress = new PayPalExpressCheckoutPaymentProvider(storeContext.CurrentStore.GetPaymentProviderConfig(PaymentProviderName.PayPalExpressCheckout));

            int?  orderId      = payPalExpress.GetOrderIdForTransactionToken(token);
            Order pendingOrder = Order.GetOrder(orderId.GetValueOrDefault(-1));

            if (pendingOrder != null)
            {
                PaymentStatusName paymentStatus = payPalExpress.DoExpressCheckoutPayment(pendingOrder, payPalVariables);

                OrderStatusName orderStatus = pendingOrder.OrderStatus;
                if (paymentStatus == PaymentStatusName.Completed)
                {
                    orderStatus = OrderStatusName.Completed;
                    pendingOrder.CreditCardType = CreditCardType.PayPal.ToString();
                }
                UpdateOrderStatus(pendingOrder, orderStatus, paymentStatus);
            }

            return(DoPostCheckoutProcessing(pendingOrder, true));
        }
        /// <summary>
        /// Check for the PayPal Express Checkout return page variables and update the Order if needed.
        /// </summary>
        private void HandlePayPalExpressCallback()
        {
            Dictionary <string, string> payPalVariables = new Dictionary <string, string>();

            if (!string.IsNullOrEmpty(Request.QueryString["token"]) && !string.IsNullOrEmpty(Request.QueryString["PayerID"]))
            {
                string payPalToken = Request.QueryString["token"];
                payPalVariables["token"]   = payPalToken;
                payPalVariables["PayerID"] = Request.QueryString["PayerID"];

                checkoutOrderInfo.PayPalVariables.Merge(payPalVariables);
                checkoutOrderInfo.PaymentProvider = PaymentProviderName.PayPalExpressCheckout;

                PayPalExpressCheckoutPaymentProvider payPalExpressCheckout = new PayPalExpressCheckoutPaymentProvider(StoreContext.CurrentStore.GetPaymentProviderConfig(PaymentProviderName.PayPalExpressCheckout));
                Order pendingOrder = Order.GetOrder(payPalExpressCheckout.GetOrderIdForTransactionToken(payPalToken).GetValueOrDefault(-1));
                if (pendingOrder != null)
                {
                    payPalExpressCheckout.UpdateOrderWithExpressCheckoutDetails(pendingOrder, payPalToken);

                    checkoutOrderInfo.SetBillingAddressFromOrder(pendingOrder);
                    checkoutOrderInfo.SetShippingAddressFromOrder(pendingOrder);

                    //checkoutOrderInfo.ReCalculateOrderTotals();
                }

                UpdateCheckoutSession(checkoutOrderInfo);
            }
        }