/** * Enqueue Front-end Scripts * * @since 1.0.0 */ public function enqueue_frontend_scripts() { global $base_class; $js_dir = SC_DIR_URL . 'assets/js/'; // Localized PHP to JS global vars for front-end $localized_frontend_globals = apply_filters('simple_pay_global_script_vars', array('ajaxurl' => admin_url('admin-ajax.php'), 'nonce' => wp_create_nonce('simple_pay_checkout_nonce'), 'paymentSubmittingButtonLabel' => __('Please wait...', 'stripe'), 'couponAmountOffText' => __('off', 'stripe'), 'zeroAmountCheckoutButtonLabel' => __('Start Now', 'stripe'), 'zeroDecimalCurrencies' => Stripe_Checkout_Misc::zero_decimal_currencies(), 'scriptDebug' => defined('SCRIPT_DEBUG') && SCRIPT_DEBUG ? 'true' : 'false')); wp_enqueue_script('jquery'); wp_enqueue_script('stripe-checkout', 'https://checkout.stripe.com/checkout.js', array(), null, true); // Prefix local 3rd party libraries to prevent clashing. // Enqueued individually so we can dequeue if already enqueued by another plugin. wp_enqueue_script($base_class->plugin_slug . '-accounting', $js_dir . 'vendor/accounting' . $this->min . '.js', array(), $base_class->version, true); wp_enqueue_script($base_class->plugin_slug . '-parsley', $js_dir . 'vendor/parsley' . $this->min . '.js', array(), $base_class->version, true); wp_enqueue_script($base_class->plugin_slug . '-moment', $js_dir . 'vendor/moment' . $this->min . '.js', array(), $base_class->version, true); wp_enqueue_script($base_class->plugin_slug . '-pikaday', $js_dir . 'vendor/pikaday' . $this->min . '.js', array(), $base_class->version, true); wp_enqueue_script($base_class->plugin_slug . '-pikaday-jquery', $js_dir . 'vendor/pikaday.jquery.js', array(), $base_class->version, true); /** Plugin compatibility fixes */ // Dequeue moment.js if detected from Simple Calendar. // TODO Eventually remove reference to moment.js from FullCalendar add-on (removed in 1.0.2). if (wp_script_is('simcal-moment', 'enqueued') || wp_script_is('simcal-fullcal-moment', 'enqueued')) { wp_dequeue_script($base_class->plugin_slug . '-moment'); } // Finally enqueue our main public JS file. wp_enqueue_script($base_class->plugin_slug . '-public', $js_dir . 'pro-public' . $this->min . '.js', array('jquery', 'stripe-checkout'), $base_class->version, true); // Localize front-end global vars. wp_localize_script($base_class->plugin_slug . '-public', 'simplePayFrontendGlobals', $localized_frontend_globals); }
/** * Function to process the [stripe] shortcode * * @since 2.0.0 */ function stripe_shortcode($attr, $content = null) { global $sc_options, $sc_script_options, $script_vars; //static $sc_id = 0; // Increment static uid counter self::$sc_id++; $attr = shortcode_atts(array('name' => !(null === $sc_options->get_setting_value('name')) ? $sc_options->get_setting_value('name') : get_bloginfo('title'), 'description' => '', 'amount' => 0, 'image_url' => '', 'currency' => !(null === $sc_options->get_setting_value('currency')) ? $sc_options->get_setting_value('currency') : 'USD', 'checkout_button_label' => '', 'billing' => '', 'shipping' => '', 'payment_button_label' => !(null === $sc_options->get_setting_value('payment_button_label')) ? $sc_options->get_setting_value('payment_button_label') : __('Pay with Card', 'sc'), 'enable_remember' => !(null === $sc_options->get_setting_value('enable_remember')) ? 'true' : 'false', 'bitcoin' => !(null === $sc_options->get_setting_value('use_bitcoin')) ? 'true' : 'false', 'success_redirect_url' => !(null === $sc_options->get_setting_value('success_redirect_url')) ? $sc_options->get_setting_value('success_redirect_url') : get_permalink(), 'failure_redirect_url' => !(null === $sc_options->get_setting_value('failure_redirect_url')) ? $sc_options->get_setting_value('failure_redirect_url') : get_permalink(), 'prefill_email' => 'false', 'verify_zip' => !(null === $sc_options->get_setting_value('verify_zip')) ? 'true' : 'false', 'payment_button_style' => null === $sc_options->get_setting_value('payment_button_style') || $sc_options->get_setting_value('payment_button_style') == 'none' ? 'none' : '', 'test_mode' => 'false', 'id' => null, 'alipay' => !(null === $sc_options->get_setting_value('alipay')) ? $sc_options->get_setting_value('alipay') : 'false', 'alipay_reusable' => !(null === $sc_options->get_setting_value('alipay_reusable')) ? 'true' : 'false', 'locale' => !(null === $sc_options->get_setting_value('locale')) ? $sc_options->get_setting_value('locale') : 'en', 'payment_details_placement' => 'above', 'test_secret_key' => '', 'test_publishable_key' => '', 'live_secret_key' => '', 'live_publishable_key' => ''), $attr, 'stripe'); $name = $attr['name']; $description = $attr['description']; $amount = $attr['amount']; $image_url = $attr['image_url']; $currency = $attr['currency']; $checkout_button_label = $attr['checkout_button_label']; $billing = $attr['billing']; $shipping = $attr['shipping']; $payment_button_label = $attr['payment_button_label']; $enable_remember = $attr['enable_remember']; $bitcoin = $attr['bitcoin']; $success_redirect_url = $attr['success_redirect_url']; $failure_redirect_url = $attr['failure_redirect_url']; $prefill_email = $attr['prefill_email']; $verify_zip = $attr['verify_zip']; $payment_button_style = $attr['payment_button_style']; $test_mode = $attr['test_mode']; $id = $attr['id']; $alipay = $attr['alipay']; $alipay_reusable = $attr['alipay_reusable']; $locale = $attr['locale']; $payment_details_placement = $attr['payment_details_placement']; $test_secret_key = $attr['test_secret_key']; $test_publishable_key = $attr['test_publishable_key']; $live_secret_key = $attr['live_secret_key']; $live_publishable_key = $attr['live_publishable_key']; // Remove these first to avoid issues if there were keys set in the past but now there are not. $sc_options->delete_setting('live_secret_key_temp'); $sc_options->delete_setting('test_secret_key_temp'); if (!empty($test_secret_key)) { $sc_options->add_setting('test_secret_key_temp', $test_secret_key); } if (!empty($test_publishable_key)) { $sc_options->add_setting('test_publishable_key_temp', $test_publishable_key); } if (!empty($live_secret_key)) { $sc_options->add_setting('live_secret_key_temp', $live_secret_key); } if (!empty($live_publishable_key)) { $sc_options->add_setting('live_publishable_key_temp', $live_publishable_key); } // Generate custom form id attribute if one not specified. // Rename var for clarity. $form_id = $id; if ($form_id === null || empty($form_id)) { $form_id = 'sc_checkout_form_' . self::$sc_id; } Shortcode_Tracker::set_as_base('stripe', $attr); $test_mode = isset($_GET['test_mode']) ? 'true' : $test_mode; // Check if in test mode or live mode if (0 == $sc_options->get_setting_value('enable_live_key') || 'true' == $test_mode) { // Test mode if (!(null === $sc_options->get_setting_value('test_publishable_key_temp'))) { $data_key = $sc_options->get_setting_value('test_publishable_key_temp'); $sc_options->delete_setting('test_publishable_key_temp'); } else { $data_key = null !== $sc_options->get_setting_value('test_publish_key') ? $sc_options->get_setting_value('test_publish_key') : ''; } if (null === $sc_options->get_setting_value('test_secret_key') && null === $sc_options->get_setting_value('test_publishable_key_temp')) { $data_key = ''; } } else { // Live mode if (!(null === $sc_options->get_setting_value('live_publishable_key_temp'))) { $data_key = $sc_options->get_setting_value('live_publishable_key_temp'); $sc_options->delete_setting('live_publishable_key_temp'); } else { $data_key = null !== $sc_options->get_setting_value('live_publish_key') ? $sc_options->get_setting_value('live_publish_key') : ''; } if (null === $sc_options->get_setting_value('live_secret_key') && null === $sc_options->get_setting_value('live_publishable_key_temp')) { $data_key = ''; } } if (empty($data_key)) { if (current_user_can('manage_options')) { return '<h6>' . __('You must enter your API keys before the Stripe button will show up here.', 'sc') . '</h6>'; } return ''; } if (!empty($prefill_email) && $prefill_email !== 'false') { // Get current logged in user email if (is_user_logged_in()) { $prefill_email = get_userdata(get_current_user_id())->user_email; } else { $prefill_email = 'false'; } } // Add Parsley JS form validation attribute here. $html = '<form method="POST" action="" class="sc-checkout-form" ' . 'id="' . esc_attr($form_id) . '" ' . 'data-sc-id="' . self::$sc_id . '" ' . 'data-parsley-validate>'; // Save all of our options to an array so others can run them through a filter if they need to $sc_script_options = array('script' => array('key' => $data_key, 'name' => html_entity_decode($name), 'description' => html_entity_decode($description), 'amount' => $amount, 'image' => $image_url, 'currency' => strtoupper($currency), 'panel-label' => html_entity_decode($checkout_button_label), 'billing-address' => $billing, 'shipping-address' => $shipping, 'label' => html_entity_decode($payment_button_label), 'allow-remember-me' => $enable_remember, 'bitcoin' => $bitcoin, 'email' => $prefill_email, 'verify_zip' => $verify_zip, 'alipay' => $alipay, 'alipay_reusable' => $alipay_reusable, 'locale' => $locale), 'other' => array('success-redirect-url' => $success_redirect_url, 'failure-redirect-url' => $failure_redirect_url)); $sc_script_options = apply_filters('sc_modify_script_options', $sc_script_options); $html .= do_shortcode($content); // Set our global array based on the uid so we can make sure each button/form is unique $script_vars[self::$sc_id] = array('key' => !empty($sc_script_options['script']['key']) ? $sc_script_options['script']['key'] : (!(null === $sc_options->get_setting_value('key')) ? $sc_options->get_setting_value('key') : -1), 'name' => !empty($sc_script_options['script']['name']) ? $sc_script_options['script']['name'] : (!(null === $sc_options->get_setting_value('name')) ? $sc_options->get_setting_value('name') : -1), 'description' => !empty($sc_script_options['script']['description']) ? $sc_script_options['script']['description'] : (!(null === $sc_options->get_setting_value('description')) ? $sc_options->get_setting_value('description') : -1), 'amount' => !empty($sc_script_options['script']['amount']) ? $sc_script_options['script']['amount'] : (!(null === $sc_options->get_setting_value('amount')) ? $sc_options->get_setting_value('amount') : -1), 'image' => !empty($sc_script_options['script']['image']) ? $sc_script_options['script']['image'] : (!(null === $sc_options->get_setting_value('image_url')) ? $sc_options->get_setting_value('image_url') : -1), 'currency' => !empty($sc_script_options['script']['currency']) ? $sc_script_options['script']['currency'] : (!(null === $sc_options->get_setting_value('currency')) ? $sc_options->get_setting_value('currency') : -1), 'panelLabel' => !empty($sc_script_options['script']['panel-label']) ? $sc_script_options['script']['panel-label'] : (!(null === $sc_options->get_setting_value('checkout_button_label')) ? $sc_options->get_setting_value('checkout_button_label') : -1), 'billingAddress' => !empty($sc_script_options['script']['billing-address']) ? $sc_script_options['script']['billing-address'] : (!(null === $sc_options->get_setting_value('billing')) ? $sc_options->get_setting_value('billing') : -1), 'shippingAddress' => !empty($sc_script_options['script']['shipping-address']) ? $sc_script_options['script']['shipping-address'] : (!(null === $sc_options->get_setting_value('shipping')) ? $sc_options->get_setting_value('shipping') : -1), 'allowRememberMe' => !empty($sc_script_options['script']['allow-remember-me']) ? $sc_script_options['script']['allow-remember-me'] : (!(null === $sc_options->get_setting_value('enable_remember')) ? $sc_options->get_setting_value('enable_remember') : -1), 'bitcoin' => !empty($sc_script_options['script']['bitcoin']) ? $sc_script_options['script']['bitcoin'] : (!(null === $sc_options->get_setting_value('use_bitcoin')) ? $sc_options->get_setting_value('use_bitcoin') : -1), 'email' => !empty($sc_script_options['script']['email']) && !($sc_script_options['script']['email'] === 'false') ? $sc_script_options['script']['email'] : -1, 'zipCode' => !empty($sc_script_options['script']['verify_zip']) && !($sc_script_options['script']['verify_zip'] === 'false') ? $sc_script_options['script']['verify_zip'] : -1, 'alipay' => !empty($sc_script_options['script']['alipay']) && !($sc_script_options['script']['alipay'] === 'false') ? $sc_script_options['script']['alipay'] : -1, 'alipay_reusable' => !empty($sc_script_options['script']['alipay_reusable']) && !($sc_script_options['script']['alipay_reusable'] === 'false') ? $sc_script_options['script']['alipay_reusable'] : -1, 'locale' => !empty($sc_script_options['script']['locale']) ? $sc_script_options['script']['locale'] : 'auto', 'invalid_html_string' => __('This button has been disable because the form is not well-formed HTML. Please check your shortcode source code to make sure nothing is conflicting.', 'sc'), 'setupFee' => !empty($sc_script_options['script']['setupFee']) ? $sc_script_options['script']['setupFee'] : 0); // Run check for subscription (with setup fee) + coupon combo $has_setup_fee = false; $has_coupon = false; $subscription = Shortcode_Tracker::shortcode_exists_current('stripe_subscription'); $has_coupon = false !== Shortcode_Tracker::shortcode_exists_current('stripe_coupon') ? true : false; //echo '<pre>' . print_r( $has_subscription, true ) . '</pre>'; if (false !== $subscription) { if (isset($subscription['attr']['setup_fee']) && $subscription['attr']['setup_fee'] > 0) { $has_setup_fee = true; } else { if (isset($subscription['children'])) { // Loop through the child shortcodes to see if there is a setup fee set on any of them. foreach ($subscription['children'] as $child) { if (isset($child['attr']['setup_fee']) && $child['attr']['setup_fee'] > 0) { $has_setup_fee = true; break; } } } } } // Currently not supporting setup fee with a coupon. if ($has_coupon && $has_setup_fee) { if (current_user_can('manage_options')) { return '<h6>' . __('You cannot include a coupon and a subscription with a setup fee at the same time.', 'sc') . '</h6>'; } return; } // Check if the current user is an admin and add a script variable we can use to check this if (current_user_can('manage_options')) { $script_vars[self::$sc_id]['is_admin'] = true; } // Reference for Stripe's zero-decimal currencies in JS. $script_vars['zero_decimal_currencies'] = Stripe_Checkout_Misc::zero_decimal_currencies(); $name = $sc_script_options['script']['name']; $description = $sc_script_options['script']['description']; $amount = $sc_script_options['script']['amount']; $success_redirect_url = $sc_script_options['other']['success-redirect-url']; $failure_redirect_url = $sc_script_options['other']['failure-redirect-url']; $currency = $sc_script_options['script']['currency']; if (false !== Shortcode_Tracker::shortcode_exists_current('stripe_subscription')) { if ($bitcoin == 'true') { if (current_user_can('manage_options')) { return '<h6>' . __('Bitcoin cannot be used with Stripe subscriptions at this time.', 'sc') . '</h6>'; } return ''; } if ($alipay == 'true') { if (current_user_can('manage_options')) { return '<h6>' . __('Alipay cannot be used with Stripe subscriptions at this time.', 'sc') . '</h6>'; } return ''; } } $html .= '<input type="hidden" name="sc-name" value="' . esc_attr($name) . '" />'; $html .= '<input type="hidden" name="sc-description" value="' . esc_attr($description) . '" />'; $html .= '<input type="hidden" name="sc-amount" class="sc_amount" value="" />'; $html .= '<input type="hidden" name="sc-redirect" value="' . esc_attr(!empty($success_redirect_url) ? $success_redirect_url : get_permalink()) . '" />'; $html .= '<input type="hidden" name="sc-redirect-fail" value="' . esc_attr(!empty($failure_redirect_url) ? $failure_redirect_url : get_permalink()) . '" />'; $html .= '<input type="hidden" name="sc-currency" value="' . esc_attr($currency) . '" />'; $html .= '<input type="hidden" name="stripeToken" value="" class="sc_stripeToken" />'; $html .= '<input type="hidden" name="stripeEmail" value="" class="sc_stripeEmail" />'; $html .= '<input type="hidden" name="wp-simple-pay" value="1" />'; $html .= '<input type="hidden" name="sc-details-placement" value="' . esc_attr($payment_details_placement) . '" />'; $html .= wp_nonce_field('charge_card', 'wp-simple-pay-pro-nonce', '', false); if ($test_mode == 'true') { $html .= '<input type="hidden" name="sc_test_mode" value="true" />'; } // Add shipping information fields if it is enabled if ($shipping === 'true') { $html .= '<input type="hidden" name="sc-shipping-name" class="sc-shipping-name" value="" />'; $html .= '<input type="hidden" name="sc-shipping-country" class="sc-shipping-country" value="" />'; $html .= '<input type="hidden" name="sc-shipping-zip" class="sc-shipping-zip" value="" />'; $html .= '<input type="hidden" name="sc-shipping-state" class="sc-shipping-state" value="" />'; $html .= '<input type="hidden" name="sc-shipping-address" class="sc-shipping-address" value="" />'; $html .= '<input type="hidden" name="sc-shipping-city" class="sc-shipping-city" value="" />'; } // Add an action here to allow developers to hook into the form $filter_html = ''; $html .= apply_filters('sc_before_payment_button', $filter_html); // Payment button defaults to built-in Stripe class "stripe-button-el" unless set to "none". $html .= '<button class="sc-payment-btn' . ($payment_button_style == 'none' ? '' : ' stripe-button-el') . '"><span>' . $payment_button_label . '</span></button>'; $html .= '</form>'; //Stripe minimum amount allowed. $stripe_minimum_amount = 50; $error_count = Shortcode_Tracker::get_error_count(); Shortcode_Tracker::reset_error_count(); if ($error_count > 0 && !isset($_GET['charge'])) { if (current_user_can('manage_options')) { return Shortcode_Tracker::print_errors(); } return ''; } $has_uea = Shortcode_Tracker::shortcode_exists_current('stripe_amount'); $has_sub = Shortcode_Tracker::shortcode_exists_current('stripe_subscription'); if ((empty($amount) || $amount < $stripe_minimum_amount || !isset($amount) && !isset($_GET['charge'])) && false === $has_uea && false == $has_sub) { if (current_user_can('manage_options')) { $html = '<h6>'; $html .= __('Stripe checkout requires an amount of ', 'sc') . $stripe_minimum_amount; $html .= ' (' . Stripe_Checkout_Misc::to_formatted_amount($stripe_minimum_amount, $currency) . ' ' . $currency . ')'; $html .= __(' or larger.', 'sc'); $html .= '</h6>'; return $html; } return ''; } // Reset the static counter now in case there are multiple forms on a page $this->total_fields(true); $referer = wp_get_referer(); // Also check 'sub_id' here for trials subscriptions that don't pass 'charge' if (!isset($_GET['charge']) && !isset($_GET['error_code']) && !isset($_GET['sub_id']) || (!(null === $sc_options->get_setting_value('success_redirect_url')) || !(null === $sc_options->get_setting_value('failure_redirect_url'))) && ($referer !== false && $success_redirect_url != $referer && ($referer !== false && $failure_redirect_url != $referer)) && !isset($_GET['test_mode'])) { return $html; } return ''; }