/** * @method POST */ function post() { parse_str($this->request->data, $request); // parse request $friendlyId = trim($request['friendlyId']); $name = trim($request['name']); $s_passcode = $request['passcode']; $timeZone = $request['timeZone']; $email = ''; $password = ''; $language = DEFAULT_LANGUAGE; // language for the app $direction = DEFAULT_DIRECTION; $userId = -1; // get first name and lastname $firstName = $request['firstName']; $lastName = $request['lastName']; // validate name and friendlyId if ($friendlyId == '' || $name == '') { return new Tonic\Response(Tonic\Response::BADREQUEST); } $theme = DEFAULT_THEME; // set theme if (isset($request['theme'])) { $theme = $request['theme']; } // set language if set if (isset($request['language'])) { $language = $request['language']; } // set direction if set if (isset($request['direction'])) { $direction = $request['direction']; } // check for email and password if (isset($request['email'])) { $userLanguage = 'en-us'; if (isset($request['userLanguage'])) { $userLanguage = $request['userLanguage']; } $email = $request['email']; $password = $request['password']; // valide email and password if ($email == '' || $password == '') { return new Tonic\Response(Tonic\Response::BADREQUEST); } } else { // get an authuser $authUser = new AuthUser(); if ($authUser->UserId && $authUser->IsSuperAdmin == true) { // check if authorized $userId = $authUser->UserId; } else { return new Tonic\Response(Tonic\Response::UNAUTHORIZED); } } // defaults $domain = SITE_URL; $domain = str_replace('{{friendlyId}}', $friendlyId, $domain); $logoUrl = 'sample-logo.png'; $altLogoUrl = ''; if ($s_passcode == PASSCODE) { $isFriendlyIdUnique = Site::IsFriendlyIdUnique($friendlyId); // check for reserved names if ($friendlyId == 'app' || $friendlyId == 'sites' || $friendlyId == 'api' || $friendlyId == 'triangulate' || $friendlyId == 'developer') { $isFriendlyIdUnique = false; } if ($isFriendlyIdUnique == false) { return new Tonic\Response(Tonic\Response::CONFLICT); } // default is blank $welcomeEmail = ''; $receiptEmail = ''; // files for emails $welcome_file = APP_LOCATION . '/site/emails/welcome.html'; $receipt_file = APP_LOCATION . '/site/emails/receipt.html'; // make sure the welcome email exists if (file_exists($welcome_file)) { // get default email file $welcomeEmail = file_get_contents($welcome_file); } // make sure the receipt email exists if (file_exists($receipt_file)) { // get default email file $receiptEmail = file_get_contents($receipt_file); } // add the site $site = Site::Add($domain, $name, $friendlyId, $logoUrl, $altLogoUrl, $theme, $email, $timeZone, $language, $direction, $welcomeEmail, $receiptEmail); // add the admin if ($email != '') { $isActive = 1; // admins by default are active $user = User::Add($email, $password, $firstName, $lastName, 'Admin', $userLanguage, $isActive, $site['SiteId']); $userId = $user['UserId']; } // set $siteId $siteId = $site['SiteId']; // publishes a theme for a site Publish::PublishTheme($site, $theme); // publish default content for the theme Publish::PublishDefaultContent($site, $theme, $user['UserId']); // publish the site Publish::PublishSite($site['SiteId']); // create a locale directory $locales_dir = SITES_LOCATION . '/' . $site['FriendlyId'] . '/locales'; // create locales directory if it does not exist if (!file_exists($locales_dir)) { mkdir($locales_dir, 0755, true); } // set directory for locale $locale_dir = $locales_dir . '/' . $site['Language'] . '/'; // make the locale dir if it does not exist if (!file_exists($locale_dir)) { mkdir($locale_dir, 0755, true); } // set filename $filename = 'translation.json'; if (!file_exists($locale_dir . $filename)) { // create a blank translation file Utilities::SaveContent($locale_dir, $filename, '{}'); } // send welcome email if (SEND_WELCOME_EMAIL == true && $email != '') { $to = $email; $from = EMAILS_FROM; $fromName = EMAILS_FROM_NAME; $subject = WELCOME_EMAIL_SUBJECT; $file = WELCOME_EMAIL_FILE; // create strings to replace $loginUrl = APP_URL . '/login/' . $site['FriendlyId']; $newSiteUrl = $domain; $replace = array('{{brand-logo}}' => '<img src="' . BRAND_LOGO . '" style="max-height:50px">', '{{brand}}' => BRAND, '{{reply-to}}' => EMAILS_FROM, '{{new-site-url}}' => $newSiteUrl, '{{login-url}}' => $loginUrl); // send email from file Utilities::SendEmailFromFile($to, $from, $fromName, $subject, $replace, $file); } // send new site hook Webhooks::NewSite($site); // send new user hook Webhooks::NewUser($user); return new Tonic\Response(Tonic\Response::OK); } else { return new Tonic\Response(Tonic\Response::UNAUTHORIZED); } }
/** * @method POST */ function post() { parse_str($this->request->data, $request); // parse request $friendlyId = $request['friendlyId']; $name = $request['name']; $s_passcode = $request['passcode']; $timeZone = $request['timeZone']; $email = ''; $password = ''; $language = 'en-us'; // language for the app $userId = -1; $theme = DEFAULT_THEME; // set theme if (isset($request['theme'])) { $theme = $request['theme']; } // set language if set if (isset($request['language'])) { $language = $request['language']; } // check for email and password if (isset($request['email'])) { $userLanguage = 'en-us'; if (isset($request['userLanguage'])) { $userLanguage = $request['userLanguage']; } $email = $request['email']; $password = $request['password']; } else { // get an authuser $authUser = new AuthUser(); if ($authUser->UserUniqId && $authUser->IsSuperAdmin == true) { // check if authorized $userId = $authUser->UserId; } else { return new Tonic\Response(Tonic\Response::UNAUTHORIZED); } } // defaults $firstName = 'New'; $lastName = 'User'; $domain = APP_URL . '/sites/' . $friendlyId; $domain = str_replace('http://', '', $domain); $logoUrl = 'sample-logo.png'; if ($s_passcode == PASSCODE) { // check for uniqueness of email if ($email != '') { $isUserUnique = User::IsLoginUnique($email); if ($isUserUnique == false) { return new Tonic\Response(Tonic\Response::CONFLICT); } } $isFriendlyIdUnique = Site::IsFriendlyIdUnique($friendlyId); if ($isFriendlyIdUnique == false) { return new Tonic\Response(Tonic\Response::CONFLICT); } // add the site $site = Site::Add($domain, $name, $friendlyId, $logoUrl, $theme, $email, $timeZone, $language); // add the site // add the admin if ($email != '') { $isActive = 1; // admins by default are active $user = User::Add($email, $password, $firstName, $lastName, 'Admin', $userLanguage, $isActive, $site['SiteId']); $userId = $user['UserId']; } // set the stripe plan, customer id, status if (DEFAULT_STRIPE_PLAN != '') { Stripe::setApiKey(STRIPE_API_KEY); $customer = Stripe_Customer::create(array("plan" => DEFAULT_STRIPE_PLAN, "email" => $email)); $customerId = $customer->id; Site::EditCustomer($site['SiteUniqId'], $customerId); } // read the defaults file $default_json_file = '../themes/' . $theme . '/default.json'; // set $siteId $siteId = $site['SiteId']; // check to make sure the defaults.json exists if (file_exists($default_json_file)) { // get json from the file $json_text = file_get_contents($default_json_file); // decode json $json = json_decode($json_text, true); // pagetypes $pagetypes = array(); // menu counts $primaryMenuCount = 0; $footerMenuCount = 0; // walk through defaults array foreach ($json as &$value) { // get values from array $url = $value['url']; $source = $value['source']; $name = $value['name']; $description = $value['description']; $layout = $value['layout']; $stylesheet = $value['stylesheet']; $primaryMenu = $value['primaryMenu']; $footerMenu = $value['footerMenu']; if (strpos($url, '/') !== false) { // the url has a pagetype $arr = explode('/', $url); // get friendly ids from $url $pageTypeFriendlyId = $arr[0]; $pageFriendlyId = $arr[1]; $pageTypeId = -1; $pageType = PageType::GetByFriendlyId($pageTypeFriendlyId, $siteId); // create a new pagetype if ($pageType == NULL) { $pageType = PageType::Add($pageTypeFriendlyId, 'Page', 'Pages', $layout, $stylesheet, 0, $siteId, $userId, $userId); } // get newly minted page type $pageTypeId = $pageType['PageTypeId']; } else { // root, no pagetype $pageFriendlyId = $url; $pageTypeId = -1; } // create a page $page = Page::Add($pageFriendlyId, $name, $description, $layout, $stylesheet, $pageTypeId, $site['SiteId'], $userId); // set the page to active Page::SetIsActive($page['PageUniqId'], 1); // build the content file $filename = '../themes/' . $theme . '/' . $source; $content = ''; // get the content for the page if (file_exists($filename)) { $content = file_get_contents($filename); // fix images $content = str_replace('{{site-dir}}', 'sites/' . $site['FriendlyId'], $content); } // publish the fragment Publish::PublishFragment($site['FriendlyId'], $page['PageUniqId'], 'publish', $content); // build the primary menu if ($primaryMenu == true) { MenuItem::Add($name, '', 'primary', $url, $page['PageId'], $primaryMenuCount, $site['SiteId'], $userId, $userId); $primaryMenuCount++; } // build the footer menu if ($footerMenu == true) { MenuItem::Add($name, '', 'footer', $url, $page['PageId'], $footerMenuCount, $site['SiteId'], $userId, $userId); $footerMenuCount++; } } } else { return new Tonic\Response(Tonic\Response::BADREQUEST); } // publishes a theme for a site Publish::PublishTheme($site, $theme); // publish the site Publish::PublishSite($site['SiteUniqId']); // send welcome email if (SEND_WELCOME_EMAIL == true && $email != '') { $to = $email; $from = REPLY_TO; $fromName = REPLY_TO_NAME; $subject = BRAND . ': Welcome to ' . BRAND; $file = 'emails/new-user.html'; // create strings to replace $loginUrl = APP_URL; $newSiteUrl = APP_URL . '/sites/' . $site['FriendlyId']; $replace = array('{{brand}}' => BRAND, '{{reply-to}}' => REPLY_TO, '{{new-site-url}}' => $newSiteUrl, '{{login-url}}' => $loginUrl); // send email from file Utilities::SendEmailFromFile($to, $from, $fromName, $subject, $replace, $file); } return new Tonic\Response(Tonic\Response::OK); } else { return new Tonic\Response(Tonic\Response::UNAUTHORIZED); } }
/** * @method POST */ function post() { parse_str($this->request->data, $request); $txn_type = $request['txn_type']; $status = $request['payer_status']; $siteId = $request['custom']; $email = $request['payer_email']; $payerId = $request['payer_id']; $item_name = $request['item_name']; // parse domain preg_match('#\\((.*?)\\)#', $item_name, $match); $domain = $match[1]; // get reference to site $site = Site::GetBySiteId($siteId); // response was "VERIFIED" if ($status == 'verified' && $txn_type == 'subscr_signup') { $provider = 'PayPal'; $status = 'Active'; $subscriptionId = $payerId; $customerId = $email; // subscribe to a plan Site::Subscribe($siteId, $status, $plan, $provider, $subscriptionId, $customerId); // send success email to user $to = $site['PrimaryEmail']; $from = REPLY_TO; $fromName = REPLY_TO_NAME; $subject = BRAND . ': Thank your for subscribing to ' . BRAND; $file = APP_LOCATION . '/emails/subscribe-success.html'; $replace = array('{{brand-logo}}' => '<img src="' . BRAND_LOGO . '" style="max-height:50px">', '{{brand}}' => BRAND, '{{reply-to}}' => REPLY_TO); // send Utilities::SendEmailFromFile($to, $from, $fromName, $subject, $replace, $file); // send details email to admin $to = REPLY_TO; $from = REPLY_TO; $fromName = REPLY_TO_NAME; $subject = BRAND . ': New Subscriber'; $file = APP_LOCATION . '/emails/subscribe-details.html'; $replace = array('{{brand-logo}}' => '<img src="' . BRAND_LOGO . '" style="max-height:50px">', '{{brand}}' => BRAND, '{{reply-to}}' => REPLY_TO, '{{domain}}' => $domain, '{{siteid}}' => $site['SiteId'], '{{friendlyid}}' => $site['FriendlyId'], '{{provider}}' => $provider, '{{customerid}}' => $customerId); // send email from file Utilities::SendEmailFromFile($to, $from, $fromName, $subject, $replace, $file); } else { // IPN response was "INVALID"\ } $response = new Tonic\Response(Tonic\Response::OK); $response->contentType = 'text/HTML'; $response->body = 'Yah!!!'; return $response; }
// create strings to replace $loginUrl = APP_URL; $newSiteUrl = APP_URL . '/sites/' . $site['FriendlyId']; $replace = array('{{brand}}' => BRAND, '{{reply-to}}' => REPLY_TO, '{{login-url}}' => $loginUrl); // send email from file Utilities::SendEmailFromFile($to, $from, $fromName, $subject, $replace, $file); } } } if ($event->type == 'invoice.payment_failed') { $invoice_id = $event->data->object->id; // https://stripe.com/docs/api#retrieve_customer $customer = Stripe_Customer::retrieve($event->data->object->customer); $site = Site::GetByCustomerId($customer->id); // email receipt to customer if (SEND_PAYMENT_FAILED_EMAIL == true) { $to = $site['PrimaryEmail']; $from = REPLY_TO; $subject = BRAND . ': Payment Failed'; $file = 'emails/invoice-payment-failed.html'; // create strings to replace $loginUrl = APP_URL; $newSiteUrl = APP_URL . '/sites/' . $site['FriendlyId']; $replace = array('{{brand}}' => BRAND, '{{reply-to}}' => REPLY_TO, '{{login-url}}' => $loginUrl); // send email from file Utilities::SendEmailFromFile($to, $from, $subject, $replace, $file); } } } catch (Exception $e) { print $e->getMessage(); }
/** * @method POST */ function post() { // get token $token = Utilities::ValidateJWTToken(apache_request_headers()); // check if token is not null if ($token != NULL) { // parse request parse_str($this->request->data, $request); $site = Site::GetBySiteId($token->SiteId); $siteId = $site['SiteId']; $email = $site['PrimaryEmail']; $status = 'Unsubscribed'; $plan = ''; $provider = ''; $subscriptionId = ''; $customerId = $site['CustomerId']; // set API key Stripe::setApiKey(STRIPE_SECRET_KEY); // retrieve customer $customer = Stripe_Customer::retrieve($site['CustomerId']); // unsubscribe $cu->subscriptions->retrieve($site['SubscriptionId'])->cancel(); // unsubscribe to a plan Site::Subscribe($siteId, $status, $plan, $provider, $subscriptionId, $customerId); // send success email to user $to = $site['PrimaryEmail']; $from = REPLY_TO; $fromName = REPLY_TO_NAME; $subject = BRAND . ': You have successfully unsubscribed to ' . BRAND; $file = APP_LOCATION . '/emails/unsubscribe-success.html'; $replace = array('{{brand-logo}}' => '<img src="' . BRAND_LOGO . '" style="max-height:50px">', '{{brand}}' => BRAND, '{{reply-to}}' => REPLY_TO); // send Utilities::SendEmailFromFile($to, $from, $fromName, $subject, $replace, $file); // send details email to admin $to = REPLY_TO; $from = REPLY_TO; $fromName = REPLY_TO_NAME; $subject = BRAND . ': Unsubscribed'; $file = APP_LOCATION . '/emails/unsubscribe-details.html'; $replace = array('{{brand-logo}}' => '<img src="' . BRAND_LOGO . '" style="max-height:50px">', '{{brand}}' => BRAND, '{{reply-to}}' => REPLY_TO, '{{domain}}' => $domain, '{{siteid}}' => $site['SiteId'], '{{friendlyid}}' => $site['FriendlyId'], '{{provider}}' => $site['Provider'], '{{customerid}}' => $site['CustomerId']); // send email from file Utilities::SendEmailFromFile($to, $from, $fromName, $subject, $replace, $file); // return a json response return new Tonic\Response(Tonic\Response::OK); } else { return new Tonic\Response(Tonic\Response::UNAUTHORIZED); } }
/** * @method POST */ function post() { // parse request parse_str($this->request->data, $request); $email = $request['email']; $friendlyId = $request['friendlyId']; // get site $site = Site::GetByFriendlyId($friendlyId); // get user $user = User::GetByEmail($email, $site['SiteId']); // send email if ($user != null) { // set token $token = urlencode(User::SetToken($user['UserId'])); // send email $to = $email; $from = REPLY_TO; $fromName = REPLY_TO_NAME; $subject = BRAND . ': Reset Password'; $file = APP_LOCATION . '/emails/reset-password.html'; // create strings to replace $resetUrl = APP_URL . '/#/reset/' . $site['FriendlyId'] . '/' . $token; $replace = array('{{brand}}' => BRAND, '{{reply-to}}' => REPLY_TO, '{{reset-url}}' => $resetUrl); // send email from file Utilities::SendEmailFromFile($to, $from, $fromName, $subject, $replace, $file); // return a successful response (200) return new Tonic\Response(Tonic\Response::OK); } else { // return an unauthorized exception (401) return new Tonic\Response(Tonic\Response::UNAUTHORIZED); } }
/** * @method POST */ function post() { parse_str($this->request->data, $request); $siteUniqId = $request['custom']; // get reference to site $site = Site::GetBySiteUniqId($siteUniqId); $use_sandbox = false; // set whether to use a sandbox if ($site['PayPalUseSandbox'] == '1') { $use_sandbox = true; } $listener = new IpnListener(); $listener->use_curl = false; $listener->use_sandbox = $use_sandbox; $listener->use_ssl = true; try { $verified = $listener->processIpn(); } catch (Exception $e) { // fatal error trying to process IPN. exit(0); } // IPN response was "VERIFIED" if ($verified) { $processor = 'PayPal'; if ($use_sandbox == true) { $processor .= ' (sandbox)'; } $processorTransactionId = $request['txn_id']; $processorStatus = $request['payment_status']; $email = $request['payer_email']; $payerId = $request['payer_id']; $name = $request['first_name'] . ' ' . $request['last_name']; $shipping = $request['mc_handling']; $fee = $request['mc_fee']; $tax = $request['tax']; $total = $request['mc_gross']; $currency = $request['mc_currency']; $num_items = 1000; if (isset($request['num_cart_items'])) { $num_items = $request['num_cart_items']; } $items = array(); // line-items (for receipt) $line_items = ''; // get items for ($x = 1; $x <= $num_items; $x++) { if (isset($request['item_number' . $x])) { $arr_temp = explode('-', $request['item_number' . $x]); // shipping type is the last item of the array $item_shipping_type = $arr_temp[count($arr_temp) - 1]; // the sku is the last item less the type $item_sku = str_replace('-' . $item_shipping_type, '', $request['item_number' . $x]); $item_name = $request['item_name' . $x]; $item_sku = iconv("ISO-8859-1", "UTF-8", $item_name); $item_name = iconv("ISO-8859-1", "UTF-8", $item_name); $item_quantity = $request['quantity' . $x]; $item_total = $request['mc_gross_' . $x]; $item_price = floatval($item_total) / intval($item_quantity); $item = array('SKU' => $item_sku, 'Name' => $item_name, 'ShippingType' => $item_shipping_type, 'Quantity' => $item_quantity, 'Price' => $item_price, 'Total' => $item_total); $download_link = ''; if ($item_shipping_type == 'DOWNLOAD') { $download_link = '<br><a href="http://' . $site['Domain'] . '/api/transaction/download/{{transactionUniqId}}/' . $item_sku . '">Download</a>'; } // setup currency for line items $item_total = $item_total . ' ' . $currency; $item_price = $item_price . ' ' . $currency; // add $ for total and price if ($currency == 'USD') { $item_total = '$' . $item_total; $item_price = '$' . $item_price; } $line_items .= '<tr style="border-bottom: 1px solid #f0f0f0;"><td>' . $item_name . '<br><small>' . $item_sku . '</small>' . $download_link . '</td><td align="right">' . $item_price . '</td><td align="right">' . $item_quantity . '</td><td align="right">' . $item_total . '</td></tr>'; array_push($items, $item); } } $items_json = json_encode($items); $data_json = json_encode($_POST); // add a transaction $transaction = Transaction::Add($site['SiteId'], $processor, $processorTransactionId, $processorStatus, $email, $payerId, $name, $shipping, $fee, $tax, $total, $currency, $items_json, $data_json); // replace {{transactionUniqId}} in line_items $line_items = str_replace('{{transactionUniqId}}', $transaction['TransactionUniqId'], $line_items); $site_logo = ''; if ($site['LogoUrl'] != '' && $site['LogoUrl'] != NULL) { $site_logo = '<img src="http://' . $site['Domain'] . '/files/' . $site['LogoUrl'] . '" style="max-height:50px">'; } // setup currency for line items $shipping = $shipping . ' ' . $currency; $tax = $tax . ' ' . $currency; $total = $total . ' ' . $currency; // add $ for total and price if ($currency == 'USD') { $shipping = '$' . $shipping; $tax = '$' . $tax; $total = '$' . $total; } // send email $replace = array('{{site}}' => $site['Name'], '{{site-logo}}' => $site_logo, '{{reply-to}}' => $site['PrimaryEmail'], '{{line-items}}' => $line_items, '{{shipping}}' => $shipping, '{{tax}}' => $tax, '{{total}}' => $total); $subject = '[' . $site['Name'] . '] Receipt for your purchase from ' . $site['Name'] . ' (ID: ' . strtoupper($transaction['TransactionUniqId']) . ')'; //$file = 'sites/'.$site['FriendlyId'].'/emails/receipt.html'; $file = '/emails/receipt.html'; // send email from file Utilities::SendEmailFromFile($email, $site['PrimaryEmail'], $site['Name'], $subject, $replace, $file); } else { // IPN response was "INVALID"\ } $response = new Tonic\Response(Tonic\Response::OK); $response->contentType = 'text/HTML'; $response->body = 'Yah!!!'; return $response; }