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)); }
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)); }