public ActionResult Index(MyAccountModel model)
        {
            string publicKey   = ConfigurationManager.AppSettings["Braintree.PublicKey"];
            string privateKey  = ConfigurationManager.AppSettings["Braintree.PrivateKey"];
            string environment = ConfigurationManager.AppSettings["Braintree.Environment"];
            string merchantId  = ConfigurationManager.AppSettings["Braintree.MerchantId"];

            Braintree.BraintreeGateway braintree = new Braintree.BraintreeGateway(environment, merchantId, publicKey, privateKey);
            int userId = -1;

            using (MemberEntities1 e = new MemberEntities1())
            {
                userId = e.CustomerLists.Single(x => x.EmailAddress == User.Identity.Name).ID;
            }
            Braintree.CustomerRequest update = new Braintree.CustomerRequest();
            update.FirstName = model.FirstName;
            update.LastName  = model.LastName;
            update.Phone     = model.Phone;
            update.Company   = model.Company;
            update.Fax       = model.Fax;
            update.Website   = model.Website;
            braintree.Customer.Update(userId.ToString(), update);

            return(View(model));
        }
        public ActionResult Index()
        {
            string merchantID  = System.Configuration.ConfigurationManager.AppSettings["Braintree.MerchantID"];
            string environment = System.Configuration.ConfigurationManager.AppSettings["Braintree.Environment"];
            string publickey   = System.Configuration.ConfigurationManager.AppSettings["Braintree.PublicKey"];
            string privatekey  = System.Configuration.ConfigurationManager.AppSettings["Braintree.PriavteKey"];

            Braintree.BraintreeGateway gateway = new Braintree.BraintreeGateway(environment, merchantID, publickey, privatekey);

            var customerGateway = gateway.Customer;

            Braintree.CustomerSearchRequest query = new Braintree.CustomerSearchRequest();
            query.Email.Is(User.Identity.Name);
            var matchedCustomers = customerGateway.Search(query);

            Braintree.Customer customer = null;
            if (matchedCustomers.Ids.Count == 0)
            {
                Braintree.CustomerRequest newCustomer = new Braintree.CustomerRequest();
                newCustomer.Email = User.Identity.Name;

                var result = customerGateway.Create(newCustomer);
                customer = result.Target;
            }
            else
            {
                customer = matchedCustomers.FirstItem;
            }
            return(View(customer));
        }
Exemple #3
0
        public async Task <ActionResult> Register(RegisterModel model)
        {
            if (ModelState.IsValid)
            {
                using (IdentityModels entities = new IdentityModels())
                {
                    var userStore = new UserStore <User>(entities);

                    var manager = new UserManager <User>(userStore);
                    manager.UserTokenProvider = new EmailTokenProvider <User>();

                    var user = new User()
                    {
                        UserName = model.EmailAddress,
                        Email    = model.EmailAddress
                    };

                    IdentityResult result = manager.Create(user, model.Password);

                    if (result.Succeeded)
                    {
                        User u = manager.FindByName(model.EmailAddress);

                        // Creates customer record in Braintree
                        string merchantId  = ConfigurationManager.AppSettings["Braintree.MerchantID"];
                        string publicKey   = ConfigurationManager.AppSettings["Braintree.PublicKey"];
                        string privateKey  = ConfigurationManager.AppSettings["Braintree.PrivateKey"];
                        string environment = ConfigurationManager.AppSettings["Braintree.Environment"];
                        Braintree.BraintreeGateway braintree = new Braintree.BraintreeGateway(environment, merchantId, publicKey, privateKey);
                        Braintree.CustomerRequest  customer  = new Braintree.CustomerRequest();
                        customer.CustomerId = u.Id;
                        customer.Email      = u.Email;

                        var r = await braintree.Customer.CreateAsync(customer);

                        string confirmationToken = manager.GenerateEmailConfirmationToken(u.Id);

                        string sendGridApiKey = ConfigurationManager.AppSettings["SendGrid.ApiKey"];

                        SendGrid.SendGridClient client = new SendGrid.SendGridClient(sendGridApiKey);
                        SendGrid.Helpers.Mail.SendGridMessage message = new SendGrid.Helpers.Mail.SendGridMessage();
                        message.Subject = string.Format("Please confirm your account");
                        message.From    = new SendGrid.Helpers.Mail.EmailAddress("*****@*****.**", "Will Mabrey");
                        message.AddTo(new SendGrid.Helpers.Mail.EmailAddress(model.EmailAddress));
                        SendGrid.Helpers.Mail.Content contents = new SendGrid.Helpers.Mail.Content("text/html", string.Format("<a href=\"{0}\">Confirm Account</a>", Request.Url.GetLeftPart(UriPartial.Authority) + "/MyAccount/Confirm/" + confirmationToken + "?email=" + model.EmailAddress));

                        message.AddContent(contents.Type, contents.Value);
                        SendGrid.Response response = await client.SendEmailAsync(message);

                        return(RedirectToAction("ConfirmSent"));
                    }
                    else
                    {
                        ModelState.AddModelError("EmailAddress", "Unable to register with this email address.");
                    }
                }
            }
            return(View(model));
        }
Exemple #4
0
        public ActionResult Index(CheckoutModel model)
        {
            string publicKey   = ConfigurationManager.AppSettings["Braintree.PublicKey"];
            string privateKey  = ConfigurationManager.AppSettings["Braintree.PrivateKey"];
            string environment = ConfigurationManager.AppSettings["Braintree.Environment"];
            string merchantId  = ConfigurationManager.AppSettings["Braintree.MerchantId"];


            Braintree.BraintreeGateway braintree = new Braintree.BraintreeGateway(environment, merchantId, publicKey, privateKey);
            //int userId = -1;
            if (ModelState.IsValid)
            {
                using (CustomersEntities entities = new CustomersEntities())
                {
                    var currentCustomer = entities.Customers.Single(x => x.EmailAddress == User.Identity.Name);
                    var currentPackage  = currentCustomer.CustomerPackages.First(x => x.PurchaseDate == null);


                    //TODO: Validate the credit card - if it errors out, add a model error and display it to the user
                    //TODO: Persist this information to the database

                    //var currentPackage = entities.Customers.Single(x => x.EmailAddress == User.Identity.Name).CustomerPackages.First(x => x.PurchaseDate == null);
                    //model.Package = new PackageModel();
                    //string publicKey = ConfigurationManager.AppSettings["Braintree.PublicKey"];
                    //string privateKey = ConfigurationManager.AppSettings["Braintree.PrivateKey"];
                    //string environment = ConfigurationManager.AppSettings["Braintree.Environment"];
                    //string merchantId = ConfigurationManager.AppSettings["Braintree.MerchantId"];


                    Braintree.CustomerRequest request = new Braintree.CustomerRequest();
                    request.Email      = model.EmailAddress;
                    request.FirstName  = model.FirstName;
                    request.LastName   = model.LastName;
                    request.Phone      = model.PhoneNumber;
                    request.CreditCard = new Braintree.CreditCardRequest();

                    request.CreditCard.Number          = model.CreditCardNumber;
                    request.CreditCard.CardholderName  = model.CreditCardName;
                    request.CreditCard.ExpirationMonth = (model.CreditCardExpirationMonth).ToString().PadLeft(2, '0');
                    request.CreditCard.ExpirationYear  = model.CreditCardExpirationYear.ToString();


                    var customerResult = braintree.Customer.Create(request);
                    Braintree.TransactionRequest sale = new Braintree.TransactionRequest();
                    sale.Amount = currentPackage.Package.Price;


                    sale.CustomerId         = customerResult.Target.Id;
                    sale.PaymentMethodToken = customerResult.Target.DefaultPaymentMethod.Token;
                    braintree.Transaction.Sale(sale);

                    currentPackage.PurchaseDate = DateTime.UtcNow;
                    entities.SaveChanges();

                    return(RedirectToAction("Receipt", "Membership", null));
                }
            }
            return(View(model));
        }
        public async Task <ActionResult> Registration(RegistrationModel model)
        {
            if (ModelState.IsValid)
            {
                if (WebSecurity.UserExists(model.EmailAddress))
                {
                    ModelState.AddModelError("EmailAddress", "Username already in user");
                }
                else
                {
                    string confirmationToken = WebSecurity.CreateUserAndAccount(model.EmailAddress, model.Password, null, true);
                    string publicKey         = ConfigurationManager.AppSettings["Braintree.PublicKey"];
                    string privateKey        = ConfigurationManager.AppSettings["Braintree.PrivateKey"];
                    string environment       = ConfigurationManager.AppSettings["Braintree.Environment"];
                    string merchantId        = ConfigurationManager.AppSettings["Braintree.MerchantID"];


                    Braintree.BraintreeGateway braintree = new Braintree.BraintreeGateway(environment, merchantId, publicKey, privateKey);
                    Braintree.CustomerRequest  request   = new Braintree.CustomerRequest();
                    request.Email = model.EmailAddress;
                    using (MemberEntities1 entities = new MemberEntities1())
                    {
                        request.Id = entities.CustomerLists.Single(x => x.EmailAddress == model.EmailAddress).ID.ToString();
                    }
                    braintree.Customer.Create(request);



                    string confirmationUrl = Request.Url.GetLeftPart(UriPartial.Authority) + "/Membership/Confirm?confirmationToken=" + confirmationToken;

                    string sendGridApiKey = ConfigurationManager.AppSettings["SendGrid.ApiKey"];

                    SendGrid.SendGridAPIClient client = new SendGrid.SendGridAPIClient(sendGridApiKey);

                    Email   from    = new Email("*****@*****.**");
                    string  subject = "Confirm your new account";
                    Email   to      = new Email(model.EmailAddress);
                    Content content = new Content("text/html", string.Format("<a href=\"{0}\">Confirm</a>", confirmationUrl));

                    Mail mail = new Mail(from, subject, to, content);
                    mail.TemplateId = "00aaf54f-cf22-4cfe-98b5-b20d3cd72354";
                    mail.Personalization[0].AddSubstitution("-link-", confirmationUrl);
                    var response = await client.client.mail.send.post(requestBody : mail.Get());

                    string message = await response.Body.ReadAsStringAsync();

                    if (!string.IsNullOrEmpty(message))
                    {
                        throw new Exception(message);
                    }
                    return(RedirectToAction("ConfirmationSent"));
                }
            }
            return(View(model));
        }
Exemple #6
0
        public async Task <IActionResult> Index(CheckoutViewModel model)
        {
            if (ModelState.IsValid)
            {
                Braintree.CustomerRequest customerRequest = new Braintree.CustomerRequest
                {
                };

                Braintree.AddressRequest addressRequest = new Braintree.AddressRequest
                {
                    StreetAddress = model.Billingaddress,
                    PostalCode    = model.BillingZip,
                    Region        = model.BillingState,
                    Locality      = model.BillingCity,
                    CountryName   = "USA"
                };

                Braintree.TransactionRequest saleRequest = new Braintree.TransactionRequest();
                saleRequest.Amount     = 10; //Hard-coded forever because Braintree ain't gonna take $2 million+
                saleRequest.CreditCard = new Braintree.TransactionCreditCardRequest
                {
                    CardholderName  = model.creditcardname,
                    CVV             = model.creditcardverificationvalue,
                    ExpirationMonth = model.expirationmonth,
                    ExpirationYear  = model.expirationyear,
                    Number          = model.creditcardnumber
                };
                saleRequest.BillingAddress = new Braintree.AddressRequest
                {
                    StreetAddress = model.Billingaddress,
                    PostalCode    = model.BillingZip,
                    Region        = model.BillingState,
                    Locality      = model.BillingCity,
                    CountryName   = "USA"
                };
                var result = await _braintreeGateway.Transaction.SaleAsync(saleRequest);

                if (result.IsSuccess())
                {
                    //If model state is valid, proceed to the next step.
                    return(this.RedirectToAction("Index", "Home"));
                }
                foreach (var error in result.Errors.All())
                {
                    ModelState.AddModelError(error.Code.ToString(), error.Message);
                }
            }

            return(View());
        }
        public ActionResult Index(string firstName, string lastName, string id)
        {
            if (User.Identity.IsAuthenticated == false)
            {
                return(RedirectToAction("Index", "Home"));
            }
            string merchantId  = System.Configuration.ConfigurationManager.AppSettings["Braintree.MerchantId"];
            string environment = System.Configuration.ConfigurationManager.AppSettings["Braintree.Environment"];
            string publicKey   = System.Configuration.ConfigurationManager.AppSettings["Braintree.PublicKey"];
            string privateKey  = System.Configuration.ConfigurationManager.AppSettings["Braintree.PrivateKey"];

            Braintree.BraintreeGateway gateway = new Braintree.BraintreeGateway(environment, merchantId, publicKey, privateKey);

            var customerGateway = gateway.Customer;

            Braintree.CustomerRequest request = new Braintree.CustomerRequest();
            request.FirstName = firstName;
            request.LastName  = lastName;
            var result = customerGateway.Update(id, request);

            ViewBag.Message = "Updated Successfully";
            return(View(result.Target));
        }
        // GET: Checkout
        public ActionResult Index()
        {
            Models.CheckoutDetails details = new Models.CheckoutDetails();
            Guid cartID = Guid.Parse(Request.Cookies["cartID"].Value);

            details.CurrentCart = db.Carts.Find(cartID);
            details.Addresses   = new Braintree.Address[0];
            if (User.Identity.IsAuthenticated)
            {
                string merchantId  = System.Configuration.ConfigurationManager.AppSettings["Braintree.MerchantId"];
                string environment = System.Configuration.ConfigurationManager.AppSettings["Braintree.Environment"];
                string publicKey   = System.Configuration.ConfigurationManager.AppSettings["Braintree.PublicKey"];
                string privateKey  = System.Configuration.ConfigurationManager.AppSettings["Braintree.PrivateKey"];
                Braintree.BraintreeGateway gateway = new Braintree.BraintreeGateway(environment, merchantId, publicKey, privateKey);

                var customerGateway = gateway.Customer;
                Braintree.CustomerSearchRequest query = new Braintree.CustomerSearchRequest();
                query.Email.Is(User.Identity.Name);
                var matchedCustomers        = customerGateway.Search(query);
                Braintree.Customer customer = null;
                if (matchedCustomers.Ids.Count == 0)
                {
                    Braintree.CustomerRequest newCustomer = new Braintree.CustomerRequest();
                    newCustomer.Email = User.Identity.Name;

                    var result = customerGateway.Create(newCustomer);
                    customer = result.Target;
                }
                else
                {
                    customer = matchedCustomers.FirstItem;
                }

                details.Addresses = customer.Addresses;
            }
            return(View(details));
        }
        public async Task <ActionResult> Register(string username, string fname, string lname, DateTime?dateOfBirth, string phone, string password)
        {
            IdentityUser newUser = new IdentityUser(username)
            {
                // set the Email to be the username
                Email       = username,
                PhoneNumber = phone
            };

            IdentityResult result = await UserManager.CreateAsync(newUser, password);

            if (!result.Succeeded)
            {
                ViewBag.Errors = result.Errors;
                return(View());
            }

            // Check if new registrant has ordered before. If so, they should already have a Customer record
            // We don't want to create a new one - just modify their record to add the AspNetUserID

            string   custID           = "";
            Customer existingCustomer = db.Customers.FirstOrDefault(x => x.EmailAddress == username);

            if (existingCustomer == null)
            {
                var newCustomer = new Customer
                {
                    AspNetUserID     = newUser.Id,
                    FirstName        = fname,
                    LastName         = lname,
                    DateOfBirth      = dateOfBirth,
                    PhoneNumber      = phone,
                    EmailAddress     = username,
                    DateCreated      = DateTime.UtcNow,
                    DateLastModified = DateTime.UtcNow
                };
                custID = newCustomer.Id.ToString();
                db.Customers.Add(newCustomer);
                await db.SaveChangesAsync();
            }
            else
            {
                existingCustomer.PhoneNumber  = phone;
                existingCustomer.DateOfBirth  = dateOfBirth ?? null;
                existingCustomer.AspNetUserID = newUser.Id;
                custID = existingCustomer.Id.ToString();
            }


            string merchantId  = ConfigurationManager.AppSettings["Braintree.MerchantID"];
            string publicKey   = ConfigurationManager.AppSettings["Braintree.PublicKey"];
            string privateKey  = ConfigurationManager.AppSettings["Braintree.PrivateKey"];
            string environment = ConfigurationManager.AppSettings["Braintree.Environment"];

            Braintree.BraintreeGateway braintreeGateway = new Braintree.BraintreeGateway
                                                              (environment, merchantId, publicKey, privateKey);

            Braintree.CustomerSearchRequest search = new Braintree.CustomerSearchRequest();
            search.Email.Equals(username);

            var existingCustomers = await braintreeGateway.Customer.SearchAsync(search);

            if (existingCustomers != null || !existingCustomers.Ids.Any())
            {
                Braintree.CustomerRequest c = new Braintree.CustomerRequest
                {
                    FirstName  = fname,
                    LastName   = lname,
                    CustomerId = custID,
                    Email      = username,
                    Phone      = phone
                };
                var creationResult = await braintreeGateway.Customer.CreateAsync(c);
            }

            string token = await UserManager.GenerateEmailConfirmationTokenAsync(newUser.Id);

            string body = string.Format(
                "<a href=\"{0}/account/confirmaccount?email={1}&token={2}\">Confirm Your Account</a>",
                Request.Url.GetLeftPart(UriPartial.Authority),
                username,
                token);

            await UserManager.SendEmailAsync(newUser.Id, "Confirm Your WeirdEnsemble Account", body);

            TempData["ConfirmEmail"] = "Account created. Please check your email inbox to confirm your account!";
            return(RedirectToAction("SignIn"));
        }
        public async Task <IActionResult> Index(ShippingViewModel model)
        {
            await SetupViewAsync(model);

            System.Text.RegularExpressions.Regex regex = new System.Text.RegularExpressions.Regex(@"^\d{5}(?:[-\s]\d{4})?$");
            if (string.IsNullOrEmpty(model.ShippingZipCode) || !regex.IsMatch(model.ShippingZipCode))
            {
                ModelState.AddModelError("ZipCode", "Invalid ZipCode");
            }

            if (ModelState.IsValid)
            {
                Braintree.CustomerSearchRequest customerSearch = new Braintree.CustomerSearchRequest();
                customerSearch.Email.Is(model.Email);
                Braintree.Customer customer = null;
                var customers = await _braintreeGateway.Customer.SearchAsync(customerSearch);

                if (customers.Ids.Any())
                {
                    customer = customers.FirstItem;
                }
                else
                {
                    Braintree.CustomerRequest newCustomer = new Braintree.CustomerRequest
                    {
                        Email = model.Email
                    };
                    var creationResult = await _braintreeGateway.Customer.CreateAsync(newCustomer);

                    customer = creationResult.Target;
                }
                if (string.IsNullOrEmpty(model.CardToken))
                {
                    Braintree.CreditCard card = null;
                    if (customer.CreditCards.Any())
                    {
                        string lastFour = new string(model.CreditCardNumber.Skip(model.CreditCardNumber.Length - 4).ToArray());

                        card = customer.CreditCards.FirstOrDefault(
                            x => x.ExpirationMonth == model.ExpirationMonth &&
                            x.ExpirationYear == model.ExpirationYear &&
                            x.LastFour == lastFour);
                    }
                    if (card == null)
                    {
                        Braintree.CreditCardRequest newCard = new Braintree.CreditCardRequest
                        {
                            CustomerId      = customer.Id,
                            CardholderName  = model.CreditCardName,
                            CVV             = model.CreditCardVerificationValue,
                            ExpirationMonth = model.ExpirationMonth,
                            ExpirationYear  = model.ExpirationYear,
                            Number          = model.CreditCardNumber
                        };
                        var creationResult = await _braintreeGateway.CreditCard.CreateAsync(newCard);

                        card            = creationResult.Target;
                        model.CardToken = card.Token;
                    }
                }

                Braintree.TransactionRequest saleRequest = new Braintree.TransactionRequest();
                saleRequest.Amount = model.CartLineItem.Sum(x => (x.ProductConfiguration.Product.UnitPrice * x.Quantity ?? .99m));

                saleRequest.CustomerId         = customer.Id;
                saleRequest.PaymentMethodToken = model.CardToken;
                saleRequest.BillingAddress     = new Braintree.AddressRequest
                {
                    StreetAddress      = model.BillingAddress,
                    PostalCode         = model.BillingZipCode,
                    Region             = model.BillingState,
                    Locality           = model.BillingCity,
                    CountryName        = "United States of America",
                    CountryCodeAlpha2  = "US",
                    CountryCodeAlpha3  = "USA",
                    CountryCodeNumeric = "840"
                };

                var result = await _braintreeGateway.Transaction.SaleAsync(saleRequest);

                if (result.IsSuccess())
                {
                    //If model state is valid convert to order and show reciept
                    return(this.RedirectToAction("Index", "Receipt"));
                }

                foreach (var error in result.Errors.All())
                {
                    ModelState.AddModelError(error.Code.ToString(), error.Message);
                }
            }
            return(View(model));
        }
Exemple #11
0
        public async Task <ActionResult> Index(CheckoutModel model2)
        {
            using (MemberEntities1 entities = new MemberEntities1())
            {
                //int orderId = int.Parse(Request.Cookies["OrderID"].Value);
                var   cart = entities.Carts.Single(x => x.Id == model2.id);
                Order o    = new Order();
                cart.Orders.Add(o);

                if (ModelState.IsValid)
                {
                    bool addressValidationSuccessful = true;
                    bool validateAddress             = false;

                    string smartyStreetsAuthId    = ConfigurationManager.AppSettings["SmartyStreets.AuthId"];
                    string smartyStreetsAuthToken = ConfigurationManager.AppSettings["SmartyStreets.AuthToken"];

                    Rentler.SmartyStreets.SmartyStreetsClient client = new Rentler.SmartyStreets.SmartyStreetsClient(smartyStreetsAuthId, smartyStreetsAuthToken);
                    var addresses = await client.GetStreetAddressAsync(model2.BillingStreet1, null, model2.BillingStreet2, model2.BillingCity, model2.BillingState, model2.BillingPostalCode);

                    if (addresses.Count() == 0)
                    {
                        ModelState.AddModelError("BillingStreet1", "Could not find exact or similiar address");
                        addressValidationSuccessful = false;
                    }
                    else
                    {
                        if (!string.IsNullOrEmpty(model2.BillingStreet1) && addresses.First().delivery_line_1 != model2.BillingStreet1)
                        {
                            ModelState.AddModelError("BillingStreet1", string.Format("Suggested Address: {0}", addresses.First().delivery_line_1));
                            addressValidationSuccessful = false;
                        }
                        if (!string.IsNullOrEmpty(model2.BillingStreet2) && addresses.First().delivery_line_2 != model2.BillingStreet2)
                        {
                            ModelState.AddModelError("BillingStreet2", string.Format("Suggested Address: {0}", addresses.First().delivery_line_2));
                            addressValidationSuccessful = false;
                        }
                        if (!string.IsNullOrEmpty(model2.BillingCity) && addresses.First().components.city_name != model2.BillingCity)
                        {
                            ModelState.AddModelError("BillingCity", string.Format("Suggested Address: {0}", addresses.First().components.city_name));
                            addressValidationSuccessful = false;
                        }
                        if (!string.IsNullOrEmpty(model2.BillingPostalCode) && addresses.First().components.zipcode != model2.BillingPostalCode)
                        {
                            ModelState.AddModelError("BillingPostalCode", string.Format("Suggested Address: {0}", addresses.First().components.zipcode));
                            addressValidationSuccessful = false;
                        }
                        if (!string.IsNullOrEmpty(model2.BillingState) && addresses.First().components.state_abbreviation != model2.BillingState)
                        {
                            ModelState.AddModelError("BillingState", string.Format("Suggested Address: {0}", addresses.First().components.state_abbreviation));
                            addressValidationSuccessful = false;
                        }
                    }
                    if (addressValidationSuccessful || !validateAddress)
                    {
                        //TODO: Validate the credit card - if it errors out, add a model error and display it to the user
                        string publicKey   = ConfigurationManager.AppSettings["Braintree.PublicKey"];
                        string privateKey  = ConfigurationManager.AppSettings["Braintree.PrivateKey"];
                        string environment = ConfigurationManager.AppSettings["Braintree.Environment"];
                        string merchantId  = ConfigurationManager.AppSettings["Braintree.MerchantId"];

                        Braintree.BraintreeGateway braintree = new Braintree.BraintreeGateway(environment, merchantId, publicKey, privateKey);

                        int userId = -1;
                        if (string.IsNullOrEmpty(User.Identity.Name))
                        {
                            userId = 34;

                            var customer = braintree.Customer.Find(userId.ToString());

                            Braintree.CustomerRequest request = new Braintree.CustomerRequest();

                            request.CreditCard = new Braintree.CreditCardRequest();

                            request.CreditCard.Number          = model2.CreditCardNumber;
                            request.CreditCard.CardholderName  = model2.CreditCardName;
                            request.CreditCard.ExpirationMonth = (model2.CreditCardExpirationMonth).ToString().PadLeft(2, '0');
                            request.CreditCard.ExpirationYear  = model2.CreditCardExpirationYear.ToString();


                            var customerResult = braintree.Customer.Update(userId.ToString(), request);

                            Braintree.TransactionRequest sale = new Braintree.TransactionRequest();
                            sale.Amount             = decimal.Parse(cart.saleTotal.Replace("USD", string.Empty));
                            sale.CustomerId         = customerResult.Target.Id;
                            sale.PaymentMethodToken = customerResult.Target.DefaultPaymentMethod.Token;
                            braintree.Transaction.Sale(sale);


                            o.FirstName    = model2.FirstName;
                            o.LastName     = model2.LastName;
                            o.EmailAddress = model2.EmailAddress;
                            o.PhoneNumber  = model2.PhoneNumber;

                            o.BillingCity       = model2.BillingCity;
                            o.BillingPostalCode = model2.BillingPostalCode;
                            o.BillingReceipient = model2.BillingReceipient;
                            o.BillingStreet1    = model2.BillingStreet1;
                            o.BillingStreet2    = model2.BillingStreet2;
                            o.BillingState      = model2.BillingState;
                            o.DateCreated       = DateTime.UtcNow;
                            o.DateLastModified  = DateTime.UtcNow;
                            entities.SaveChanges();

                            return(RedirectToAction("Index", "Receipt", new { id = o.OrderId }));
                        }
                        else
                        {
                            using (MemberEntities1 e = new MemberEntities1())
                            {
                                userId = e.CustomerLists.Single(x => x.EmailAddress == User.Identity.Name).ID;
                            }
                            var customer = braintree.Customer.Find(userId.ToString());

                            Braintree.CustomerRequest request = new Braintree.CustomerRequest();

                            request.CreditCard = new Braintree.CreditCardRequest();

                            request.CreditCard.Number          = model2.CreditCardNumber;
                            request.CreditCard.CardholderName  = model2.CreditCardName;
                            request.CreditCard.ExpirationMonth = (model2.CreditCardExpirationMonth).ToString().PadLeft(2, '0');
                            request.CreditCard.ExpirationYear  = model2.CreditCardExpirationYear.ToString();


                            var customerResult = braintree.Customer.Update(userId.ToString(), request);

                            Braintree.TransactionRequest sale = new Braintree.TransactionRequest();
                            sale.Amount             = decimal.Parse(cart.saleTotal.Replace("USD", string.Empty));
                            sale.CustomerId         = customerResult.Target.Id;
                            sale.PaymentMethodToken = customerResult.Target.DefaultPaymentMethod.Token;
                            braintree.Transaction.Sale(sale);


                            o.FirstName    = model2.FirstName;
                            o.LastName     = model2.LastName;
                            o.EmailAddress = model2.EmailAddress;
                            o.PhoneNumber  = model2.PhoneNumber;

                            o.BillingCity       = model2.BillingCity;
                            o.BillingPostalCode = model2.BillingPostalCode;
                            o.BillingReceipient = model2.BillingReceipient;
                            o.BillingStreet1    = model2.BillingStreet1;
                            o.BillingStreet2    = model2.BillingStreet2;
                            o.BillingState      = model2.BillingState;
                            o.DateCreated       = DateTime.UtcNow;
                            o.DateLastModified  = DateTime.UtcNow;
                            entities.SaveChanges();

                            return(RedirectToAction("Index", "Receipt", new { id = o.OrderId }));
                        }
                    }
                }
            }
            return(View(model2));
        }
        public async System.Threading.Tasks.Task <Microsoft.AspNetCore.Mvc.IActionResult> Checkout(Models.Order order, string braintreeNonce)
        {
            if (ModelState.IsValid)
            {
                Braintree.CustomerRequest customer = new Braintree.CustomerRequest();
                // if (User.Identity.IsAuthenticated)
                // {
                //     var user = _context.Users.Single(x => x.UserName == User.Identity.Name);
                //     customer.FirstName = user.FirstName;
                //     customer.LastName = user.LastName;
                // }
                customer.Email = order.Email;
                customer.Phone = order.Phone;
                Braintree.TransactionRequest transactionRequest = new Braintree.TransactionRequest
                {
                    Amount             = cart.Lines.Sum(cartItem => cartItem.Quantity * cartItem.Product.Price),
                    PaymentMethodNonce = order.BraintreeNonce,
                    Customer           = customer,
                    LineItems          = cart.Lines.Select(cartItem => new Braintree.TransactionLineItemRequest
                    {
                        UnitAmount   = cartItem.Product.Price,
                        Name         = cartItem.Product.Name,
                        Description  = cartItem.Product.Description,
                        Quantity     = cartItem.Quantity,
                        TotalAmount  = cartItem.Quantity * cartItem.Product.Price,
                        ProductCode  = cartItem.ProductID.ToString(),
                        LineItemKind = Braintree.TransactionLineItemKind.DEBIT
                    }).ToArray()
                };
                var transactionResult = await _braintreeGateway.Transaction.SaleAsync(transactionRequest);

                //should check for result of transactionResult here, but skipping for sake of demo'ng rest of code
                order.PlacementDate  = System.DateTime.Now;
                order.TrackingNumber = System.Guid.NewGuid().ToString().Substring(0, 8);
                order.SubTotal       = cart.Lines.Sum(x => x.Quantity * x.Product.Price);
                order.Total          = cart.Lines.Sum(x => x.Quantity * x.Product.Price);
                order.Lines          = cart.Lines.ToArray();
                repository.SaveOrder(order);
                if (debug != true)
                {
                    string HtmlLines = "";
                    foreach (Models.CartLine item in order.Lines)
                    {
                        HtmlLines = HtmlLines + "<li>" + item.ProductName + " (quantity: " + item.Quantity + ")</li>";
                    }
                    var message = new SendGrid.Helpers.Mail.SendGridMessage
                    {
                        From        = new SendGrid.Helpers.Mail.EmailAddress("*****@*****.**", "Chalky's Billiard Store Administration"),
                        Subject     = "Receipt for order #" + order.TrackingNumber,
                        HtmlContent = "<h2>Thanks!</h2><p>Thanks for placing your order.</p><p>We'll ship your goods as soon as possible.</p><br/><h2>Order details for Order #" + order.TrackingNumber +
                                      "</h2>Order Date: " + order.PlacementDate + " CT <ul>" + HtmlLines + "</ul>"
                    };
                    message.AddTo(order.Email);
                    var result = await _sendGridClient.SendEmailAsync(message);

                    //This can be helpful debug code, but we wont display it out to the user:
                    var responseBody = await result.DeserializeResponseBodyAsync(result.Body);

                    if (responseBody != null)
                    {
                        foreach (var body in responseBody)
                        {
                            System.Console.WriteLine(body.Key + ":" + body.Value);
                        }
                    }
                }
                return(RedirectToAction(nameof(Completed), new { id = order.OrderID }));
            }
            else
            {
                ViewBag.BraintreeClientToken = await _braintreeGateway.ClientToken.GenerateAsync();

                return(View(order));
            }
        }