Exemplo n.º 1
0
        private void HandleChargebackAmountNotification(ChargebackAmountNotification notification)
        {
            NotificationSerialNumber = notification.serialnumber;

            string providerName = GoogleCheckoutLog.GetProviderNameFromOrderNumber(notification.googleordernumber);

            if (providerName.Length > 0)
            {
                GCheckoutNotificationHandlerProvider provider
                    = GCheckoutNotificationManager.Providers[providerName];

                if (provider != null)
                {
                    provider.HandleChargebackAmountNotification(RequestXml, notification);

                    return;
                }
            }

            // if no provider found just log it
            SiteSettings siteSettings = CacheHelper.GetCurrentSiteSettings();

            GoogleCheckoutLog gLog = new GoogleCheckoutLog();

            gLog.SiteGuid         = siteSettings.SiteGuid;
            gLog.NotificationType = "ChargebackAmountNotification";
            gLog.RawResponse      = RequestXml;
            gLog.SerialNumber     = notification.serialnumber;
            gLog.OrderNumber      = notification.googleordernumber;
            gLog.GTimestamp       = notification.timestamp;
            gLog.LatestChargeback = notification.latestchargebackamount.Value;
            gLog.TotalChargeback  = notification.totalchargebackamount.Value;

            gLog.Save();
        }
Exemplo n.º 2
0
        private void HandleRiskInformationNotification(RiskInformationNotification notification)
        {
            NotificationSerialNumber = notification.serialnumber;

            string providerName = GoogleCheckoutLog.GetProviderNameFromOrderNumber(notification.googleordernumber);

            if (providerName.Length > 0)
            {
                GCheckoutNotificationHandlerProvider provider
                    = GCheckoutNotificationManager.Providers[providerName];

                if (provider != null)
                {
                    provider.HandleRiskInformationNotification(RequestXml, notification);

                    return;
                }
            }

            // if no provider found just log it
            SiteSettings siteSettings = CacheHelper.GetCurrentSiteSettings();

            GoogleCheckoutLog gLog = new GoogleCheckoutLog();

            gLog.SiteGuid         = siteSettings.SiteGuid;
            gLog.RawResponse      = RequestXml;
            gLog.NotificationType = "RiskInformationNotification";
            gLog.SerialNumber     = notification.serialnumber;
            gLog.OrderNumber      = notification.googleordernumber;
            gLog.GTimestamp       = notification.timestamp;
            gLog.AvsResponse      = notification.riskinformation.avsresponse;
            gLog.CvnResponse      = notification.riskinformation.cvnresponse;
            gLog.BuyerId          = notification.riskinformation.ipaddress;
            gLog.Save();
        }
Exemplo n.º 3
0
        private void BindGridForCart()
        {
            if (cartGuid == Guid.Empty) 
            {
                pgrGoogleCheckoutLog.Visible = false;
                return; 
            }

            using(IDataReader reader = GoogleCheckoutLog.GetPageByCart(
                    cartGuid,
                    pageNumber,
                    pageSize,
                    out totalPages))
           {
            
                if (this.totalPages > 1)
                {

                    string pageUrl = Page.Request.CurrentExecutionFilePath
                        + "?pageid=" + pageId.ToString(CultureInfo.InvariantCulture)
                        + "&mid=" + moduleId.ToString(CultureInfo.InvariantCulture)
                        + "&pagenumber={0}";

                    pgrGoogleCheckoutLog.PageURLFormat = pageUrl;
                    pgrGoogleCheckoutLog.ShowFirstLast = true;
                    pgrGoogleCheckoutLog.CurrentIndex = pageNumber;
                    pgrGoogleCheckoutLog.PageSize = pageSize;
                    pgrGoogleCheckoutLog.PageCount = totalPages;

                }
                else
                {
                    pgrGoogleCheckoutLog.Visible = false;
                }

                grdGoogleCheckoutLog.PageIndex = pageNumber;
                grdGoogleCheckoutLog.PageSize = pageSize;
                grdGoogleCheckoutLog.DataSource = reader;
                grdGoogleCheckoutLog.DataBind();
                
            }
        

            if (grdGoogleCheckoutLog.Rows.Count == 0)
            {
                this.Visible = false;
            }

        }
        public override void HandleRefundAmountNotification(
            string requestXml,
            RefundAmountNotification notification)
        {
            GoogleCheckoutLog gLog = new GoogleCheckoutLog();

            gLog.ProviderName     = "WebStoreGCheckoutNotificationHandlerProvider";
            gLog.NotificationType = "RefundAmountNotification";
            gLog.RawResponse      = requestXml;
            gLog.SerialNumber     = notification.serialnumber;
            gLog.OrderNumber      = notification.googleordernumber;
            gLog.GTimestamp       = notification.timestamp;

            gLog.LatestRefundAmt = notification.latestrefundamount.Value;
            gLog.TotalRefundAmt  = notification.totalrefundamount.Value;


            gLog.Save();

            Guid orderGuid = GoogleCheckoutLog.GetCartGuidFromOrderNumber(notification.googleordernumber);

            if (orderGuid == Guid.Empty)
            {
                return;
            }

            Order order = new Order(orderGuid);

            if (order.OrderGuid != orderGuid)
            {
                return;
            }

            Store store = new Store(order.StoreGuid);

            if (store.Guid != order.StoreGuid)
            {
                return;
            }

            gLog.SiteGuid  = store.SiteGuid;
            gLog.UserGuid  = order.UserGuid;
            gLog.CartGuid  = order.OrderGuid;
            gLog.StoreGuid = order.StoreGuid;
            gLog.Save();
        }
        public override void HandleAuthorizationAmountNotification(
            string requestXml,
            AuthorizationAmountNotification notification)
        {
            GoogleCheckoutLog gLog = new GoogleCheckoutLog();

            gLog.ProviderName     = "WebStoreGCheckoutNotificationHandlerProvider";
            gLog.NotificationType = "AuthorizationAmountNotification";
            gLog.RawResponse      = requestXml;
            gLog.SerialNumber     = notification.serialnumber;
            gLog.OrderNumber      = notification.googleordernumber;
            gLog.GTimestamp       = notification.timestamp;
            gLog.AuthAmt          = notification.authorizationamount.Value;
            gLog.AuthExpDate      = notification.authorizationexpirationdate;
            gLog.CvnResponse      = notification.cvnresponse;
            gLog.AvsResponse      = notification.avsresponse;

            gLog.Save();

            Guid orderGuid = GoogleCheckoutLog.GetCartGuidFromOrderNumber(notification.googleordernumber);

            if (orderGuid == Guid.Empty)
            {
                return;
            }

            Order order = new Order(orderGuid);

            if (order.OrderGuid != orderGuid)
            {
                return;
            }

            Store store = new Store(order.StoreGuid);

            if (store.Guid != order.StoreGuid)
            {
                return;
            }

            gLog.SiteGuid  = store.SiteGuid;
            gLog.UserGuid  = order.UserGuid;
            gLog.CartGuid  = order.OrderGuid;
            gLog.StoreGuid = order.StoreGuid;
            gLog.Save();
        }
        public override void HandleRiskInformationNotification(
            string requestXml,
            RiskInformationNotification notification)
        {
            GoogleCheckoutLog gLog = new GoogleCheckoutLog();

            gLog.ProviderName     = "WebStoreGCheckoutNotificationHandlerProvider";
            gLog.RawResponse      = requestXml;
            gLog.NotificationType = "RiskInformationNotification";
            gLog.SerialNumber     = notification.serialnumber;
            gLog.OrderNumber      = notification.googleordernumber;
            gLog.GTimestamp       = notification.timestamp;
            gLog.AvsResponse      = notification.riskinformation.avsresponse;
            gLog.CvnResponse      = notification.riskinformation.cvnresponse;
            gLog.BuyerId          = notification.riskinformation.ipaddress;
            gLog.Save();

            Guid orderGuid = GoogleCheckoutLog.GetCartGuidFromOrderNumber(notification.googleordernumber);

            if (orderGuid == Guid.Empty)
            {
                return;
            }

            Order order = new Order(orderGuid);

            if (order.OrderGuid != orderGuid)
            {
                return;
            }

            Store store = new Store(order.StoreGuid);

            if (store.Guid != order.StoreGuid)
            {
                return;
            }

            gLog.SiteGuid  = store.SiteGuid;
            gLog.UserGuid  = order.UserGuid;
            gLog.CartGuid  = order.OrderGuid;
            gLog.StoreGuid = order.StoreGuid;
            gLog.Save();
        }
Exemplo n.º 7
0
        private void HandleNewOrderNotificationExtended(NewOrderNotificationExtended newOrder)
        {
            NotificationSerialNumber = newOrder.serialnumber;

            string       merchantDataString = GetMerchantData(newOrder.shoppingcart.merchantprivatedata.Any);
            MerchantData merchantData       = DeserializeMerchantData(merchantDataString);

            if (merchantData != null)
            {
                GCheckoutNotificationHandlerProvider provider
                    = GCheckoutNotificationManager.Providers[merchantData.ProviderName];

                if (provider != null)
                {
                    provider.HandleNewOrderNotificationExtended(RequestXml, newOrder, merchantData);

                    return;
                }
            }


            // if no providers found just log it
            SiteSettings siteSettings = CacheHelper.GetCurrentSiteSettings();

            GoogleCheckoutLog gLog = new GoogleCheckoutLog();

            gLog.SiteGuid         = siteSettings.SiteGuid;
            gLog.RawResponse      = RequestXml;
            gLog.NotificationType = "NewOrderNotification";
            gLog.SerialNumber     = newOrder.serialnumber;
            gLog.OrderNumber      = newOrder.googleordernumber;
            gLog.OrderTotal       = newOrder.ordertotal.Value;
            gLog.BuyerId          = newOrder.buyerid.ToString(CultureInfo.InvariantCulture);
            gLog.FullfillState    = newOrder.fulfillmentorderstate.ToString();
            gLog.FinanceState     = newOrder.financialorderstate.ToString();
            gLog.ShippingTotal    = newOrder.ShippingCost;
            gLog.TaxTotal         = newOrder.orderadjustment.totaltax.Value;
            //gLog.DiscountTotal = ext.orderadjustment.adjustmenttotal.Value;
            gLog.EmailListOptIn = newOrder.buyermarketingpreferences.emailallowed;
            gLog.GTimestamp     = newOrder.timestamp;
            gLog.CartXml        = merchantDataString;
            gLog.Save();
        }
Exemplo n.º 8
0
        private void HandleOrderStateChangeNotification(OrderStateChangeNotification notification)
        {
            NotificationSerialNumber = notification.serialnumber;

            string providerName = GoogleCheckoutLog.GetProviderNameFromOrderNumber(notification.googleordernumber);

            if (providerName.Length > 0)
            {
                GCheckoutNotificationHandlerProvider provider
                    = GCheckoutNotificationManager.Providers[providerName];

                if (provider != null)
                {
                    provider.HandleOrderStateChangeNotification(RequestXml, notification);

                    return;
                }
            }


            // if no provider found just log it
            log.Info("No GCheckoutNotification Provider found for google order " + notification.googleordernumber + " so just logging it");

            Guid orderGuid = GoogleCheckoutLog.GetCartGuidFromOrderNumber(notification.googleordernumber);

            SiteSettings siteSettings = CacheHelper.GetCurrentSiteSettings();

            GoogleCheckoutLog gLog = new GoogleCheckoutLog();

            gLog.SiteGuid         = siteSettings.SiteGuid;
            gLog.RawResponse      = RequestXml;
            gLog.NotificationType = "OrderStateChangeNotification";
            gLog.SerialNumber     = notification.serialnumber;
            gLog.OrderNumber      = notification.googleordernumber;
            gLog.FinanceState     = notification.newfinancialorderstate.ToString();
            gLog.FullfillState    = notification.newfulfillmentorderstate.ToString();
            gLog.GTimestamp       = notification.timestamp;
            gLog.AvsResponse      = notification.reason;
            gLog.CartGuid         = orderGuid;

            gLog.Save();
        }
Exemplo n.º 9
0
        private void HandleAuthorizationAmountNotification(AuthorizationAmountNotification notification)
        {
            NotificationSerialNumber = notification.serialnumber;

            string providerName = GoogleCheckoutLog.GetProviderNameFromOrderNumber(notification.googleordernumber);

            if (providerName.Length > 0)
            {
                GCheckoutNotificationHandlerProvider provider
                    = GCheckoutNotificationManager.Providers[providerName];

                if (provider != null)
                {
                    provider.HandleAuthorizationAmountNotification(RequestXml, notification);

                    return;
                }
            }

            // if no provider found just log it
            SiteSettings siteSettings = CacheHelper.GetCurrentSiteSettings();

            GoogleCheckoutLog gLog = new GoogleCheckoutLog();

            gLog.SiteGuid         = siteSettings.SiteGuid;
            gLog.NotificationType = "AuthorizationAmountNotification";
            gLog.RawResponse      = RequestXml;
            gLog.SerialNumber     = notification.serialnumber;
            gLog.OrderNumber      = notification.googleordernumber;
            gLog.GTimestamp       = notification.timestamp;
            gLog.AuthAmt          = notification.authorizationamount.Value;
            gLog.AuthExpDate      = notification.authorizationexpirationdate;
            gLog.CvnResponse      = notification.cvnresponse;
            gLog.AvsResponse      = notification.avsresponse;

            gLog.Save();
        }
Exemplo n.º 10
0
        private void ProcessOrder(
            Cart cart,
            Store store,
            WorldPayPaymentResponse wpResponse,
            PayPalLog worldPayLog,
            Page page)
        {
            // process the cart into an order then
            // return an html order result template for use at world pay



            cart.DeSerializeCartOffers();

            if (wpResponse.CompName.Length > 0)
            {
                cart.OrderInfo.CustomerCompany = wpResponse.CompName;
            }
            if (wpResponse.Address1.Length > 0)
            {
                cart.OrderInfo.CustomerAddressLine1 = wpResponse.Address1;
            }

            if (wpResponse.Address2.Length > 0)
            {
                cart.OrderInfo.CustomerAddressLine2 = wpResponse.Address2;
            }

            if (wpResponse.Address3.Length > 0)
            {
                cart.OrderInfo.CustomerAddressLine2 += " " + wpResponse.Address3;
            }

            if (wpResponse.Town.Length > 0)
            {
                cart.OrderInfo.CustomerCity = wpResponse.Town;
            }
            //cart.OrderInfo.DeliveryFirstName = wpResponse.Name;
            if (
                (wpResponse.Name.Length > 0) &&
                ((cart.OrderInfo.CustomerLastName.Length == 0) || (!wpResponse.Name.Contains((cart.OrderInfo.CustomerLastName))))
                )
            {
                cart.OrderInfo.CustomerLastName = wpResponse.Name; // this is full name
            }
            if (wpResponse.Postcode.Length > 0)
            {
                cart.OrderInfo.CustomerPostalCode = wpResponse.Postcode;
            }
            if (wpResponse.Region.Length > 0)
            {
                cart.OrderInfo.CustomerState = wpResponse.Region;
            }
            if (wpResponse.Country.Length > 0)
            {
                cart.OrderInfo.CustomerCountry = wpResponse.Country;
            }

            if (wpResponse.Tel.Length > 0)
            {
                cart.OrderInfo.CustomerTelephoneDay = wpResponse.Tel;
            }

            if (wpResponse.Email.Length > 0)
            {
                cart.OrderInfo.CustomerEmail = wpResponse.Email;
            }

            cart.CopyCustomerToBilling();
            cart.CopyCustomerToShipping();
            //cart.TaxTotal = taxAmount;
            //cart.OrderTotal = grossAmount;
            //if (shippingAmount > 0)
            //{
            //    cart.ShippingTotal = shippingAmount;
            //}

            StoreHelper.EnsureUserForOrder(cart);

            cart.Save();

            Order order = Order.CreateOrder(
                store,
                cart,
                wpResponse.TransId,
                wpResponse.TransId,
                string.Empty,
                wpResponse.Currency,
                "WorldPay",
                OrderStatus.OrderStatusFulfillableGuid);

            // grab the return url before we delete the un-needed logs
            string orderDetailUrl = worldPayLog.ReturnUrl;
            string storePageUrl   = worldPayLog.RawResponse;

            // remove any previous logs
            GoogleCheckoutLog.DeleteByCart(order.OrderGuid);
            PayPalLog.DeleteByCart(order.OrderGuid);

            // create a final log that has the serialized reposnse from worldpay rather than the serialized cart
            worldPayLog               = new PayPalLog();
            worldPayLog.SiteGuid      = store.SiteGuid;
            worldPayLog.StoreGuid     = store.Guid;
            worldPayLog.CartGuid      = order.OrderGuid;
            worldPayLog.UserGuid      = order.UserGuid;
            worldPayLog.ProviderName  = "WebStoreWorldPayResponseHandler";
            worldPayLog.RequestType   = "WorldPay";
            worldPayLog.PaymentStatus = "Paid";
            worldPayLog.PaymentType   = "WorldPay";
            worldPayLog.CartTotal     = order.OrderTotal;
            worldPayLog.PayPalAmt     = wpResponse.AuthAmount;
            worldPayLog.TransactionId = wpResponse.TransId;
            worldPayLog.CurrencyCode  = wpResponse.Currency;
            worldPayLog.ReasonCode    = wpResponse.AVS;
            worldPayLog.RawResponse   = SerializationHelper.SerializeToString(wpResponse);
            worldPayLog.CreatedUtc    = DateTime.UtcNow;
            worldPayLog.ReturnUrl     = orderDetailUrl;
            worldPayLog.Save();


            try
            {
                StoreHelper.ConfirmOrder(store, order);
            }
            catch (Exception ex)
            {
                log.Error("error sending confirmation email", ex);
            }

            // retrun the html

            if (config.WorldPayProduceShopperResponse)
            {
                CultureInfo currencyCulture = ResourceHelper.GetCurrencyCulture(wpResponse.Currency);

                string        htmlTemplate = ResourceHelper.GetMessageTemplate(CultureInfo.CurrentUICulture, config.WorldPayShopperResponseTemplate);
                StringBuilder finalOutput  = new StringBuilder();
                finalOutput.Append(htmlTemplate);
                finalOutput.Replace("#WorldPayBannerToken", "<WPDISPLAY ITEM=banner>"); //required by worldpay
                finalOutput.Replace("#CustomerName", wpResponse.Name);
                finalOutput.Replace("#StoreName", store.Name);
                finalOutput.Replace("#OrderId", order.OrderGuid.ToString());
                finalOutput.Replace("#StorePageLink", "<a href='" + storePageUrl + "'>" + storePageUrl + "</a>");
                finalOutput.Replace("#OrderDetailLink", "<a href='" + orderDetailUrl + "'>" + orderDetailUrl + "</a>");


                StringBuilder orderDetails = new StringBuilder();
                DataSet       dsOffers     = Order.GetOrderOffersAndProducts(store.Guid, order.OrderGuid);

                foreach (DataRow row in dsOffers.Tables["Offers"].Rows)
                {
                    string og = row["OfferGuid"].ToString();
                    orderDetails.Append(row["Name"].ToString() + " ");
                    orderDetails.Append(row["Quantity"].ToString() + " @ ");
                    orderDetails.Append(string.Format(currencyCulture, "{0:c}", Convert.ToDecimal(row["OfferPrice"])));
                    orderDetails.Append("<br />");

                    string   whereClause = string.Format("OfferGuid = '{0}'", og);
                    DataView dv          = new DataView(dsOffers.Tables["Products"], whereClause, "", DataViewRowState.CurrentRows);

                    if (dv.Count > 1)
                    {
                        foreach (DataRow r in dsOffers.Tables["Products"].Rows)
                        {
                            string pog = r["OfferGuid"].ToString();
                            if (og == pog)
                            {
                                orderDetails.Append(r["Name"].ToString() + " ");
                                orderDetails.Append(r["Quantity"].ToString() + "  <br />");
                            }
                        }
                    }
                }

                finalOutput.Replace("#OrderDetails", orderDetails.ToString());
                page.Response.Write(finalOutput.ToString());
                page.Response.Flush();
            }
        }
Exemplo n.º 11
0
        private void btnMakePayment_Click(object sender, EventArgs e)
        {
            if (store != null && cart != null && IsValidForCheckout())
            {
                IPaymentGateway gateway = commerceConfig.GetDirectPaymentGateway();

                if (gateway == null)
                {
                    lblMessage.Text        = WebStoreResources.PaymentGatewayNotConfiguredForDirectCardProcessing;
                    btnMakePayment.Enabled = false;

                    return;
                }

                gateway.MerchantInvoiceNumber = cart.CartGuid.ToString("N");

                var cartItems = new List <string>();

                foreach (var cartOffer in cart.CartOffers)
                {
                    cartItems.Add($"({cartOffer.Quantity}x) {cartOffer.Name} {cartOffer.OfferPrice.ToString("c", currencyCulture)} (GUID: {cartOffer.OfferGuid:N})");
                }

                gateway.MerchantTransactionDescription = string.Join("\n", cartItems);

                gateway.CardType         = ddCardType.SelectedValue;
                gateway.CardNumber       = txtCardNumber.Text;
                gateway.CardExpiration   = ddExpireMonth.SelectedValue + ddExpireYear.SelectedValue;
                gateway.ChargeTotal      = cart.OrderTotal;
                gateway.CardSecurityCode = txtCardSecurityCode.Text;

                gateway.CardOwnerFirstName = txtCardOwnerFirstName.Text;
                gateway.CardOwnerLastName  = txtCardOwnerLastName.Text;

                gateway.CardOwnerCompanyName = cart.OrderInfo.BillingCompany;
                gateway.CardBillingAddress   = cart.OrderInfo.BillingAddress1 + " " + cart.OrderInfo.BillingAddress2;

                gateway.CardBillingCity       = cart.OrderInfo.BillingCity;
                gateway.CardBillingState      = cart.OrderInfo.BillingState;
                gateway.CardBillingPostalCode = cart.OrderInfo.BillingPostalCode;
                gateway.CardBillingCountry    = cart.OrderInfo.BillingCountry;

                gateway.CardBillingCountryCode = cart.OrderInfo.BillingCountry;

                gateway.CardBillingPhone  = cart.OrderInfo.CustomerTelephoneDay;
                gateway.CustomerIPAddress = SiteUtils.GetIP4Address();
                gateway.CurrencyCulture   = currencyCulture;

                // this is where the actual request is made, it can timeout here
                bool executed;

                try
                {
                    executed = gateway.ExecuteTransaction();
                }
                catch (WebException ex)
                {
                    if (commerceConfig.PaymentGatewayUseTestMode)
                    {
                        lblMessage.Text = ex.Message;
                    }
                    else
                    {
                        lblMessage.Text = WebStoreResources.PaymentGatewayCouldNotConnectMessage;
                    }

                    return;
                }

                var serializedCart = string.Empty;

                gateway.LogTransaction(
                    siteSettings.SiteGuid,
                    store.ModuleGuid,
                    store.Guid,
                    cart.CartGuid,
                    cart.UserGuid,
                    string.Empty,
                    "WebStoreCheckout",
                    serializedCart
                    );

                if (executed)
                {
                    switch (gateway.Response)
                    {
                    case PaymentGatewayResponse.Approved:
                        cart.LastUserActivity          = DateTime.UtcNow;
                        cart.OrderInfo.CompletedFromIP = SiteUtils.GetIP4Address();
                        cart.OrderInfo.Completed       = DateTime.UtcNow;
                        StoreHelper.EnsureUserForOrder(cart);
                        cart.Save();

                        Order order = Order.CreateOrder(store, cart, gateway, siteSettings.GetCurrency().Code, "CreditCard");
                        StoreHelper.ClearCartCookie(cart.StoreGuid);

                        // send confirmation email
                        try
                        {
                            // this also happens in StoreHelper.ConfirmOrder
                            StoreHelper.ConfirmOrder(store, order);
                            PayPalLog.DeleteByCart(order.OrderGuid);
                            GoogleCheckoutLog.DeleteByCart(order.OrderGuid);
                        }
                        catch (Exception ex)
                        {
                            log.Error("error sending confirmation email", ex);
                        }

                        // redirect to order details
                        string redirectUrl = SiteRoot +
                                             "/WebStore/OrderDetail.aspx?pageid="
                                             + pageId.ToInvariantString()
                                             + "&mid=" + moduleId.ToInvariantString()
                                             + "&orderid=" + order.OrderGuid.ToString();

                        //TODO: if we charged a card here we can safely delete any paypal log or googlecheckout logs
                        // need methods to delete those by carguid

                        if (WebStoreConfiguration.LogCardTransactionStatus)
                        {
                            log.Info("accepted transaction " + gateway.ChargeTotal.ToString("c") + " " + gateway.ResponseCode + " " + gateway.ResponseReason);
                        }

                        WebUtils.SetupRedirect(this, redirectUrl);

                        return;

                    case PaymentGatewayResponse.Declined:

                        lblMessage.Text = WebStoreResources.TransactionDeclinedMessage;

                        if (WebStoreConfiguration.LogCardTransactionStatus || WebStoreConfiguration.LogCardFailedTransactionStatus)
                        {
                            log.Info("declined transaction " + gateway.ChargeTotal.ToString("c") + " " + gateway.ResponseCode + " " + gateway.ResponseReason);
                        }

                        break;

                    case PaymentGatewayResponse.Error:

                        if (gateway.UseTestMode)
                        {
                            if (gateway.LastExecutionException != null)
                            {
                                lblMessage.Text = gateway.LastExecutionException.ToString();
                            }
                            else
                            {
                                // TODO: should not show user real messages? Mask CCNumber and login credentials in the gateways RawResponse property ... those shouldn't be logged either
                                lblMessage.Text = gateway.RawResponse;
                            }
                        }
                        else
                        {
                            lblMessage.Text = WebStoreResources.TransactionErrorMessage;

                            if (WebStoreConfiguration.LogCardTransactionStatus || WebStoreConfiguration.LogCardFailedTransactionStatus)
                            {
                                if (gateway.LastExecutionException != null)
                                {
                                    log.Info("transaction error " + gateway.LastExecutionException.ToString());
                                }
                            }
                        }

                        break;

                    case PaymentGatewayResponse.NoRequestInitiated:

                        lblMessage.Text = WebStoreResources.TransactionNotInitiatedMessage;

                        break;
                    }
                }
                else
                {
                    lblMessage.Text = WebStoreResources.TransactionNotInitiatedMessage + (!string.IsNullOrEmpty(gateway.ResponseReason) ? "<br>" + gateway.ResponseReason : string.Empty);

                    if (gateway.LastExecutionException != null)
                    {
                        if (commerceConfig.PaymentGatewayUseTestMode)
                        {
                            lblMessage.Text = gateway.LastExecutionException.ToString();
                        }
                    }
                }
            }

            btnMakePayment.Text = WebStoreResources.PaymentButton;
        }
Exemplo n.º 12
0
        private void btnMakePayment_Click(object sender, System.EventArgs e)
        {
            //Page.Validate();

            if (
                (store != null) &&
                (cart != null) &&
                (IsValidForCheckout())
                )
            {
                IPaymentGateway gateway = commerceConfig.GetDirectPaymentGateway();
                if (gateway == null)
                {
                    lblMessage.Text        = WebStoreResources.PaymentGatewayNotConfiguredForDirectCardProcessing;
                    btnMakePayment.Enabled = false;
                    return;
                }
                //if (gateway is PlugNPayPaymentGateway)
                //{
                gateway.MerchantInvoiceNumber = cart.CartGuid.ToString("N");
                string CartItems = "";
                int    itemnum   = 0;
                foreach (CartOffer coffer in cart.CartOffers)
                {
                    itemnum++;
                    CartItems += string.Format("&item{1}={0}&cost{1}={2}&description{1}={3}&quantity{1}={4}", coffer.OfferGuid, itemnum, coffer.OfferPrice, coffer.Name, coffer.Quantity);
                }
                gateway.MerchantTransactionDescription = CartItems;     //not sure if this is the intended purpose or not
                //}

                gateway.CardType         = ddCardType.SelectedValue;
                gateway.CardNumber       = txtCardNumber.Text;
                gateway.CardExpiration   = ddExpireMonth.SelectedValue + ddExpireYear.SelectedValue;
                gateway.ChargeTotal      = cart.OrderTotal;
                gateway.CardSecurityCode = txtCardSecurityCode.Text;

                gateway.CardOwnerFirstName = txtCardOwnerFirstName.Text;
                gateway.CardOwnerLastName  = txtCardOwnerLastName.Text;

                gateway.CardOwnerCompanyName = cart.OrderInfo.BillingCompany;
                gateway.CardBillingAddress   = cart.OrderInfo.BillingAddress1
                                               + " " + cart.OrderInfo.BillingAddress2;

                gateway.CardBillingCity       = cart.OrderInfo.BillingCity;
                gateway.CardBillingState      = cart.OrderInfo.BillingState;
                gateway.CardBillingPostalCode = cart.OrderInfo.BillingPostalCode;
                gateway.CardBillingCountry    = cart.OrderInfo.BillingCountry;


                gateway.CardBillingCountryCode = cart.OrderInfo.BillingCountry;

                gateway.CardBillingPhone  = cart.OrderInfo.CustomerTelephoneDay;
                gateway.CustomerIPAddress = SiteUtils.GetIP4Address();
                gateway.CurrencyCulture   = currencyCulture;

                // this is where the actual request is made, it can timeout here
                bool executed = false;
                try
                {
                    executed = gateway.ExecuteTransaction();
                }
                catch (WebException ex)
                {
                    if (commerceConfig.PaymentGatewayUseTestMode)
                    {
                        lblMessage.Text = ex.Message;
                    }
                    else
                    {
                        lblMessage.Text = WebStoreResources.PaymentGatewayCouldNotConnectMessage;
                    }
                    return;
                }

                string serializedCart = string.Empty;

                gateway.LogTransaction(
                    siteSettings.SiteGuid,
                    store.ModuleGuid,
                    store.Guid,
                    cart.CartGuid,
                    cart.UserGuid,
                    string.Empty,
                    "WebStoreCheckout",
                    serializedCart);

                //if (gateway is PayPalDirectPaymentGateway)
                //{
                //    // this is capturing of the serialized cart is not needed for other providers and I'm not sure its even needed for PayPal Direct
                //    // it was needed for other paypal solutions. I just don't want to remove it until I'm sure
                //    cart.SerializeCartOffers();
                //    serializedCart = SerializationHelper.SerializeToString(cart);

                //    gateway.LogTransaction(
                //        siteSettings.SiteGuid,
                //        store.ModuleGuid,
                //        store.Guid,
                //        cart.CartGuid,
                //        cart.UserGuid,
                //        "WebStorePayPalDirect",
                //        "DirectPayment",
                //        serializedCart);

                //}
                //else
                //{
                //    gateway.LogTransaction(
                //        siteSettings.SiteGuid,
                //        store.ModuleGuid,
                //        store.Guid,
                //        cart.CartGuid,
                //        cart.UserGuid,
                //        string.Empty,
                //        "WebStoreCheckout",
                //        serializedCart);
                //}


                if (executed)
                {
                    switch (gateway.Response)
                    {
                    case PaymentGatewayResponse.Approved:
                        cart.LastUserActivity          = DateTime.UtcNow;
                        cart.OrderInfo.CompletedFromIP = SiteUtils.GetIP4Address();
                        cart.OrderInfo.Completed       = DateTime.UtcNow;
                        StoreHelper.EnsureUserForOrder(cart);
                        cart.Save();

                        //Order order = Order.CreateOrder(store, cart, gateway, store.DefaultCurrency, "CreditCard");
                        Order order = Order.CreateOrder(store, cart, gateway, siteSettings.GetCurrency().Code, "CreditCard");
                        StoreHelper.ClearCartCookie(cart.StoreGuid);

                        // send confirmation email
                        try
                        {
                            // this also happens in StoreHelper.ConfirmOrder
                            //Module m = new Module(store.ModuleId);
                            //Order.EnsureSalesReportData(m.ModuleGuid, pageId, moduleId);

                            StoreHelper.ConfirmOrder(store, order);
                            PayPalLog.DeleteByCart(order.OrderGuid);
                            GoogleCheckoutLog.DeleteByCart(order.OrderGuid);
                        }
                        catch (Exception ex)
                        {
                            log.Error("error sending confirmation email", ex);
                        }

                        // redirect to order details
                        string redirectUrl = SiteRoot +
                                             "/WebStore/OrderDetail.aspx?pageid="
                                             + pageId.ToInvariantString()
                                             + "&mid=" + moduleId.ToInvariantString()
                                             + "&orderid=" + order.OrderGuid.ToString();

                        //TODO: if we charged a card here we can safely delete any paypal log or googlecheckout logs
                        // need methods to delete those by carguid


                        if (WebStoreConfiguration.LogCardTransactionStatus)
                        {
                            log.Info("accepted transaction " + gateway.ChargeTotal.ToString("c") + " " + gateway.ResponseCode + " " + gateway.ResponseReason);
                        }

                        WebUtils.SetupRedirect(this, redirectUrl);
                        return;

                    case PaymentGatewayResponse.Declined:

                        lblMessage.Text = WebStoreResources.TransactionDeclinedMessage;

                        if ((WebStoreConfiguration.LogCardTransactionStatus) || (WebStoreConfiguration.LogCardFailedTransactionStatus))
                        {
                            log.Info("declined transaction " + gateway.ChargeTotal.ToString("c") + " " + gateway.ResponseCode + " " + gateway.ResponseReason);
                        }

                        break;


                    case PaymentGatewayResponse.Error:

                        if (gateway.UseTestMode)
                        {
                            if (gateway.LastExecutionException != null)
                            {
                                lblMessage.Text = gateway.LastExecutionException.ToString();
                            }
                            else
                            {
                                // TODO: should not show user real messages? Mask CCNumber and login credentials in the gateways RawResponse property ... those shouldn't be logged either
                                lblMessage.Text = gateway.RawResponse;
                            }
                        }
                        else
                        {
                            lblMessage.Text = WebStoreResources.TransactionErrorMessage;
                            if ((WebStoreConfiguration.LogCardTransactionStatus) || (WebStoreConfiguration.LogCardFailedTransactionStatus))
                            {
                                if (gateway.LastExecutionException != null)
                                {
                                    log.Info("transaction error " + gateway.LastExecutionException.ToString());
                                }
                            }
                        }


                        break;

                    case PaymentGatewayResponse.NoRequestInitiated:

                        lblMessage.Text = WebStoreResources.TransactionNotInitiatedMessage;
                        break;
                    }
                }
                else
                {
                    lblMessage.Text = WebStoreResources.TransactionNotInitiatedMessage;

                    if (gateway.LastExecutionException != null)
                    {
                        if (commerceConfig.PaymentGatewayUseTestMode)
                        {
                            lblMessage.Text = gateway.LastExecutionException.ToString();
                        }
                    }
                }
            }

            btnMakePayment.Text = WebStoreResources.PaymentButton;
        }
        /// <summary>
        /// return true if the transaction was processed with no problems
        /// </summary>
        /// <param name="context"></param>
        /// <param name="transactionId"></param>
        /// <param name="orderId"></param>
        /// <param name="grossAmount"></param>
        /// <param name="standardCheckoutLog"></param>
        /// <returns></returns>
        public override bool HandleRequest(
            string transactionId,
            NameValueCollection form,
            PayPalLog standardCheckoutLog)
        {
            bool result = false;

            if (standardCheckoutLog.SerializedObject.Length == 0)
            {
                return(result);
            }

            Cart cart = (Cart)SerializationHelper.DeserializeFromString(typeof(Cart), standardCheckoutLog.SerializedObject);

            Store        store        = new Store(cart.StoreGuid);
            SiteSettings siteSettings = new SiteSettings(store.SiteGuid);

            bool debugPayPal = WebConfigSettings.DebugPayPal;

            //mc_gross=5.00
            //&address_status=confirmed
            //&item_number1=d28a6bed-7e51-4f18-a893-77b4d5665a64
            //&payer_id=zzzzzz
            //&tax=0.00
            //&address_street=nnnn
            //&payment_date=10%3A08%3A08+Jul+29%2C+2008+PDT
            //&payment_status=Completed
            //&charset=windows-1252
            //&address_zip=92843
            //&mc_shipping=0.00
            //&mc_handling=0.00
            //&first_name=zz
            //&mc_fee=0.45
            //&address_country_code=US
            //&address_name=zzzz
            //&notify_version=2.4
            //&custom=d9ef5324-2201-4749-b06a-9bba7a9dce61
            //&payer_status=verified
            //&business=sales%40mojoportal.com
            //&address_country=United+States
            //&num_cart_items=1
            //&mc_handling1=0.00
            //&address_city=nnnn
            //&verify_sign=
            //&payer_email=zzzzzz
            //&mc_shipping1=0.00
            //&tax1=0.00
            //&txn_id=81Y88484JA1416221
            //&payment_type=instant
            //&payer_business_name=EBShoes
            //&last_name=Ngo
            //&address_state=CA
            //&item_name1=Buy+Joe+a+Beer
            //&receiver_email=sales%40mojoportal.com
            //&payment_fee=0.45
            //&quantity1=1
            //&receiver_id=nnnn
            //&txn_type=cart
            //&mc_gross_1=5.00
            //&mc_currency=USD
            //&residence_country=US
            //&payment_gross=5.00

            string firstName = string.Empty;

            if (form["first_name"] != null)
            {
                firstName = form["first_name"].ToString();
            }

            string lastName = string.Empty;

            if (form["last_name"] != null)
            {
                lastName = form["last_name"].ToString();
            }

            string paymentStatus = string.Empty;

            if (form["payment_status"] != null)
            {
                paymentStatus = form["payment_status"].ToString();
            }

            string payerEmail = string.Empty;

            if (form["payer_email"] != null)
            {
                payerEmail = form["payer_email"].ToString();
            }

            string paymentGross = string.Empty;

            if (form["mc_gross"] != null)
            {
                paymentGross = form["mc_gross"].ToString();
            }

            string payPalFee = string.Empty;

            if (form["mc_fee"] != null)
            {
                payPalFee = form["mc_fee"].ToString();
            }

            string payPalTax = string.Empty;

            if (form["tax"] != null)
            {
                payPalTax = form["tax"].ToString();
            }

            string payPalShipping = string.Empty;

            if (form["mc_shipping"] != null)
            {
                payPalShipping = form["mc_shipping"].ToString();
            }

            string currencyUsed = string.Empty;

            if (form["mc_currency"] != null)
            {
                currencyUsed = form["mc_currency"].ToString();
            }


            string pendingReason = string.Empty;

            if (form["pending_reason"] != null)
            {
                pendingReason = form["pending_reason"].ToString();
            }

            string reasonCode = string.Empty;

            if (form["reason_code"] != null)
            {
                reasonCode = form["reason_code"].ToString();
            }

            string paymentType = string.Empty;

            if (form["txn_type"] != null)
            {
                paymentType = form["txn_type"].ToString();
            }

            string payPalSettlement = "0";

            if (form["settle_amount"] != null)
            {
                payPalSettlement = form["settle_amount"].ToString();
            }

            string customerAddress = string.Empty;

            if (form["address_street"] != null)
            {
                customerAddress = form["address_street"].ToString();
            }

            string customerCity = string.Empty;

            if (form["address_city"] != null)
            {
                customerCity = form["address_city"].ToString();
            }

            string customerState = string.Empty;

            if (form["address_state"] != null)
            {
                customerState = form["address_state"].ToString();
            }


            string customerPostalCode = string.Empty;

            if (form["address_zip"] != null)
            {
                customerPostalCode = form["address_zip"].ToString();
            }


            string customerCountry = string.Empty;

            if (form["address_country"] != null)
            {
                customerCountry = form["address_country"].ToString();
            }

            string customerPhone = string.Empty;

            if (form["contact_phone"] != null)
            {
                customerPhone = form["contact_phone"].ToString();
            }

            string customerBusinessName = string.Empty;

            if (form["payer_business_name"] != null)
            {
                customerBusinessName = form["payer_business_name"].ToString();
            }

            // TODO: we need to store this somewhere on the cart/order
            // its the message the user enters in special instructions on paypal checkout
            string customerMemo = string.Empty;

            if (form["memo"] != null)
            {
                customerMemo = form["memo"].ToString();
            }

            if (debugPayPal)
            {
                log.Info("PayPal currencyUsed was " + currencyUsed);
            }

            //Regardless of the specified currency, the format will have decimal point
            //with exactly two digits to the right and an optional thousands separator to the left,
            //which must be a comma; for example, EUR 2.000,00 must be specified as 2000.00 or 2,000.00
            // So we want to parse it with US Culture

            CultureInfo currencyCulture = new CultureInfo("en-US");
            //if (currencyUsed.Length > 0)
            //{
            //    currencyCulture = ResourceHelper.GetCurrencyCulture(currencyUsed);
            //}
            //else
            //{
            //    //Currency currency = new Currency(store.DefaultCurrencyId);
            //    //currencyCulture = ResourceHelper.GetCurrencyCulture(currency.Code);
            //    Currency currency = siteSettings.GetCurrency();
            //    currencyCulture = ResourceHelper.GetCurrencyCulture(currency.Code);
            //    currencyUsed = currency.Code;
            //}

            //if (debugPayPal) { log.Info("PayPal final currency culture was " + currencyUsed); }

            decimal grossAmount = 0;

            decimal.TryParse(paymentGross, NumberStyles.Currency, currencyCulture, out grossAmount);
            decimal feeAmount = 0;

            decimal.TryParse(payPalFee, NumberStyles.Currency, currencyCulture, out feeAmount);
            decimal taxAmount = 0;

            decimal.TryParse(payPalTax, NumberStyles.Currency, currencyCulture, out taxAmount);
            decimal shippingAmount = 0;

            decimal.TryParse(payPalShipping, NumberStyles.Currency, currencyCulture, out shippingAmount);
            decimal settleAmount = 0;

            decimal.TryParse(payPalSettlement, NumberStyles.Currency, currencyCulture, out settleAmount);

            if (debugPayPal)
            {
                log.Info("PayPal paymentGross was " + paymentGross + " which was parsed as " + grossAmount.ToString());
                log.Info("PayPal payPalFee was " + payPalFee + " which was parsed as " + feeAmount.ToString());
                log.Info("PayPal payPalTax was " + payPalTax + " which was parsed as " + taxAmount.ToString());
                log.Info("PayPal payPalShipping was " + payPalShipping + " which was parsed as " + shippingAmount.ToString());
                log.Info("PayPal payPalSettlement was " + payPalSettlement + " which was parsed as " + settleAmount.ToString());
            }


            PayPalLog payPalLog = new PayPalLog();

            payPalLog.PDTProviderName  = standardCheckoutLog.PDTProviderName;
            payPalLog.IPNProviderName  = standardCheckoutLog.IPNProviderName;
            payPalLog.ReturnUrl        = standardCheckoutLog.ReturnUrl;
            payPalLog.ProviderName     = standardCheckoutLog.ProviderName;
            payPalLog.SiteGuid         = standardCheckoutLog.SiteGuid;
            payPalLog.StoreGuid        = standardCheckoutLog.StoreGuid;
            payPalLog.UserGuid         = standardCheckoutLog.UserGuid;
            payPalLog.ApiVersion       = standardCheckoutLog.ApiVersion;
            payPalLog.CartGuid         = standardCheckoutLog.CartGuid;
            payPalLog.SerializedObject = standardCheckoutLog.SerializedObject;
            payPalLog.CartTotal        = grossAmount;
            payPalLog.PayPalAmt        = feeAmount;
            if (settleAmount > 0)
            {
                payPalLog.SettleAmt = settleAmount;
            }
            else
            {
                payPalLog.SettleAmt = (grossAmount - feeAmount);
            }
            payPalLog.TaxAmt        = taxAmount;
            payPalLog.CurrencyCode  = currencyUsed;
            payPalLog.TransactionId = transactionId;
            payPalLog.RawResponse   = form.ToString();
            payPalLog.Response      = "IPNSuccess";
            payPalLog.RequestType   = "IPN";
            payPalLog.PayerId       = payerEmail;
            payPalLog.PaymentType   = paymentType;
            payPalLog.PaymentStatus = paymentStatus;
            payPalLog.PendingReason = pendingReason;
            payPalLog.ReasonCode    = reasonCode;
            payPalLog.Save();


            // see if this cart has already been proceesed
            Order existingOrder = new Order(cart.CartGuid);

            // order already exists
            if (existingOrder.OrderGuid != Guid.Empty)
            {
                // lookup order status if needed make it fullfillable
                // then redirect to order detail page
                if (existingOrder.StatusGuid == OrderStatus.OrderStatusReceivedGuid)
                {
                    if (paymentStatus == "Completed")
                    {
                        existingOrder.StatusGuid = OrderStatus.OrderStatusFulfillableGuid;

                        existingOrder.Save();

                        try
                        {
                            StoreHelper.ConfirmOrder(store, existingOrder);
                            GoogleCheckoutLog.DeleteByCart(existingOrder.OrderGuid);
                        }
                        catch (Exception ex)
                        {
                            log.Error("error sending confirmation email", ex);
                        }
                    }
                }

                result = true;

                payPalLog.ReasonCode = "existing order found";
                payPalLog.Save();

                return(result);
            }

            // if we get here the cart has not yet been processed into an order
            cart.DeSerializeCartOffers();

            Guid orderStatus;

            if (paymentStatus == "Completed")
            {
                orderStatus = OrderStatus.OrderStatusFulfillableGuid;
            }
            else
            {
                orderStatus = OrderStatus.OrderStatusReceivedGuid;
            }

            // update the order with customer shipping info
            cart.OrderInfo.DeliveryCompany  = customerBusinessName;
            cart.OrderInfo.DeliveryAddress1 = customerAddress;

            cart.OrderInfo.DeliveryCity       = customerCity;
            cart.OrderInfo.DeliveryFirstName  = firstName;
            cart.OrderInfo.DeliveryLastName   = lastName;
            cart.OrderInfo.DeliveryPostalCode = customerPostalCode;
            cart.OrderInfo.DeliveryState      = customerState;
            cart.OrderInfo.DeliveryCountry    = customerCountry;

            if (customerPhone.Length > 0)
            {
                cart.OrderInfo.CustomerTelephoneDay = customerPhone;
            }

            if (payerEmail.Length > 0)
            {
                cart.OrderInfo.CustomerEmail = payerEmail;
            }

            cart.CopyShippingToBilling();
            cart.CopyShippingToCustomer();
            cart.TaxTotal   = taxAmount;
            cart.OrderTotal = grossAmount;
            if (shippingAmount > 0)
            {
                cart.ShippingTotal = shippingAmount;
            }

            StoreHelper.EnsureUserForOrder(cart);

            cart.Save();

            cart.SerializeCartOffers();
            payPalLog.SerializedObject = SerializationHelper.SerializeToString(cart);
            payPalLog.Save();

            Order order = Order.CreateOrder(
                store,
                cart,
                transactionId,
                transactionId,
                string.Empty,
                currencyUsed,
                "PayPal",
                orderStatus);

            if (orderStatus == OrderStatus.OrderStatusFulfillableGuid)
            {
                try
                {
                    StoreHelper.ConfirmOrder(store, order);
                    GoogleCheckoutLog.DeleteByCart(order.OrderGuid);
                }
                catch (Exception ex)
                {
                    log.Error("error sending confirmation email", ex);
                }
            }

            if (orderStatus == OrderStatus.OrderStatusReceivedGuid)
            {
                StoreHelper.ConfirmOrderReceived(store, order);
            }

            result = true;

            return(result);
        }
Exemplo n.º 14
0
        public override string HandleRequestAndReturnUrlForRedirect(
            string rawResponse,
            StringDictionary pdtItems,
            string transactionId,
            PayPalLog standardCheckoutLog)
        {
            string redirectUrl = string.Empty;

            if (standardCheckoutLog.SerializedObject.Length == 0)
            {
                return(redirectUrl);
            }

            Cart cart = (Cart)SerializationHelper.DeserializeFromString(typeof(Cart), standardCheckoutLog.SerializedObject);

            Store store = new Store(cart.StoreGuid);

            bool debugPayPal = WebConfigSettings.DebugPayPal;

            string firstName        = string.Empty;
            string lastName         = string.Empty;
            string paymentStatus    = string.Empty;
            string payerEmail       = string.Empty;
            string currencyUsed     = string.Empty;
            string paymentGross     = string.Empty;
            string payPalFee        = string.Empty;
            string payPalTax        = string.Empty;
            string payPalShipping   = string.Empty;
            string payPalSettlement = string.Empty;
            string pendingReason    = string.Empty;
            string reasonCode       = string.Empty;
            string paymentType      = string.Empty;

            string customerAddress      = string.Empty;
            string customerCity         = string.Empty;
            string customerState        = string.Empty;
            string customerPostalCode   = string.Empty;
            string customerCountry      = string.Empty;
            string customerPhone        = string.Empty;
            string customerBusinessName = string.Empty;
            string customerMemo         = string.Empty;

            if (pdtItems.ContainsKey("first_name"))
            {
                firstName = pdtItems["first_name"];
            }

            if (pdtItems.ContainsKey("last_name"))
            {
                lastName = pdtItems["last_name"];
            }

            if (pdtItems.ContainsKey("payment_status"))
            {
                paymentStatus = pdtItems["payment_status"];
            }

            if (pdtItems.ContainsKey("payer_email"))
            {
                payerEmail = pdtItems["payer_email"];
            }

            if (pdtItems.ContainsKey("mc_gross"))
            {
                paymentGross = pdtItems["mc_gross"];
            }

            if (pdtItems.ContainsKey("mc_fee"))
            {
                payPalFee = pdtItems["mc_fee"];
            }

            if (pdtItems.ContainsKey("tax"))
            {
                payPalTax = pdtItems["tax"];
            }

            if (pdtItems.ContainsKey("shipping"))
            {
                payPalShipping = pdtItems["shipping"];
            }

            if (pdtItems.ContainsKey("mc_currency"))
            {
                currencyUsed = pdtItems["mc_currency"];
            }

            if (pdtItems.ContainsKey("pending_reason"))
            {
                pendingReason = pdtItems["pending_reason"];
            }

            if (pdtItems.ContainsKey("reason_code"))
            {
                reasonCode = pdtItems["reason_code"];
            }

            if (pdtItems.ContainsKey("txn_type"))
            {
                paymentType = pdtItems["txn_type"];
            }

            if (pdtItems.ContainsKey("settle_amount"))
            {
                payPalSettlement = pdtItems["settle_amount"];
            }

            if (pdtItems.ContainsKey("address_street"))
            {
                customerAddress = pdtItems["address_street"];
            }

            if (pdtItems.ContainsKey("address_city"))
            {
                customerCity = pdtItems["address_city"];
            }

            if (pdtItems.ContainsKey("address_state"))
            {
                customerState = pdtItems["address_state"];
            }

            if (pdtItems.ContainsKey("address_zip"))
            {
                customerPostalCode = pdtItems["address_zip"];
            }

            if (pdtItems.ContainsKey("address_country"))
            {
                customerCountry = pdtItems["address_country"];
            }

            if (pdtItems.ContainsKey("contact_phone"))
            {
                customerPhone = pdtItems["contact_phone"];
            }

            if (pdtItems.ContainsKey("payer_business_name"))
            {
                customerBusinessName = pdtItems["payer_business_name"];
            }

            // TODO: we need to store this somewhere on the cart/order
            // its the message the user enters in special instructions on paypal checkout
            if (pdtItems.ContainsKey("memo"))
            {
                customerMemo = pdtItems["memo"];
            }

            //Regardless of the specified currency, the format will have decimal point
            //with exactly two digits to the right and an optional thousands separator to the left,
            //which must be a comma; for example, EUR 2.000,00 must be specified as 2000.00 or 2,000.00
            // So we want to parse it with US Culture

            CultureInfo currencyCulture = new CultureInfo("en-US");

            //if (currencyUsed.Length > 0)
            //{
            //    currencyCulture = ResourceHelper.GetCurrencyCulture(currencyUsed);
            //    if (debugPayPal) { log.Info("PayPal currencyUsed was " + currencyUsed); }
            //}
            //else
            //{
            //    SiteSettings siteSettings = new SiteSettings(store.SiteGuid);
            //    //Currency currency = new Currency(store.DefaultCurrencyId);
            //    //currencyCulture = ResourceHelper.GetCurrencyCulture(currency.Code);
            //    Currency currency = siteSettings.GetCurrency();
            //    currencyCulture = ResourceHelper.GetCurrencyCulture(currency.Code);
            //    currencyUsed = currency.Code;
            //}

            if (debugPayPal)
            {
                log.Info("PayPal rawResponse was " + rawResponse);
            }

            if (debugPayPal)
            {
                log.Info("PayPal final currency culture was " + currencyUsed);
            }


            decimal grossAmount = 0;

            decimal.TryParse(paymentGross, NumberStyles.Currency, currencyCulture, out grossAmount);

            decimal feeAmount = 0;

            decimal.TryParse(payPalFee, NumberStyles.Currency, currencyCulture, out feeAmount);

            decimal taxAmount = 0;

            decimal.TryParse(payPalTax, NumberStyles.Currency, currencyCulture, out taxAmount);

            decimal shippingAmount = 0;

            decimal.TryParse(payPalShipping, NumberStyles.Currency, currencyCulture, out shippingAmount);

            decimal settleAmount = 0;

            decimal.TryParse(payPalSettlement, NumberStyles.Currency, currencyCulture, out settleAmount);


            if (debugPayPal)
            {
                log.Info("PayPal paymentGross was " + paymentGross + " which was parsed as " + grossAmount.ToString());
                log.Info("PayPal payPalFee was " + payPalFee + " which was parsed as " + feeAmount.ToString());
                log.Info("PayPal payPalTax was " + payPalTax + " which was parsed as " + taxAmount.ToString());
                log.Info("PayPal payPalShipping was " + payPalShipping + " which was parsed as " + shippingAmount.ToString());
                log.Info("PayPal payPalSettlement was " + payPalSettlement + " which was parsed as " + settleAmount.ToString());
            }

            PayPalLog payPalLog = new PayPalLog();

            payPalLog.PDTProviderName  = standardCheckoutLog.PDTProviderName;
            payPalLog.IPNProviderName  = standardCheckoutLog.IPNProviderName;
            payPalLog.ReturnUrl        = standardCheckoutLog.ReturnUrl;
            payPalLog.ProviderName     = standardCheckoutLog.ProviderName;
            payPalLog.SiteGuid         = standardCheckoutLog.SiteGuid;
            payPalLog.StoreGuid        = standardCheckoutLog.StoreGuid;
            payPalLog.UserGuid         = standardCheckoutLog.UserGuid;
            payPalLog.ApiVersion       = standardCheckoutLog.ApiVersion;
            payPalLog.CartGuid         = standardCheckoutLog.CartGuid;
            payPalLog.SerializedObject = standardCheckoutLog.SerializedObject;
            payPalLog.CartTotal        = standardCheckoutLog.CartTotal;
            payPalLog.PayPalAmt        = grossAmount;
            payPalLog.FeeAmt           = feeAmount;
            if (settleAmount > 0)
            {
                payPalLog.SettleAmt = settleAmount;
            }
            else
            {
                payPalLog.SettleAmt = (grossAmount - feeAmount);
            }
            payPalLog.TaxAmt        = taxAmount;
            payPalLog.CurrencyCode  = currencyUsed;
            payPalLog.TransactionId = transactionId;
            payPalLog.RawResponse   = rawResponse;
            payPalLog.Response      = "PDTSuccess";
            payPalLog.RequestType   = "PDT";
            payPalLog.PayerId       = payerEmail;
            payPalLog.PaymentType   = paymentType;
            payPalLog.PaymentStatus = paymentStatus;
            payPalLog.PendingReason = pendingReason;
            payPalLog.ReasonCode    = reasonCode;
            payPalLog.Save();



            // see if this cart has already been proceesed
            Order existingOrder = new Order(cart.CartGuid);

            // order already exists
            if (existingOrder.OrderGuid != Guid.Empty)
            {
                // lookup order status if needed make it fullfillable
                // then redirect to order detail page
                if (existingOrder.StatusGuid == OrderStatus.OrderStatusReceivedGuid)
                {
                    if (paymentStatus == "Completed")
                    {
                        existingOrder.StatusGuid = OrderStatus.OrderStatusFulfillableGuid;
                        existingOrder.Save();
                        try
                        {
                            StoreHelper.ConfirmOrder(store, existingOrder);
                            GoogleCheckoutLog.DeleteByCart(existingOrder.OrderGuid);
                        }
                        catch (Exception ex)
                        {
                            log.Error("error sending confirmation email", ex);
                        }
                    }
                }

                // this was set in Checkout.aspx and should return to order detail page
                if (standardCheckoutLog.ReturnUrl.Length > 0)
                {
                    redirectUrl = standardCheckoutLog.ReturnUrl;
                }

                payPalLog.ReasonCode = "existing order found";
                payPalLog.Save();

                return(redirectUrl);
            }

            // if we get here the cart has not yet been processed into an order
            cart.DeSerializeCartOffers();

            Guid orderStatus;

            if (paymentStatus == "Completed")
            {
                orderStatus = OrderStatus.OrderStatusFulfillableGuid;
            }
            else
            {
                orderStatus = OrderStatus.OrderStatusReceivedGuid;
            }

            // update the order with customer shipping info
            cart.OrderInfo.DeliveryCompany  = customerBusinessName;
            cart.OrderInfo.DeliveryAddress1 = customerAddress;

            cart.OrderInfo.DeliveryCity       = customerCity;
            cart.OrderInfo.DeliveryFirstName  = firstName;
            cart.OrderInfo.DeliveryLastName   = lastName;
            cart.OrderInfo.DeliveryPostalCode = customerPostalCode;
            cart.OrderInfo.DeliveryState      = customerState;
            cart.OrderInfo.DeliveryCountry    = customerCountry;

            if (customerPhone.Length > 0)
            {
                cart.OrderInfo.CustomerTelephoneDay = customerPhone;
            }

            if (payerEmail.Length > 0)
            {
                cart.OrderInfo.CustomerEmail = payerEmail;
            }

            cart.CopyShippingToBilling();
            cart.CopyShippingToCustomer();
            cart.TaxTotal   = taxAmount;
            cart.OrderTotal = grossAmount;
            if (shippingAmount > 0)
            {
                cart.ShippingTotal = shippingAmount;
            }

            StoreHelper.EnsureUserForOrder(cart);


            cart.Save();

            cart.SerializeCartOffers();
            payPalLog.SerializedObject = SerializationHelper.SerializeToString(cart);
            payPalLog.Save();

            Order order = Order.CreateOrder(
                store,
                cart,
                transactionId,
                transactionId,
                string.Empty,
                currencyUsed,
                "PayPal",
                orderStatus);

            if (standardCheckoutLog.ReturnUrl.Length > 0)
            {
                redirectUrl = standardCheckoutLog.ReturnUrl;
            }

            if (orderStatus == OrderStatus.OrderStatusFulfillableGuid)
            {
                try
                {
                    StoreHelper.ConfirmOrder(store, order);
                    GoogleCheckoutLog.DeleteByCart(order.OrderGuid);
                }
                catch (Exception ex)
                {
                    log.Error("error sending confirmation email", ex);
                }
            }

            if (orderStatus == OrderStatus.OrderStatusReceivedGuid)
            {
                if ((paymentStatus == "Pending") && (pendingReason == "echeck"))
                {
                    StoreHelper.ConfirmOrderReceived(store, existingOrder, true);
                }
            }



            return(redirectUrl);
        }
        public override void HandleNewOrderNotificationExtended(
            string requestXml,
            NewOrderNotificationExtended newOrder,
            MerchantData merchantData)
        {
            //NotificationSerialNumber = newOrder.serialnumber;


            GoogleCheckoutLog gLog = new GoogleCheckoutLog();

            gLog.ProviderName     = "WebStoreGCheckoutNotificationHandlerProvider";
            gLog.RawResponse      = requestXml;
            gLog.NotificationType = "NewOrderNotification";
            gLog.SerialNumber     = newOrder.serialnumber;
            gLog.OrderNumber      = newOrder.googleordernumber;
            gLog.OrderTotal       = newOrder.ordertotal.Value;
            gLog.BuyerId          = newOrder.buyerid.ToString(CultureInfo.InvariantCulture);
            gLog.FullfillState    = newOrder.fulfillmentorderstate.ToString();
            gLog.FinanceState     = newOrder.financialorderstate.ToString();
            gLog.ShippingTotal    = newOrder.ShippingCost;
            gLog.TaxTotal         = newOrder.orderadjustment.totaltax.Value;
            //gLog.DiscountTotal = ext.orderadjustment.adjustmenttotal.Value;
            gLog.EmailListOptIn = newOrder.buyermarketingpreferences.emailallowed;
            gLog.GTimestamp     = newOrder.timestamp;
            gLog.CartXml        = SerializationHelper.RestoreXmlDeclaration(merchantData.SerializedObject);
            gLog.Save();


            Cart gCart = DeserializeCart(merchantData);

            Guid cartGuid = Guid.Empty;

            if (gCart != null)
            {
                cartGuid = gCart.CartGuid;
            }

            if (cartGuid == Guid.Empty)
            {
                return;
            }

            Cart cart = new Cart(cartGuid);

            if (cart.CartGuid != cartGuid)
            {
                return;
            }

            Store store = new Store(gCart.StoreGuid);

            if (store.Guid != cart.StoreGuid)
            {
                return;
            }

            gCart.DeSerializeCartOffers();

            gLog.SiteGuid  = store.SiteGuid;
            gLog.UserGuid  = gCart.UserGuid;
            gLog.CartGuid  = gCart.CartGuid;
            gLog.StoreGuid = gCart.StoreGuid;
            gLog.Save();

            gCart.OrderInfo.CompletedFromIP = SiteUtils.GetIP4Address();


            gCart.OrderInfo.Completed = DateTime.UtcNow;
            if (newOrder.buyerbillingaddress.structuredname != null)
            {
                gCart.OrderInfo.CustomerFirstName = newOrder.buyerbillingaddress.structuredname.firstname;
                gCart.OrderInfo.CustomerLastName  = newOrder.buyerbillingaddress.structuredname.lastname;
            }
            else
            {
                gCart.OrderInfo.CustomerFirstName = newOrder.buyerbillingaddress.contactname;
                gCart.OrderInfo.CustomerLastName  = newOrder.buyerbillingaddress.contactname;
            }
            gCart.OrderInfo.CustomerEmail        = newOrder.buyerbillingaddress.email;
            gCart.OrderInfo.CustomerCompany      = newOrder.buyerbillingaddress.companyname;
            gCart.OrderInfo.CustomerAddressLine1 = newOrder.buyerbillingaddress.address1;
            gCart.OrderInfo.CustomerAddressLine2 = newOrder.buyerbillingaddress.address2;
            gCart.OrderInfo.CustomerCity         = newOrder.buyerbillingaddress.city;
            gCart.OrderInfo.CustomerState        = newOrder.buyerbillingaddress.region;
            gCart.OrderInfo.CustomerCountry      = newOrder.buyerbillingaddress.countrycode;
            gCart.OrderInfo.CustomerPostalCode   = newOrder.buyerbillingaddress.postalcode;
            gCart.OrderInfo.CustomerTelephoneDay = newOrder.buyerbillingaddress.phone;


            gCart.CopyCustomerToBilling();

            if (newOrder.buyershippingaddress.structuredname != null)
            {
                gCart.OrderInfo.DeliveryFirstName = newOrder.buyershippingaddress.structuredname.firstname;
                gCart.OrderInfo.DeliveryLastName  = newOrder.buyershippingaddress.structuredname.lastname;
            }
            else
            {
                gCart.OrderInfo.DeliveryFirstName = newOrder.buyershippingaddress.contactname;
                gCart.OrderInfo.DeliveryLastName  = newOrder.buyershippingaddress.contactname;
            }
            gCart.OrderInfo.DeliveryCompany    = newOrder.buyershippingaddress.companyname;
            gCart.OrderInfo.DeliveryAddress1   = newOrder.buyershippingaddress.address1;
            gCart.OrderInfo.DeliveryAddress2   = newOrder.buyershippingaddress.address2;
            gCart.OrderInfo.DeliveryCity       = newOrder.buyershippingaddress.city;
            gCart.OrderInfo.DeliveryState      = newOrder.buyershippingaddress.region;
            gCart.OrderInfo.DeliveryCountry    = newOrder.buyershippingaddress.countrycode;
            gCart.OrderInfo.DeliveryPostalCode = newOrder.buyershippingaddress.postalcode;

            gCart.TaxTotal = newOrder.orderadjustment.totaltax.Value;
            if (newOrder.ShippingCost > 0)
            {
                gCart.ShippingTotal = newOrder.ShippingCost;
            }
            gCart.OrderTotal = newOrder.ordertotal.Value;


            Guid orderStatusGuid = OrderStatus.OrderStatusReceivedGuid;


            if (
                (newOrder.financialorderstate == FinancialOrderState.CHARGEABLE) ||
                (newOrder.financialorderstate == FinancialOrderState.CHARGED) ||
                (newOrder.financialorderstate == FinancialOrderState.CHARGING)
                )
            {
                orderStatusGuid = OrderStatus.OrderStatusFulfillableGuid;
            }

            StoreHelper.EnsureUserForOrder(gCart);

            gCart.Save();

            //Currency currency = new Currency(store.DefaultCurrencyId);
            SiteSettings siteSettings = new SiteSettings(store.SiteGuid);

            Order order = Order.CreateOrder(
                store,
                gCart,
                gLog.RawResponse,
                gLog.OrderNumber,
                string.Empty,
                siteSettings.GetCurrency().Code,
                "GoogleCheckout",
                orderStatusGuid);

            //StoreHelper.ClearCartCookie(cart.StoreGuid);
            if (orderStatusGuid == OrderStatus.OrderStatusFulfillableGuid)
            {
                StoreHelper.ConfirmOrder(store, order);
                PayPalLog.DeleteByCart(order.OrderGuid);
            }

            if (orderStatusGuid == OrderStatus.OrderStatusReceivedGuid)
            {
                StoreHelper.ConfirmOrderReceived(store, order);
            }
        }
        public override void HandleOrderStateChangeNotification(
            string requestXml,
            OrderStateChangeNotification notification)
        {
            GoogleCheckoutLog gLog = new GoogleCheckoutLog();

            Guid orderGuid = GoogleCheckoutLog.GetCartGuidFromOrderNumber(notification.googleordernumber);

            gLog.RawResponse      = requestXml;
            gLog.NotificationType = "OrderStateChangeNotification";
            gLog.ProviderName     = "WebStoreGCheckoutNotificationHandlerProvider";
            gLog.SerialNumber     = notification.serialnumber;
            gLog.OrderNumber      = notification.googleordernumber;
            gLog.FinanceState     = notification.newfinancialorderstate.ToString();
            gLog.FullfillState    = notification.newfulfillmentorderstate.ToString();
            gLog.GTimestamp       = notification.timestamp;
            gLog.AvsResponse      = notification.reason;
            gLog.CartGuid         = orderGuid;
            gLog.Save();

            if (orderGuid == Guid.Empty)
            {
                return;
            }

            Order order = new Order(orderGuid);

            if (order.OrderGuid != orderGuid)
            {
                return;
            }

            Store store = new Store(order.StoreGuid);

            if (store.Guid != order.StoreGuid)
            {
                return;
            }

            gLog.SiteGuid  = store.SiteGuid;
            gLog.UserGuid  = order.UserGuid;
            gLog.CartGuid  = order.OrderGuid;
            gLog.StoreGuid = order.StoreGuid;
            gLog.Save();


            if (notification.newfinancialorderstate == FinancialOrderState.CHARGED)
            {
                order.StatusGuid = OrderStatus.OrderStatusFulfillableGuid;
                order.Save();

                if (!order.HasShippingProducts())
                {
                    // order only has download products so tell google the order is fulfilled

                    try
                    {
                        CommerceConfiguration commerceConfig = SiteUtils.GetCommerceConfig();

                        string gEvironment;
                        if (commerceConfig.GoogleEnvironment == GCheckout.EnvironmentType.Sandbox)
                        {
                            gEvironment = "Sandbox";
                        }
                        else
                        {
                            gEvironment = "Production";
                        }

                        GCheckout.OrderProcessing.DeliverOrderRequest fulfillNotification
                            = new GCheckout.OrderProcessing.DeliverOrderRequest(
                                  commerceConfig.GoogleMerchantID,
                                  commerceConfig.GoogleMerchantKey,
                                  gEvironment,
                                  notification.googleordernumber);

                        fulfillNotification.Send();

                        StoreHelper.ConfirmOrder(store, order);
                        PayPalLog.DeleteByCart(order.OrderGuid);


                        log.Info("Sent DeliverOrderRequest to google api for google order " + notification.googleordernumber);
                    }
                    catch (Exception ex)
                    {
                        log.Error(ex);
                    }
                }
            }
        }