Esempio n. 1
0
        public async Task <JsonResult> PaypalSetup(string cartId, decimal cartTotal, string carrier = null)
        {
            // this is the first part of a paypal transaction, which sends a request from P4M to Realex
            // when this returns we redirect the consumer to PP in a popup window
            var result = new TokenMessage();

            try
            {
                // validate that the cart total from the widget is correct to prevent cart tampering in the browser
                cartTotal = Math.Round(cartTotal, 2);
                var localCart = ShoppingCart.GetCart(HttpContext);
                localCart.CalcTax();
                //decimal cartTot = Convert.ToDecimal(cartTotal);
                if (cartTotal != localCart.Total)
                {
                    localCart.EmptyCart();
                    HttpContext.Session[ShoppingCart.CartSessionKey] = null;
                    throw new Exception("Your cart is invalid and has been cleared. We're sorry for any inconvenience. Please keep shopping");
                }

                var orderId = await CreateLocalOrderAsync(localCart);

                var token = Request.Cookies["p4mToken"].Value;
                _httpClient.SetBearerToken(token);
                _httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

                var purchaseMessage = new PostPurchaseMessage {
                    CartId = cartId, OrderId = orderId.ToString(), Carrier = carrier
                };
                var content   = new ObjectContent <PostPurchaseMessage>(purchaseMessage, new JsonMediaTypeFormatter());
                var apiResult = await _httpClient.PostAsync(_p4mConsts.BaseApiAddress + "paypalSetup", content);

                //var apiResult = await _httpClient.GetAsync(string.Format("{0}paypalSetup/{1}", _urls.BaseApiAddress, cartId));
                //apiResult.EnsureSuccessStatusCode();
                var messageString = await apiResult.Content.ReadAsStringAsync();

                var setupResult = JsonConvert.DeserializeObject <TokenMessage>(messageString);
                if (!setupResult.Success)
                {
                    if (setupResult.Error.Contains("has already been processed!"))
                    {
                        ShoppingCart.GetCart(this).EmptyCart();
                        HttpContext.Session[ShoppingCart.CartSessionKey] = null;
                    }
                    throw new Exception(setupResult.Error);
                }
                result.Token = setupResult.Token;
            }
            catch (Exception e)
            {
                result.Error = e.Message;
            }
            return(Json(result, JsonRequestBehavior.AllowGet));
        }
Esempio n. 2
0
        public async Task <JsonResult> Purchase(string cartId, string cvv, decimal cartTotal, string carrier = null)
        {
            var result = new PurchaseResultMessage();

            try
            {
                if (string.IsNullOrWhiteSpace(cvv))
                {
                    throw new Exception("Please enter your CVV");
                }
                // validate that the cart total from the widget is correct to prevent cart tampering in the browser
                cartTotal = Math.Round(cartTotal, 2);
                var localCart = ShoppingCart.GetCart(HttpContext);
                localCart.CalcTax();
                //decimal cartTot = Convert.ToDecimal(cartTotal);
                if (cartTotal != localCart.Total)
                {
                    localCart.EmptyCart();
                    HttpContext.Session[ShoppingCart.CartSessionKey] = null;
                    throw new Exception("Your cart is invalid and has been cleared. We're sorry for any inconvenience. Please keep shopping");
                }

                var orderId = await CreateLocalOrderAsync(localCart);

                var token = Request.Cookies["p4mToken"].Value;
                _httpClient.SetBearerToken(token);
                _httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

                var purchaseMessage = new PostPurchaseMessage {
                    CartId = cartId, CVV = cvv, OrderId = orderId.ToString(), Carrier = carrier
                };
                var content   = new ObjectContent <PostPurchaseMessage>(purchaseMessage, new JsonMediaTypeFormatter());
                var apiResult = await _httpClient.PostAsync(_p4mConsts.BaseApiAddress + "purchase", content);

//                var apiResult = await client.GetAsync(string.Format("{0}purchase/{1}/{2}", _urls.BaseApiAddress, cartId, cvv));
                apiResult.EnsureSuccessStatusCode();
                var messageString = await apiResult.Content.ReadAsStringAsync();

                var purchaseResult = JsonConvert.DeserializeObject <PurchaseResultMessage>(messageString);
                if (!purchaseResult.Success)
                {
                    if (purchaseResult.Error.Contains("has already been processed!"))
                    {
                        ShoppingCart.GetCart(this).EmptyCart();
                        HttpContext.Session[ShoppingCart.CartSessionKey] = null;
                    }
                    throw new Exception(purchaseResult.Error);
                }
                // if ACSUrl is blank then the purchase proceeded without 3D Secure
                if (purchaseResult.ACSUrl == null)
                {
                    // purchaseResult includes the transaction Id, auth code and cart
                    // so the retailer can store whatever is required at this point
                    ShoppingCart.GetCart(this).EmptyCart();
                    HttpContext.Session[ShoppingCart.CartSessionKey] = null;
                    orderId = await CreateLocalOrderAsync(localCart);

                    result.RedirectUrl = this.Url.Action("Complete", "Checkout", new { id = orderId }, this.Request.Url.Scheme);
                }
                else
                {
                    // retailer has opted to use 3D Secure and the consumer is enrolled
                    result.ACSUrl         = purchaseResult.ACSUrl;
                    result.PaReq          = purchaseResult.PaReq;
                    result.ACSResponseUrl = purchaseResult.ACSResponseUrl;
                    result.P4MData        = purchaseResult.P4MData;
                }
            }
            catch (Exception e)
            {
                result.Error = e.Message;
            }
            return(Json(result, JsonRequestBehavior.AllowGet));
        }