public ActionResult Index()
        {
            //if (User.Identity.IsAuthenticated == false)     //This works, but it's verbose.  Use an attribute!
            //    return RedirectToAction("Login");
            MyAccountModel model = new MyAccountModel();

            model.EmailAddress = User.Identity.Name;

            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;
            }
            var customer = braintree.Customer.Find(userId.ToString());

            model.FirstName = customer.FirstName;
            model.LastName  = customer.LastName;
            model.Phone     = customer.Phone;
            model.Company   = customer.Company;
            model.Fax       = customer.Fax;
            model.Website   = customer.Website;
            return(View(model));
        }
        // GET: Payments
        public ActionResult Index()
        {
            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;
            }
            var customer = braintree.Customer.Find(userId.ToString());
            var model    = customer.CreditCards.Select(x => new Models.PaymentModel
            {
                CardType       = x.CardType.ToString(),
                ExpirationDate = x.ExpirationDate,
                LastFour       = x.LastFour,
                ID             = x.Token
            }).ToArray();

            return(View(model));
        }
Пример #3
0
 public StripeController(
     GlobalSettings globalSettings,
     IOptions <BillingSettings> billingSettings,
     IWebHostEnvironment hostingEnvironment,
     IOrganizationService organizationService,
     IOrganizationRepository organizationRepository,
     ITransactionRepository transactionRepository,
     IUserService userService,
     IAppleIapService appleIapService,
     IMailService mailService,
     IReferenceEventService referenceEventService,
     ILogger <StripeController> logger,
     ITaxRateRepository taxRateRepository)
 {
     _billingSettings        = billingSettings?.Value;
     _hostingEnvironment     = hostingEnvironment;
     _organizationService    = organizationService;
     _organizationRepository = organizationRepository;
     _transactionRepository  = transactionRepository;
     _userService            = userService;
     _appleIapService        = appleIapService;
     _mailService            = mailService;
     _referenceEventService  = referenceEventService;
     _taxRateRepository      = taxRateRepository;
     _logger    = logger;
     _btGateway = new Braintree.BraintreeGateway
     {
         Environment = globalSettings.Braintree.Production ?
                       Braintree.Environment.PRODUCTION : Braintree.Environment.SANDBOX,
         MerchantId = globalSettings.Braintree.MerchantId,
         PublicKey  = globalSettings.Braintree.PublicKey,
         PrivateKey = globalSettings.Braintree.PrivateKey
     };
 }
        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));
        }
Пример #5
0
        // GET: Checkout
        public ActionResult Index()
        {
            ViewBag.HeaderId    = "back";
            ViewBag.HeaderClass = "hide";
            CheckoutModel model = new CheckoutModel();

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

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

                model.Package           = new PackageModel();
                model.Package.Name      = currentPackage.Package.Name;
                model.Package.Price     = currentPackage.Package.Price;
                model.Package.Assistant = currentPackage.Package.Assistant;
                model.Package.Task      = currentPackage.Package.Task;
                model.FirstName         = currentCustomer.FirstName;
                model.LastName          = currentCustomer.LastName;
                model.EmailAddress      = currentCustomer.EmailAddress.Trim();
            }

            return(View(model));
        }
        public ActionResult Index()
        {
            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(User.Identity.Name);
            var customers = braintreeGateway.Customer.Search(search);

            if (customers.Ids != null && customers.Ids.Count() > 0)
            {
                var customer = customers.FirstItem;
                ViewBag.Addresses   = customer.Addresses;
                ViewBag.CreditCards = customer.CreditCards;
                Customer c = db.Customers.FirstOrDefault(x => x.EmailAddress == customer.Email);
                if (c != null)
                {
                    return(View(c));
                }
            }

            return(View(db.Customers.FirstOrDefault(x => x.AspNetUser.UserName == User.Identity.Name)));
        }
        public async Task <ActionResult> CreateAddress(string fname, string lname, string region, string locality, string postalCode, string street1, string street2)
        {
            if (ModelState.IsValid)
            {
                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(User.Identity.Name);
                var customers = await braintreeGateway.Customer.SearchAsync(search);

                if (customers != null)
                {
                    var customer = customers.FirstItem;
                    await braintreeGateway.Address.CreateAsync(customer.Id, new Braintree.AddressRequest {
                        FirstName     = fname,
                        LastName      = lname,
                        StreetAddress = street1 + " " + street2,
                        Locality      = locality,
                        Region        = region,
                    });
                }
                TempData["Message"] = "Address created";
                return(RedirectToAction("Index"));
            }
            return(View());
        }
Пример #8
0
        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));
        }
Пример #9
0
 public ShippingController(JoshTestContext context, Braintree.BraintreeGateway braintreeGateway, SignInManager <ApplicationUser> signInManager, SmartyStreets.USStreetApi.Client usStreetClient)
 {
     _context          = context;
     _braintreeGateway = braintreeGateway;
     _signInManager    = signInManager;
     _usStreetClient   = usStreetClient;
 }
Пример #10
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));
        }
Пример #11
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));
        }
Пример #12
0
 public ShippingController(SignInManager <ApplicationUser> signInManager,
                           SendGrid.SendGridClient sendGridClient,
                           Braintree.BraintreeGateway braintreeGateway,
                           AmonTestContext context)
 {
     this._signInManager  = signInManager;
     this._sendGridClient = sendGridClient;
     _braintreeGateway    = braintreeGateway;
     _context             = context;
 }
        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));
        }
Пример #14
0
        public async Task <IActionResult> ChargeBraintree(ChargeBraintreeModel model)
        {
            if (!ModelState.IsValid)
            {
                return(View(model));
            }

            var btGateway = new Braintree.BraintreeGateway
            {
                Environment = _globalSettings.Braintree.Production ?
                              Braintree.Environment.PRODUCTION : Braintree.Environment.SANDBOX,
                MerchantId = _globalSettings.Braintree.MerchantId,
                PublicKey  = _globalSettings.Braintree.PublicKey,
                PrivateKey = _globalSettings.Braintree.PrivateKey
            };

            var btObjIdField = model.Id[0] == 'o' ? "organization_id" : "user_id";
            var btObjId      = new Guid(model.Id.Substring(1, 32));

            var transactionResult = await btGateway.Transaction.SaleAsync(
                new Braintree.TransactionRequest
            {
                Amount     = model.Amount.Value,
                CustomerId = model.Id,
                Options    = new Braintree.TransactionOptionsRequest
                {
                    SubmitForSettlement = true,
                    PayPal = new Braintree.TransactionOptionsPayPalRequest
                    {
                        CustomField = $"{btObjIdField}:{btObjId}"
                    }
                },
                CustomFields = new Dictionary <string, string>
                {
                    [btObjIdField] = btObjId.ToString()
                }
            });

            if (!transactionResult.IsSuccess())
            {
                ModelState.AddModelError(string.Empty, "Charge failed. " +
                                         "Refer to Braintree admin portal for more information.");
            }
            else
            {
                model.TransactionId       = transactionResult.Target.Id;
                model.PayPalTransactionId = transactionResult.Target?.PayPalDetails?.CaptureId;
            }
            return(View(model));
        }
Пример #15
0
 public StripePaymentService(
     ITransactionRepository transactionRepository,
     GlobalSettings globalSettings)
 {
     _btGateway = new Braintree.BraintreeGateway
     {
         Environment = globalSettings.Braintree.Production ?
                       Braintree.Environment.PRODUCTION : Braintree.Environment.SANDBOX,
         MerchantId = globalSettings.Braintree.MerchantId,
         PublicKey  = globalSettings.Braintree.PublicKey,
         PrivateKey = globalSettings.Braintree.PrivateKey
     };
     _transactionRepository = transactionRepository;
 }
        public ActionResult DeleteAddress(string id)
        {
            string merchantId  = System.Configuration.ConfigurationManager.AppSettings["Braintree.MerchantID"];
            string environment = ConfigurationManager.AppSettings["Braintree.Environment"];
            string publicKey   = ConfigurationManager.AppSettings["Braintree.PublicKey"];
            string privateKey  = ConfigurationManager.AppSettings["Braintree.PrivateKey"];

            Braintree.BraintreeGateway      braintreeGateway = new Braintree.BraintreeGateway(environment, merchantId, publicKey, privateKey);
            Braintree.CustomerSearchRequest search           = new Braintree.CustomerSearchRequest();
            search.Email.Equals(User.Identity.Name);
            var customers = braintreeGateway.Customer.Search(search);

            if (customers.Ids != null)
            {
                var customer = customers.FirstItem;
                braintreeGateway.Address.Delete(customer.Id, id);
                TempData["Message"] = "Address Deleted";
            }
            return(RedirectToAction("Index"));
        }
Пример #17
0
        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));
        }
Пример #18
0
        // 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));
        }
Пример #19
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 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"));
        }
Пример #21
0
 public CheckoutController(DavidTestContext context, Braintree.BraintreeGateway braintreeGateway)
 {
     _context          = context;
     _braintreeGateway = braintreeGateway;
 }
Пример #22
0
        public async Task <ActionResult> Index(CheckoutViewModel model)
        {
            // if there are errors on the form, refresh the page with the previous model
            // along with errors
            if (ModelState.IsValid)
            {
                // Try to find an existing customer
                Customer currentCustomer = db.Customers.FirstOrDefault(x => x.AspNetUser.UserName == User.Identity.Name);

                // if this is an anonymous customer, create a new Customer record for them
                if (currentCustomer == null)
                {
                    currentCustomer = new Customer
                    {
                        FirstName        = model.FirstName,
                        LastName         = model.LastName,
                        EmailAddress     = model.EmailAddress,
                        PhoneNumber      = model.PhoneNumber,
                        DateCreated      = DateTime.UtcNow,
                        DateLastModified = DateTime.UtcNow
                    };
                    db.Customers.Add(currentCustomer);
                    await db.SaveChangesAsync();

                    if (Request.Cookies.AllKeys.Contains("CartName"))
                    {
                        string cartName = Request.Cookies["CartName"].Value;
                        model.CurrentCart = db.Carts.Single(x => x.Name == cartName);
                    }
                }
                else
                {
                    model.CurrentCart = currentCustomer.Carts.First();
                }



                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.TransactionRequest request = new Braintree.TransactionRequest();
                request.Amount     = model.CurrentCart.CartItems.Sum(x => x.Product.ListPrice * x.Quantity) ?? .01m;
                request.CreditCard = new Braintree.TransactionCreditCardRequest
                {
                    CardholderName  = model.CreditCardHolder,
                    CVV             = model.CreditCardVerificationValue,
                    Number          = model.CreditCardNumber,
                    ExpirationMonth = model.CreditCardExpirationMonth.ToString().PadLeft(2, '0'),
                    ExpirationYear  = model.CreditCardExpirationYear.ToString()
                };

                Braintree.Result <Braintree.Transaction> result = await braintreeGateway.Transaction.SaleAsync(request);


                if ((result.Errors == null || result.Errors.Count == 0))
                {
                    string transactionId = result.Target.Id;
                    var    order         = new Order
                    {
                        DatePlaced       = DateTime.UtcNow,
                        DateLastModified = DateTime.UtcNow,
                        CustomerID       = currentCustomer.Id,
                        OrderItems       = model.CurrentCart.CartItems.Select(x => new OrderItem
                        {
                            DateLastModified = DateTime.UtcNow,
                            Quantity         = x.Quantity,
                            ProductId        = x.ProductId,
                            PurchasePrice    = x.Product.ListPrice ?? 0
                        }).ToArray(),
                        ShippingAddressLine1 = model.ShippingAddressLine1,
                        TransactionID        = transactionId
                    };

                    // Remove the cart form the database and convert it to an order
                    db.CartItems.RemoveRange(model.CurrentCart.CartItems);
                    db.Carts.Remove(model.CurrentCart);
                    db.Orders.Add(order);
                    await db.SaveChangesAsync();

                    //Remove the basket cookie!
                    Response.SetCookie(new HttpCookie("CartName")
                    {
                        Expires = DateTime.UtcNow
                    });

                    // Send the user an e-mail with their order receipt
                    string body = "<h2>Receipt For WeirdEnsemble.com Order #" + order.TransactionID + "</h2><br/><br/>";
                    body += "<table><thead><tr><th>Item</th><th>List Price</th><th>Quantity</th><th>Total</th></tr></thead>";
                    body += "<tbody>";
                    foreach (var item in order.OrderItems)
                    {
                        body += "<tr>";
                        body += "<td>" + item.Product.Name + "</td>";
                        body += "<td>" + (item.Product.ListPrice ?? 0).ToString("C") + "</td>";
                        body += "<td>" + item.Quantity + "</td>";
                        body += "<td>" + (item.Quantity * (item.Product.ListPrice ?? 0)).ToString("C") + "</td>";
                        body += "</tr>";
                    }
                    body += "</tbody><tfoot><tr><td colspan=\"2\">";
                    body += "<td><strong>Total:</strong></td>";
                    body += "<td><strong>" + (order.OrderItems.Sum(x => x.Quantity * x.Product.ListPrice) ?? 0).ToString("C") + "</strong></td>";
                    body += "</tr></tfoot></table>";

                    SendGridEmailService mail = new SendGridEmailService();
                    await mail.SendAsync(new Microsoft.AspNet.Identity.IdentityMessage
                    {
                        Destination = order.Customer.EmailAddress,
                        Subject     = "Your WeirdEnsemble Order #" + order.TransactionID + " Receipt",
                        Body        = body
                    });


                    return(RedirectToAction("Index", "Receipt", new { id = order.TransactionID }));
                }
                else
                {
                    if (result.Target == null)
                    {
                        ModelState.AddModelError("ResultMessage", result.Message);
                    }
                    else
                    {
                        ModelState.AddModelError("CreditCardNumber", "Unable to authorize this card number");
                    }
                }
            }
            if (Request.Cookies.AllKeys.Contains("CartName"))
            {
                string cartName = Request.Cookies["CartName"].Value;
                model.CurrentCart = db.Carts.Single(x => x.Name == cartName);
            }

            return(View(model));
        }
Пример #23
0
        public ActionResult Index(Models.CheckoutDetails model)
        {
            Guid cartID = Guid.Parse(Request.Cookies["cartID"].Value);

            model.CurrentCart = db.Carts.Find(cartID);
            if (ModelState.IsValid)
            {
                string  trackingNumber = Guid.NewGuid().ToString().Substring(0, 8);
                decimal Tax            = (model.CurrentCart.Lawyer.Price + model.CurrentCart.HelpType.StandardPrice ?? 0) * .1025m;
                decimal ServiceCharge  = (model.CurrentCart.Lawyer.Price + model.CurrentCart.HelpType.StandardPrice ?? 0) * .10m;
                decimal Total          = (model.CurrentCart.Lawyer.Price + model.CurrentCart.HelpType.StandardPrice ?? 0) * 1.2025m;


                #region pay for order
                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);

                Braintree.TransactionRequest transaction = new Braintree.TransactionRequest();
                // transaction.Amount = 1m;
                transaction.Amount    = Total;
                transaction.TaxAmount = Tax;
                transaction.OrderId   = trackingNumber;

                //https://developers.braintreepayments.com/reference/general/testing/ruby
                transaction.CreditCard = new Braintree.TransactionCreditCardRequest
                {
                    CardholderName  = "Test User",
                    CVV             = "123",
                    Number          = "4111111111111111",
                    ExpirationYear  = DateTime.Now.AddMonths(1).Year.ToString(),
                    ExpirationMonth = DateTime.Now.AddMonths(1).ToString("MM")
                };

                var result = gateway.Transaction.Sale(transaction);
                #endregion

                #region save order
                Order o = new Order
                {
                    DateCreated      = DateTime.UtcNow,
                    DateLastModified = DateTime.UtcNow,
                    TrackingNumber   = trackingNumber,
                    Tax                = Tax,
                    ServiceCharge      = ServiceCharge,
                    Total              = Total,
                    Email              = model.ContactEmail,
                    CustomerName       = model.ContactName,
                    ShippingAddress1   = model.ShippingAddress,
                    ShippingCity       = model.ShippingCity,
                    ShippingPostalCode = model.ShippingPostalCode,
                    ShippingState      = model.ShippingState,
                    Day                = model.CurrentCart.Day,
                    HelpTypeID         = model.CurrentCart.HelpTypeID,
                    LawyerID           = model.CurrentCart.LawyerID
                };
                db.Orders.Add(o);
                db.SaveChanges();
                #endregion

                #region send email
                LawDoggsEmailService emailService = new LawDoggsEmailService();
                emailService.SendAsync(new Microsoft.AspNet.Identity.IdentityMessage
                {
                    Subject     = "Your Order Information",
                    Destination = model.ContactEmail,
                    Body        = "Thank you for your support, here is your order number " + "  " + trackingNumber,
                });
                #endregion

                return(RedirectToAction("Index", "Orders", new { id = trackingNumber }));
            }
            return(View(model));
        }
Пример #24
0
 public DeliveryController(BobTestContext context, Braintree.BraintreeGateway braintreeGateway, SmartyStreets.USStreetApi.Client usStreetClient)
 {
     _context          = context;
     _braintreeGateway = braintreeGateway;
     _usStreetClient   = usStreetClient;
 }
Пример #25
0
        public ActionResult Payment(CheckOut model, int?id)
        {
            Basket b = new Basket();

            using (EscapeRoomDBEntities entities = new EscapeRoomDBEntities())
            {
                //create basket
                b = entities.Baskets.Single(x => x.ID == id);

                //if logged in, update record and add basket
                if (User.Identity.IsAuthenticated)
                {
                    User user = entities.Users.Single(X => X.Email == User.Identity.Name);
                    user.FirstName   = model.FirstName;
                    user.LastName    = model.LastName;
                    user.Email       = model.Email;
                    user.Phone       = model.Phone;
                    user.DateCreated = DateTime.UtcNow;
                    b.User           = user;
                    entities.SaveChanges();
                }

                //if no login, create user and add basket
                else
                {
                    User user = new Models.User();
                    user.FirstName   = model.FirstName;
                    user.LastName    = model.LastName;
                    user.Email       = model.Email;
                    user.Phone       = model.Phone;
                    user.DateCreated = DateTime.UtcNow;
                    b.User           = user;
                    entities.SaveChanges();
                }
            }

            using (EscapeRoomDBEntities entities = new EscapeRoomDBEntities())
            {
                b = entities.Baskets.Single(x => x.ID == id);
                model.numPlayers = b.Players.Count;
                model.session    = new Models.Session
                {
                    Id    = b.Session.Id,
                    Price = b.Session.Price,
                    Title = b.Session.Title,
                    Start = b.Session.Start
                };
                model.Players = b.Players.ToArray();
            }

            //configure braintree connection and take payment
            string clientID   = ConfigurationManager.AppSettings["Braintree.ClientID"];
            string privateKey = ConfigurationManager.AppSettings["Braintree.PrivateKey"];
            string publicKey  = ConfigurationManager.AppSettings["Braintree.PublicKey"];

            Braintree.IBraintreeGateway gateway = new Braintree.BraintreeGateway(Braintree.Environment.SANDBOX, clientID, publicKey, privateKey);

            Braintree.TransactionRequest request = new Braintree.TransactionRequest
            {
                Amount             = model.session.Price * model.numPlayers,
                PaymentMethodNonce = "fake-valid-nonce",
                Customer           = new Braintree.CustomerRequest
                {
                    FirstName = model.FirstName,
                    LastName  = model.LastName,
                    Email     = model.Email
                },
                BillingAddress = new Braintree.AddressRequest
                {
                    FirstName         = model.FirstName,
                    LastName          = model.LastName,
                    StreetAddress     = model.Address,
                    ExtendedAddress   = model.Unit,
                    Locality          = model.City,
                    Region            = model.State,
                    PostalCode        = model.Zip.ToString(),
                    CountryCodeAlpha2 = "US"
                },

                Options = new Braintree.TransactionOptionsRequest
                {
                    SubmitForSettlement = true,
                    StoreInVault        = true
                },
            };



            Braintree.Result <Braintree.Transaction> result = gateway.Transaction.Sale(request);

            if (result.IsSuccess())
            {
                using (EscapeRoomDBEntities entities = new EscapeRoomDBEntities())
                {
                    Basket completedBasket = entities.Baskets.Single(x => x.ID == id);
                    completedBasket.PurchaseDate = DateTime.UtcNow;
                    entities.SaveChanges();
                }

                return(RedirectToAction("Success", "Checkout", new { id = b.ID }));
            }
            else
            {
                string errorMessages = "";
                foreach (Braintree.ValidationError error in result.Errors.DeepAll())
                {
                    errorMessages += "Error: " + (int)error.Code + " - " + error.Message + "\n";
                }
                TempData["Flash"] = errorMessages;

                return(RedirectToAction("Payment", "Checkout", new { id = b.ID }));
            }
        }
Пример #26
0
        private SmartyStreets.USStreetApi.Client _usStreetClient; // => injecting SmartyStreets

        public ShippingsController(AlejandroTestContext context, Braintree.BraintreeGateway braintreeGateway, SmartyStreets.USStreetApi.Client usStreetClient)
        {
            _context          = context;
            _braintreeGateway = braintreeGateway;
            _usStreetClient   = usStreetClient;
        }
Пример #27
0
 public CheckoutController(Braintree.BraintreeGateway braintreeGateway, SmartyStreets.USStreetApi.Client usStreetClient)
 {
     _usStreetClient   = usStreetClient;
     _braintreeGateway = braintreeGateway;
 }
Пример #28
0
 //using Microsoft.AspNetCore.Identity
 public AccountController(SignInManager <BoatChartesUser> signInManager, EmailService emailService, Braintree.BraintreeGateway braintreeGateway)
 {
     this._signInManager    = signInManager;
     this._emailService     = emailService;
     this._braintreeGateway = braintreeGateway;
 }
Пример #29
0
        public async Task <ActionResult> Index(CheckoutModel model)
        {
            if (ModelState.IsValid)
            {
                using (AppStoreEntities entities = new AppStoreEntities())
                {
                    Order o = null;
                    if (User.Identity.IsAuthenticated)
                    {
                        AspNetUser currentUser = entities.AspNetUsers.Single(x => x.UserName == User.Identity.Name);
                        o = currentUser.Orders.FirstOrDefault(x => x.TimeCompleted == null);
                        if (o == null)
                        {
                            o             = new Order();
                            o.OrderNumber = Guid.NewGuid();
                            currentUser.Orders.Add(o);
                            entities.SaveChanges();
                        }
                    }
                    else
                    {
                        if (Request.Cookies.AllKeys.Contains("orderNumber"))
                        {
                            Guid orderNumber = Guid.Parse(Request.Cookies["orderNumber"].Value);
                            o = entities.Orders.FirstOrDefault(x => x.TimeCompleted == null && x.OrderNumber == orderNumber);
                        }
                        if (o == null)
                        {
                            o             = new Order();
                            o.OrderNumber = Guid.NewGuid();
                            entities.Orders.Add(o);
                            Response.Cookies.Add(new HttpCookie("orderNumber", o.OrderNumber.ToString()));
                            entities.SaveChanges();
                        }
                    }
                    if (o.OrdersProducts.Sum(x => x.Quantity) == 0)
                    {
                        return(RedirectToAction("Index", "Cart"));
                    }

                    o.BuyerEmail = User.Identity.Name;
                    Address newShippingAddress = new Address();
                    newShippingAddress.Address1 = model.ShippingAddress1;
                    newShippingAddress.Address2 = model.ShippingAddress2;
                    newShippingAddress.City     = model.ShippingCity;
                    newShippingAddress.State    = model.ShippingState;
                    newShippingAddress.Zip      = model.ZipCode;
                    newShippingAddress.Country  = model.ShippingCountry;
                    o.Address1 = newShippingAddress;

                    WhereTo = ("\n Your Order will be shipped to the following address: \n" + model.ShippingAddress1 + "\n " + model.ShippingAddress2 + "\n " + model.ShippingCity + "\n " + model.ShippingState + "\n " + model.ZipCode);

                    entities.sp_CompleteOrder(o.ID);

                    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.TransactionRequest newTransaction = new Braintree.TransactionRequest();
                    newTransaction.Amount = o.OrdersProducts.Sum(x => x.Quantity * x.Product.Price) ?? 0.01m;

                    Braintree.TransactionCreditCardRequest creditCard = new Braintree.TransactionCreditCardRequest();
                    creditCard.CardholderName  = model.CreditCardName;
                    creditCard.CVV             = model.CreditCardVerificationValue;
                    creditCard.ExpirationMonth = model.CreditCardExpiration.Value.Month.ToString().PadLeft(2, '0');
                    creditCard.ExpirationYear  = model.CreditCardExpiration.Value.Year.ToString();
                    creditCard.Number          = model.CreditCardNumber;

                    newTransaction.CreditCard = creditCard;

                    // If the user is logged in, associate this transaction with their account
                    if (User.Identity.IsAuthenticated)
                    {
                        Braintree.CustomerSearchRequest search = new Braintree.CustomerSearchRequest();
                        search.Email.Is(User.Identity.Name);
                        var customers = braintree.Customer.Search(search);
                        newTransaction.CustomerId = customers.FirstItem.Id;
                    }

                    Braintree.Result <Braintree.Transaction> result = await braintree.Transaction.SaleAsync(newTransaction);

                    if (!result.IsSuccess())
                    {
                        ModelState.AddModelError("CreditCard", "Could not authorize payment");
                        return(View(model));
                    }

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

                    SendGrid.SendGridClient client = new SendGrid.SendGridClient(sendGridApiKey);
                    SendGrid.Helpers.Mail.SendGridMessage message = new SendGrid.Helpers.Mail.SendGridMessage();
                    //TODO: Go into SendGrid and set up a template and insert the if below
                    //message.SetTemplateId("524c7845-3ed9-4d53-81c8-b467443f8c5c");
                    message.Subject = string.Format("Receipt for order {0}", o.ID);
                    message.From    = new SendGrid.Helpers.Mail.EmailAddress("*****@*****.**", "Will Mabrey");
                    message.AddTo(new SendGrid.Helpers.Mail.EmailAddress(o.BuyerEmail));

                    string prodcuctsReceipt = "You've Ordered: ";
                    WhatWasOrdered = prodcuctsReceipt;

                    foreach (var item in o.OrdersProducts)
                    {
                        string addition = string.Format("\n " + "{0} copies of {1}", item.Quantity, item.Product.Name);
                        prodcuctsReceipt += addition;
                    }


                    SendGrid.Helpers.Mail.Content contents = new SendGrid.Helpers.Mail.Content("text/plain", string.Format("Thank you for ordering through Ye Olde App Store \n {0} {1}", prodcuctsReceipt, WhereTo));
                    message.AddSubstitution("%ordernum%", o.ID.ToString());
                    message.AddContent(contents.Type, contents.Value);

                    SendGrid.Response response = await client.SendEmailAsync(message);

                    o.TimeCompleted = DateTime.UtcNow;

                    entities.SaveChanges();
                }
                return(RedirectToAction("profile", "Home"));
            }
            return(View(model));
        }