/**
  * Process registration
  *
  * @since 4.0.0
  */
 public function process_confirmation()
 {
     if (empty($_GET['leaky-paywall-confirm']) && $_GET['leaky-paywall-confirm'] != 'stripe_checkout') {
         return false;
     }
     $settings = get_leaky_paywall_settings();
     $this->email = $_POST['stripeEmail'];
     $this->level_id = $_POST['custom'];
     $level = get_leaky_paywall_subscription_level($this->level_id);
     $this->level_name = $level['label'];
     $this->recurring = !empty($level['recurring']) ? $level['recurring'] : false;
     $this->plan_id = !empty($level['plan_id']) ? $level['plan_id'] : false;
     $this->level_price = $level['price'];
     // @todo: Fix: this will ignore coupons
     $this->amount = $level['price'];
     $this->currency = $settings['leaky_paywall_currency'];
     $this->length_unit = $level['interval'];
     $this->length = $level['interval_count'];
     if (!class_exists('Stripe')) {
         require_once LEAKY_PAYWALL_PATH . 'include/stripe/lib/Stripe.php';
     }
     parent::process_signup();
 }
コード例 #2
0
ファイル: shortcodes.php プロジェクト: zeen101/leaky-paywall
/**
 * Outputs the default Leaky Paywall register form
 *
 * @since 3.7.0
 */
function do_leaky_paywall_register_form()
{
    $settings = get_leaky_paywall_settings();
    $level_id = isset($_GET['level_id']) ? $_GET['level_id'] : null;
    if (is_null($level_id)) {
        $content .= '<p>Please <a href="' . get_page_link($settings['page_for_subscription']) . '">go to the subscribe page</a> to choose a subscription level.</p>';
        return $content;
    }
    $level = get_leaky_paywall_subscription_level($level_id);
    global $blog_id;
    if (is_multisite_premium()) {
        $site = '_' . $blog_id;
    } else {
        $site = '';
    }
    $currency = $settings['leaky_paywall_currency'];
    $publishable_key = 'on' === $settings['test_mode'] ? $settings['test_publishable_key'] : $settings['live_publishable_key'];
    $userdata = get_userdata(get_current_user_id());
    if (!empty($userdata)) {
        $email = $userdata->user_email;
        $username = $userdata->user_login;
    } else {
        $email = '';
        $username = '';
    }
    ob_start();
    // show any error messages after form submission
    leaky_paywall_show_error_messages('register');
    ?>

		<h3><?php 
    printf(__('Your Subscription', 'leaky-paywall'));
    ?>
</h3>

		<ul>
			<li><strong><?php 
    printf(__('Subscription Name:', 'leaky-paywall'));
    ?>
</strong> <?php 
    echo $level['label'];
    ?>
</li>
			<li><strong><?php 
    printf(__('Subscription Length:', 'leaky-paywall'));
    ?>
</strong> <?php 
    echo $level['subscription_length_type'] == 'unlimited' ? 'Forever' : $level['interval_count'] . ' ' . $level['interval'] . 's';
    ?>
			<li><strong><?php 
    printf(__('Recurring:', 'leaky-paywall'));
    ?>
 </strong> <?php 
    echo !empty($level['recurring']) && $level['recurring'] == 'on' ? 'Yes' : 'No';
    ?>
</li>
			<li><strong><?php 
    printf(__('Content Access:', 'leaky-paywall'));
    ?>
</strong>
				<ul>
			<?php 
    foreach ($level['post_types'] as $type) {
        if ($type['allowed'] == 'unlimited') {
            echo '<li>' . ucfirst($type['allowed']) . ' ' . $type['post_type'] . 's</li>';
        } else {
            echo '<li>' . $type['allowed_value'] . ' ' . $type['post_type'] . 's</li>';
        }
    }
    ?>
				</ul>
			</li>
			<li><strong><?php 
    printf(__('Total:', 'leaky-paywall'));
    ?>
</strong> $<?php 
    echo number_format($level['price'], 2);
    ?>
</li>
		</ul>

		<form action="" method="POST" name="payment-form" id="leaky-paywall-payment-form" class="leaky-paywall-payment-form">
		  <span class="payment-errors"></span>

		  <div class="leaky-paywall-user-fields">

			  <h3><?php 
    printf(__('Your Details', 'leaky-paywall'));
    ?>
</h3>

			  <p class="form-row">
			    <label for="first_name"><?php 
    printf(__('First Name', 'leaky-paywall'));
    ?>
 <i class="required">*</i></label>
			    <input type="text" size="20" name="first_name"/>
			  </p>

			  <p class="form-row">
			    <label for="last_name"><?php 
    printf(__('Last Name', 'leaky-paywall'));
    ?>
 <i class="required">*</i></label>
			    <input type="text" size="20" name="last_name"/>
			  </p>
			 
			  <p class="form-row">
			    <label for="email_address"><?php 
    printf(__('Email Address', 'leaky-paywall'));
    ?>
 <i class="required">*</i></label>
			    <input type="text" size="20" name="email_address" value="<?php 
    echo $email;
    ?>
" <?php 
    echo !empty($email) ? 'disabled="disabled"' : '';
    ?>
/>
			  </p>

		  </div>

		  <div class="leaky-paywall-account-fields">

			  <h3><?php 
    printf(__('Account Details', 'leaky-paywall'));
    ?>
</h3>

			  <p class="form-row">
			    <label for="username"><?php 
    printf(__('Username', 'leaky-paywall'));
    ?>
 <i class="required">*</i></label>
			    <input type="text" size="20" name="username" value="<?php 
    echo $username;
    ?>
" <?php 
    echo !empty($username) ? 'disabled="disabled"' : '';
    ?>
/>
			  </p>

			  <p class="form-row">
			    <label for="password"><?php 
    printf(__('Password', 'leaky-paywall'));
    ?>
 <i class="required">*</i></label>
			    <input type="password" size="20" name="password"/>
			  </p>

			  <p class="form-row">
			    <label for="confirm_password"><?php 
    printf(__('Confirm Password', 'leaky-paywall'));
    ?>
 <i class="required">*</i></label>
			    <input type="password" size="20" name="confirm_password"/>
			  </p>

		  </div>

		  <?php 
    do_action('leaky_paywall_after_password_registration_field');
    ?>

		  <?php 
    $gateways = leaky_paywall_get_enabled_payment_gateways();
    if ($gateways && $level['price'] != 0) {
        foreach ($gateways as $key => $gateway) {
            echo '<input type="hidden" name="gateway" value="' . esc_attr($key) . '" />';
        }
    } else {
        echo '<input type="hidden" name="gateway" value="free_registration" />';
    }
    ?>

		  <input type="hidden" name="level_price" value="<?php 
    echo number_format($level['price'], 2);
    ?>
"/>
		  <input type="hidden" name="currency" value="<?php 
    echo $currency;
    ?>
"/>
		  <input type="hidden" name="description" value="<?php 
    echo $level['label'];
    ?>
"/>
		  <input type="hidden" name="level_id" value="<?php 
    echo $level_id;
    ?>
"/>
		  <input type="hidden" name="interval" value="<?php 
    echo $level['interval'];
    ?>
"/>
		  <input type="hidden" name="interval_count" value="<?php 
    echo $level['interval_count'];
    ?>
"/>
		  <input type="hidden" name="recurring" value="<?php 
    echo empty($level['recurring']) ? '' : $level['recurring'];
    ?>
"/>
		  <input type="hidden" name="site" value="<?php 
    echo $site;
    ?>
"/>

		  <input type="hidden" name="leaky_paywall_register_nonce" value="<?php 
    echo wp_create_nonce('leaky-paywall-register-nonce');
    ?>
"/>

		  <?php 
    do_action('leaky_paywall_before_registration_submit_field', $gateways);
    ?>

		  <button id="leaky-paywall-submit" type="submit"><?php 
    printf(__('Subscribe', 'leaky-paywall'));
    ?>
</button>
		</form>

		<?php 
    $content = ob_get_contents();
    ob_end_clean();
    return $content;
}
    /**
     * Add credit card fields
     *
     * @since 4.0.0
     */
    public function fields()
    {
        $level_id = esc_html($_GET['level_id']);
        $level = get_leaky_paywall_subscription_level($level_id);
        if ($level['price'] == 0) {
            return;
        }
        $settings = get_leaky_paywall_settings();
        $plan_args = array('stripe_price' => number_format($level['price'], 2, '', ''), 'currency' => $settings['leaky_paywall_currency'], 'secret_key' => $this->secret_key);
        if ($level['subscription_length_type'] == 'limited') {
            $stripe_plan = leaky_paywall_get_stripe_plan($level, $level_id, $plan_args);
        }
        ob_start();
        ?>

			<input type="hidden" name="plan_id" value="<?php 
        echo $stripe_plan->id;
        ?>
"/>

			<script type="text/javascript">

			var leaky_paywall_script_options;
			var leaky_paywall_processing;
			var leaky_paywall_stripe_processing = false;

			  // This identifies your website in the createToken call below
			  Stripe.setPublishableKey('<?php 
        echo $this->publishable_key;
        ?>
');

			  function stripeResponseHandler(status, response) {

			  	if (response.error) {
			  		// re-enable th submit button
			  		jQuery('#leaky-paywall-payment-form #leaky-paywall-submit').attr("disabled", false );

			  		// jQuery('#leaky-paywall-registration-form').unblock();
			  		jQuery('#leaky-paywall-submit').before('<div class="leaky-paywall-message error"><p class="leaky-paywall-error"><span>' + response.error.message + '</span></p></div>' );

			  		leaky_paywall_stripe_processing = false;
			  		leaky_paywall_processing = false;

			  	} else {

			  		var form$ = jQuery('#leaky-paywall-payment-form');
			  		var token = response['id'];

			  		form$.append('<input type="hidden" name="stripeToken" value="' + token + '" />');

			  		form$.get(0).submit();

			  	}
			  }

			  jQuery(document).ready(function($) {

			  	$('#leaky-paywall-payment-form').on('submit', function(e) {
 
			  		if ( ! leaky_paywall_stripe_processing ) {

			  			leaky_paywall_stripe_processing = true;

			  			// get the price
			  			$('input[name="stripe_price"]').val();

			  			// disabl the submit button to prevent repeated clicks
			  			$('#leaky-paywall-payment-form #leaky-paywall-submit').attr('disabled', 'disabled' );

			  			// create Stripe token
			  			Stripe.createToken({
			  				number: $('.card-num').val(),
			  				name: $('.card-name').val(),
			  				cvc: $('.cvc').val(),
			  				exp_month: $('.exp-month').val(),
			  				exp_year: $('.exp-year').val(),
			  				address_zip: $('.card-zip').val(),
			  			}, stripeResponseHandler);

			  			return false;
			  		}
			  	});
			  });


			</script>

		<?php 
        leaky_paywall_card_form();
        return ob_get_clean();
    }
 /**
  * Process PayPal IPN. This is also where Paypal Subscribe buttons are processed.
  * 
  * @since 4.0.0
  */
 public function process_webhooks()
 {
     if (!isset($_GET['listener']) || strtoupper($_GET['listener']) != 'IPN') {
         return;
     }
     $site = '';
     $mode = 'off' === $settings['test_mode'] ? 'live' : 'test';
     $settings = get_leaky_paywall_settings();
     $payload['cmd'] = '_notify-validate';
     foreach ($_POST as $key => $value) {
         $payload[$key] = stripslashes($value);
     }
     $paypal_api_url = !empty($_REQUEST['test_ipn']) ? PAYPAL_PAYMENT_SANDBOX_URL : PAYPAL_PAYMENT_LIVE_URL;
     $response = wp_remote_post($paypal_api_url, array('body' => $payload, 'httpversion' => '1.1'));
     $body = wp_remote_retrieve_body($response);
     if ('VERIFIED' === $body) {
         if (!empty($_REQUEST['txn_type'])) {
             $args = array('level_id' => isset($_REQUEST['item_number']) ? $_REQUEST['item_number'] : $_REQUEST['custom'], 'description' => $_REQUEST['item_name'], 'payment_gateway' => 'paypal_standard');
             $level = get_leaky_paywall_subscription_level($args['level_id']);
             $args['interval'] = $level['interval'];
             $args['interval_count'] = $level['interval_count'];
             if (is_multisite_premium() && !empty($level['site']) && !is_main_site($level['site'])) {
                 $site = '_' . $level['site'];
             } else {
                 $site = '';
             }
             switch ($_REQUEST['txn_type']) {
                 case 'web_accept':
                     if (isset($_REQUEST['mc_gross'])) {
                         //subscr_payment
                         $args['price'] = $_REQUEST['mc_gross'];
                     } else {
                         if (isset($_REQUEST['payment_gross'])) {
                             //subscr_payment
                             $args['price'] = $_REQUEST['payment_gross'];
                         }
                     }
                     if (isset($_REQUEST['txn_id'])) {
                         //subscr_payment
                         $args['subscr_id'] = $_REQUEST['txn_id'];
                     }
                     $args['plan'] = '';
                     if ('completed' === strtolower($_REQUEST['payment_status'])) {
                         $args['payment_status'] = 'active';
                     } else {
                         $args['payment_status'] = 'deactivated';
                     }
                     break;
                 case 'subscr_signup':
                     if (isset($_REQUEST['mc_amount3'])) {
                         //subscr_payment
                         $args['price'] = $_REQUEST['mc_amount3'];
                     } else {
                         if (isset($_REQUEST['amount3'])) {
                             //subscr_payment
                             $args['price'] = $_REQUEST['amount3'];
                         }
                     }
                     if (isset($_REQUEST['subscr_id'])) {
                         //subscr_payment
                         $args['subscr_id'] = $_REQUEST['subscr_id'];
                     }
                     if (isset($_REQUEST['period3'])) {
                         $args['plan'] = $_REQUEST['period3'];
                         $new_expiration = date_i18n('Y-m-d 23:59:59', strtotime('+' . str_replace(array('D', 'W', 'M', 'Y'), array('Days', 'Weeks', 'Months', 'Years'), $args['plan']), strtotime($_REQUEST['subscr_date'])));
                         $args['expires'] = $new_expiration;
                     }
                     $args['payment_status'] = 'active';
                     //It's a signup, of course it's active!
                     break;
                 case 'subscr_payment':
                     if (isset($_REQUEST['mc_gross'])) {
                         //subscr_payment
                         $args['price'] = $_REQUEST['mc_gross'];
                     } else {
                         if (isset($_REQUEST['payment_gross'])) {
                             //subscr_payment
                             $args['price'] = $_REQUEST['payment_gross'];
                         }
                     }
                     if (!empty($_REQUEST['subscr_id'])) {
                         //subscr_payment
                         $args['subscr_id'] = $_REQUEST['subscr_id'];
                     }
                     if ('completed' === strtolower($_REQUEST['payment_status'])) {
                         $args['payment_status'] = 'active';
                     } else {
                         $args['payment_status'] = 'deactivated';
                     }
                     $user = get_leaky_paywall_subscriber_by_subscriber_id($args['subscr_id'], $mode);
                     if (is_multisite_premium()) {
                         if ($site_id = get_leaky_paywall_subscribers_site_id_by_subscriber_id($_REQUEST['subscr_id'])) {
                             $site = '_' . $site_id;
                         }
                     }
                     if (!empty($user) && 0 !== $user->ID && ($plan = get_user_meta($user->ID, '_issuem_leaky_paywall_' . $mode . '_plan' . $site, true)) && 'completed' === strtolower($_REQUEST['payment_status'])) {
                         $args['plan'] = $plan;
                         $new_expiration = date_i18n('Y-m-d 23:59:59', strtotime('+' . str_replace(array('D', 'W', 'M', 'Y'), array('Days', 'Weeks', 'Months', 'Years'), $plan), strtotime($_REQUEST['payment_date'])));
                         $args['expires'] = $new_expiration;
                     } else {
                         $args['plan'] = $level['interval_count'] . ' ' . strtoupper(substr($level['interval'], 0, 1));
                         $new_expiration = date_i18n('Y-m-d 23:59:59', strtotime('+' . str_replace(array('D', 'W', 'M', 'Y'), array('Days', 'Weeks', 'Months', 'Years'), $args['plan']), strtotime($_REQUEST['payment_date'])));
                         $args['expires'] = $new_expiration;
                     }
                     break;
                 case 'subscr_cancel':
                     if (isset($_REQUEST['subscr_id'])) {
                         //subscr_payment
                         $user = get_leaky_paywall_subscriber_by_subscriber_id($_REQUEST['subscr_id'], $mode);
                         if (is_multisite_premium()) {
                             if ($site_id = get_leaky_paywall_subscribers_site_id_by_subscriber_id($_REQUEST['subscr_id'])) {
                                 $site = '_' . $site_id;
                             }
                         }
                         if (!empty($user) && 0 !== $user->ID) {
                             update_user_meta($user->ID, '_issuem_leaky_paywall_' . $mode . '_payment_status' . $site, 'canceled');
                         }
                     }
                     return true;
                     //We don't need to process anymore
                 //We don't need to process anymore
                 case 'subscr_eot':
                     if (isset($_REQUEST['subscr_id'])) {
                         //subscr_payment
                         $user = get_leaky_paywall_subscriber_by_subscriber_id($_REQUEST['subscr_id'], $mode);
                         if (is_multisite_premium()) {
                             if ($site_id = get_leaky_paywall_subscribers_site_id_by_subscriber_id($_REQUEST['subscr_id'])) {
                                 $site = '_' . $site_id;
                             }
                         }
                         if (!empty($user) && 0 !== $user->ID) {
                             update_user_meta($user->ID, '_issuem_leaky_paywall_' . $mode . '_payment_status' . $site, 'expired');
                         }
                     }
                     return true;
                     //We don't need to process anymore
                 //We don't need to process anymore
                 case 'recurring_payment_suspended_due_to_max_failed_payment':
                     if (isset($_REQUEST['recurring_payment_id'])) {
                         //subscr_payment
                         $user = get_leaky_paywall_subscriber_by_subscriber_id($args['recurring_payment_id'], $mode);
                         if (is_multisite_premium()) {
                             if ($site_id = get_leaky_paywall_subscribers_site_id_by_subscriber_id($_REQUEST['recurring_payment_id'])) {
                                 $site = '_' . $site_id;
                             }
                         }
                         if (!empty($user) && 0 !== $user->ID) {
                             update_user_meta($user->ID, '_issuem_leaky_paywall_' . $mode . '_payment_status' . $site, 'deactivated');
                         }
                     }
                     return true;
                     //We don't need to process anymore
                 //We don't need to process anymore
                 case 'recurring_payment_suspended':
                     if (isset($_REQUEST['subscr_id'])) {
                         //subscr_payment
                         $user = get_leaky_paywall_subscriber_by_subscriber_id($_REQUEST['subscr_id'], $mode);
                         if (is_multisite_premium()) {
                             if ($site_id = get_leaky_paywall_subscribers_site_id_by_subscriber_id($_REQUEST['subscr_id'])) {
                                 $site = '_' . $site_id;
                             }
                         }
                         if (!empty($user) && 0 !== $user->ID) {
                             update_user_meta($user->ID, '_issuem_leaky_paywall_' . $mode . '_payment_status' . $site, 'suspended');
                         }
                     } else {
                         if (isset($_REQUEST['recurring_payment_id'])) {
                             //subscr_payment
                             $user = get_leaky_paywall_subscriber_by_subscriber_id($args['recurring_payment_id'], $mode);
                             if (is_multisite_premium()) {
                                 if ($site_id = get_leaky_paywall_subscribers_site_id_by_subscriber_id($_REQUEST['recurring_payment_id'])) {
                                     $site = '_' . $site_id;
                                 }
                             }
                             if (!empty($user) && 0 !== $user->ID) {
                                 update_user_meta($user->ID, '_issuem_leaky_paywall_' . $mode . '_payment_status' . $site, 'suspended');
                             }
                         }
                     }
                     return true;
                     //We don't need to process anymore
             }
             if (!empty($_REQUEST['custom']) && is_email($_REQUEST['custom'])) {
                 $user = get_user_by('email', $_REQUEST['custom']);
                 if (empty($user)) {
                     $user = get_leaky_paywall_subscriber_by_subscriber_email($_REQUEST['custom'], $mode);
                     if (is_multisite_premium()) {
                         if ($site_id = get_leaky_paywall_subscribers_site_id_by_subscriber_email($_REQUEST['custom'])) {
                             $args['site'] = $site_id;
                         }
                     }
                 }
             }
             if (empty($user) && !empty($_REQUEST['payer_email']) && is_email($_REQUEST['payer_email'])) {
                 $user = get_user_by('email', $_REQUEST['payer_email']);
                 if (empty($user)) {
                     $user = get_leaky_paywall_subscriber_by_subscriber_email($_REQUEST['payer_email'], $mode);
                     if (is_multisite_premium()) {
                         if ($site_id = get_leaky_paywall_subscribers_site_id_by_subscriber_email($_REQUEST['payer_email'])) {
                             $args['site'] = $site_id;
                         }
                     }
                 }
             }
             if (empty($user) && !empty($_REQUEST['txn_id'])) {
                 $user = get_leaky_paywall_subscriber_by_subscriber_id($_REQUEST['txn_id'], $mode);
                 if (is_multisite_premium()) {
                     if ($site_id = get_leaky_paywall_subscribers_site_id_by_subscriber_id($_REQUEST['txn_id'])) {
                         $args['site'] = $site_id;
                     }
                 }
             }
             if (empty($user) && !empty($_REQUEST['subscr_id'])) {
                 $user = get_leaky_paywall_subscriber_by_subscriber_id($_REQUEST['subscr_id'], $mode);
                 if (is_multisite_premium()) {
                     if ($site_id = get_leaky_paywall_subscribers_site_id_by_subscriber_id($_REQUEST['subscr_id'])) {
                         $args['site'] = $site_id;
                     }
                 }
             }
             if (!empty($user)) {
                 //WordPress user exists
                 $args['subscriber_email'] = $user->user_email;
                 leaky_paywall_update_subscriber(NULL, $args['subscriber_email'], $args['subscr_id'], $args);
             } else {
                 //Need to create a new user
                 $args['subscriber_email'] = is_email($_REQUEST['custom']) ? $_REQUEST['custom'] : $_REQUEST['payer_email'];
                 leaky_paywall_new_subscriber(NULL, $args['subscriber_email'], $args['subscr_id'], $args);
             }
         }
     } else {
         error_log(sprintf(__('Invalid IPN sent from PayPal: %s', 'issuem-leaky-paywall'), maybe_serialize($payload)));
     }
     return true;
 }
コード例 #5
0
/**
 * Regsiter a new user
 *
 * @since 4.0.0
 */
function leaky_paywall_process_registration()
{
    if (!isset($_POST['leaky_paywall_register_nonce'])) {
        return;
    }
    if (!wp_verify_nonce($_POST['leaky_paywall_register_nonce'], 'leaky-paywall-register-nonce')) {
        return;
    }
    $settings = get_leaky_paywall_settings();
    global $user_ID;
    $level_id = isset($_POST['level_id']) ? absint($_POST['level_id']) : false;
    // get the selected payment method
    if (!isset($_POST['gateway'])) {
        $gateway = 'paypal';
    } else {
        $gateway = sanitize_text_field($_POST['gateway']);
    }
    /** 
     * Validate the Form
     */
    // validate user data
    $user_data = leaky_paywall_validate_user_data();
    // Validate extra fields in gateways
    do_action('leaky_paywall_form_errors', $_POST);
    // retrieve all error messages, if any
    $errors = leaky_paywall_errors()->get_error_messages();
    // only create the user if there are no errors
    if (!empty($errors)) {
        return;
    }
    // create a new user
    if ($user_data['need_new']) {
        $user_data['id'] = wp_insert_user(array('user_login' => $user_data['login'], 'user_pass' => $user_data['password'], 'user_email' => $user_data['email'], 'first_name' => $user_data['first_name'], 'last_name' => $user_data['last_name'], 'display_name' => $user_data['first_name'] . ' ' . $user_data['last_name'], 'user_registered' => date('Y-m-d H:i:s')));
    }
    if (empty($user_data['id'])) {
        return;
    }
    // add details about the subscription to newly created subscriber
    if ($user_data['id']) {
        $meta = array('level_id' => $level_id, 'price' => sanitize_text_field($_POST['level_price']), 'description' => sanitize_text_field($_POST['description']), 'plan' => sanitize_text_field($_POST['plan_id']), 'created' => date('Y-m-d H:i:s'), 'subscriber_id' => '', 'payment_gateway' => $gateway);
        $level = get_leaky_paywall_subscription_level($level_id);
        $mode = 'off' === $settings['test_mode'] ? 'live' : 'test';
        if (is_multisite_premium() && !empty($level['site']) && !is_main_site($level['site'])) {
            $site = '_' . $level['site'];
        } else {
            $site = '';
        }
        // set free level subscribers to active
        if ($meta['price'] == '0') {
            $meta['payment_status'] = 'active';
        }
        foreach ($meta as $key => $value) {
            update_user_meta($user_data['id'], '_issuem_leaky_paywall_' . $mode . '_' . $key . $site, $value);
        }
        do_action('leaky_paywall_form_processing', $_POST, $user_data['id'], $meta['price'], $mode, $site);
        if ($meta['price'] > '0') {
            if (!empty($discount)) {
                // record usage of discount code
            }
            $subscription_data = array('amount' => sanitize_text_field($_POST['level_price']), 'description' => sanitize_text_field($_POST['description']), 'user_id' => $user_data['id'], 'user_name' => $user_data['login'], 'user_email' => $user_data['email'], 'first_name' => $user_data['first_name'], 'last_name' => $user_data['last_name'], 'level_id' => $meta['level_id'], 'level_price' => sanitize_text_field($_POST['level_price']), 'plan_id' => sanitize_text_field($_POST['plan_id']), 'currency' => $settings['leaky_paywall_currency'], 'length' => sanitize_text_field($_POST['interval_count']), 'length_unit' => sanitize_text_field($_POST['interval']), 'recurring' => sanitize_text_field($_POST['recurring']), 'site' => sanitize_text_field($_POST['site']), 'new_user' => $user_data['need_new'], 'post_data' => $_POST);
            // send all data to the gateway for processing
            leaky_paywall_send_to_gateway($gateway, apply_filters('leaky_paywall_subscription_data', $subscription_data));
        } else {
            // process a free subscription
            $subscription_data = array('length' => sanitize_text_field($_POST['interval_count']), 'length_unit' => sanitize_text_field($_POST['interval']), 'site' => $site, 'mode' => $mode);
            leaky_paywall_set_expiration_date($user_data['id'], $subscription_data);
            // send email notification
            // @todo add a free version of the email notification, not just new
            leaky_paywall_email_subscription_status($user_data['id'], 'new', $user_data);
            do_action('leaky_paywall_after_free_user_created', $user_data['id'], $_POST);
            // log the new user in
            wp_setcookie($user_data['login'], $user_data['password'], true);
            wp_set_current_user($user_data['id'], $user_data['login']);
            do_action('wp_login', $user_data['login']);
            // send the newly created user to the appropriate page after logging them in
            if (!empty($settings['page_for_after_subscribe'])) {
                wp_safe_redirect(get_page_link($settings['page_for_after_subscribe']));
            } else {
                if (!empty($settings['page_for_profile'])) {
                    wp_safe_redirect(get_page_link($settings['page_for_profile']));
                } else {
                    if (!empty($settings['page_for_subscription'])) {
                        wp_safe_redirect(get_page_link($settings['page_for_subscription']));
                    }
                }
            }
            exit;
        }
        // @todo: move login and redirect code here so that it doesn't have to be included in each payment gateway
    }
}