/** * Create and Display Leaky Paywall Subscribers page * * @since 1.0.0 */ function subscribers_page() { global $blog_id; $settings = get_leaky_paywall_settings(); if (is_multisite_premium() && !is_main_site($blog_id)) { $site = '_' . $blog_id; } else { $site = ''; } $date_format = get_option('date_format'); $jquery_date_format = leaky_paywall_jquery_datepicker_format($date_format); $headings = apply_filters('leaky_paywall_bulk_add_headings', array('username', 'email', 'price', 'expires', 'status', 'level-id', 'subscriber-id')); $mode = 'off' === $settings['test_mode'] ? 'live' : 'test'; $this->display_zeen101_dot_com_leaky_rss_item(); ?> <div class="wrap"> <div id="icon-users" class="icon32"><br/></div> <h2><?php _e('Leaky Paywall Subscribers', 'issuem-leaky-paywall'); ?> </h2> <?php if (!empty($_POST['leaky_paywall_add_subscriber'])) { if (!wp_verify_nonce($_POST['leaky_paywall_add_subscriber'], 'add_new_subscriber')) { echo '<div class="error settings-error" id="setting-error-invalid_nonce"><p><strong>' . __('Unable to verify security token. Subscriber not added. Please try again.', 'issuem-leaky-paywall') . '</strong></p></div>'; } else { // process form data if (!empty($_POST['leaky-paywall-subscriber-email']) && is_email(trim(rawurldecode($_POST['leaky-paywall-subscriber-email']))) && !empty($_POST['leaky-paywall-subscriber-login'])) { $login = trim(rawurldecode($_POST['leaky-paywall-subscriber-login'])); $email = trim(rawurldecode($_POST['leaky-paywall-subscriber-email'])); $payment_gateway = trim(rawurldecode($_POST['leaky-paywall-subscriber-payment-gateway'])); $subscriber_id = trim(rawurldecode($_POST['leaky-paywall-subscriber-id'])); if (empty($_POST['leaky-paywall-subscriber-expires'])) { $expires = 0; } else { $expires = date('Y-m-d 23:59:59', strtotime(trim(urldecode($_POST['leaky-paywall-subscriber-expires'])))); } $meta = array('level_id' => $_POST['leaky-paywall-subscriber-level-id'], 'subscriber_id' => $subscriber_id, 'price' => trim($_POST['leaky-paywall-subscriber-price']), 'description' => __('Manual Addition', 'issuem-leaky-paywall'), 'expires' => $expires, 'payment_gateway' => $payment_gateway, 'payment_status' => $_POST['leaky-paywall-subscriber-status'], 'interval' => 0, 'plan' => '', 'site' => $site); $user_id = leaky_paywall_new_subscriber(NULL, $email, $subscriber_id, $meta, $login); do_action('add_leaky_paywall_subscriber', $user_id); } else { echo '<div class="error settings-error" id="setting-error-missing_email"><p><strong>' . __('You must include a valid email address.', 'issuem-leaky-paywall') . '</strong></p></div>'; } } } else { if (!empty($_POST['leaky_paywall_edit_subscriber'])) { if (!wp_verify_nonce($_POST['leaky_paywall_edit_subscriber'], 'edit_subscriber')) { echo '<div class="error settings-error" id="setting-error-invalid_nonce"><p><strong>' . __('Unable to verify security token. Subscriber not added. Please try again.', 'issuem-leaky-paywall') . '</strong></p></div>'; } else { // process form data if (!empty($_POST['leaky-paywall-subscriber-email']) && is_email(trim(rawurldecode($_POST['leaky-paywall-subscriber-email']))) && !empty($_POST['leaky-paywall-subscriber-original-email']) && is_email(trim(rawurldecode($_POST['leaky-paywall-subscriber-original-email']))) && !empty($_POST['leaky-paywall-subscriber-login']) && !empty($_POST['leaky-paywall-subscriber-original-login'])) { $orig_login = trim(rawurldecode($_POST['leaky-paywall-subscriber-original-login'])); $orig_email = trim(rawurldecode($_POST['leaky-paywall-subscriber-original-email'])); $user = get_user_by('email', $orig_email); if (!empty($user)) { $new_login = trim(rawurldecode($_POST['leaky-paywall-subscriber-login'])); $new_email = trim(rawurldecode($_POST['leaky-paywall-subscriber-email'])); $price = trim($_POST['leaky-paywall-subscriber-price']); $status = $_POST['leaky-paywall-subscriber-status']; $payment_gateway = trim(rawurldecode($_POST['leaky-paywall-subscriber-payment-gateway'])); $subscriber_id = trim(rawurldecode($_POST['leaky-paywall-subscriber-id'])); if (empty($_POST['leaky-paywall-subscriber-expires'])) { $expires = 0; } else { $expires = date('Y-m-d 23:59:59', strtotime(trim(urldecode($_POST['leaky-paywall-subscriber-expires'])))); } if ($price !== get_user_meta($user->ID, '_issuem_leaky_paywall_' . $mode . '_price' . $site, true)) { update_user_meta($user->ID, '_issuem_leaky_paywall_' . $mode . '_price' . $site, $price); } if ($expires !== get_user_meta($user->ID, '_issuem_leaky_paywall_' . $mode . '_expires' . $site, true)) { update_user_meta($user->ID, '_issuem_leaky_paywall_' . $mode . '_expires' . $site, $expires); } if ($status !== get_user_meta($user->ID, '_issuem_leaky_paywall_' . $mode . '_payment_status' . $site, true)) { update_user_meta($user->ID, '_issuem_leaky_paywall_' . $mode . '_payment_status' . $site, $status); } if ($payment_gateway !== get_user_meta($user->ID, '_issuem_leaky_paywall_' . $mode . '_payment_gateway' . $site, true)) { update_user_meta($user->ID, '_issuem_leaky_paywall_' . $mode . '_payment_gateway' . $site, $payment_gateway); } if ($subscriber_id !== get_user_meta($user->ID, '_issuem_leaky_paywall_' . $mode . '_subscriber_id' . $site, true)) { update_user_meta($user->ID, '_issuem_leaky_paywall_' . $mode . '_subscriber_id' . $site, $subscriber_id); } if ($orig_email !== $new_email) { $args = array('ID' => $user->ID); $args['user_email'] = $orig_email === $new_email ? $orig_email : $new_email; $user_id = wp_update_user($args); } if ($orig_login !== $new_login) { global $wpdb; $wpdb->update($wpdb->users, array('user_login' => $new_login), array('ID' => $user->ID), array('%s'), array('%d')); clean_user_cache($user->ID); } update_user_meta($user->ID, '_issuem_leaky_paywall_' . $mode . '_level_id' . $site, $_POST['leaky-paywall-subscriber-level-id']); do_action('update_leaky_paywall_subscriber', $user->ID); } } else { echo '<div class="error settings-error" id="setting-error-missing_email"><p><strong>' . __('You must include a valid email address.', 'issuem-leaky-paywall') . '</strong></p></div>'; } } } } //Create an instance of our package class... $subscriber_table = new Leaky_Paywall_Subscriber_List_Table(); $pagenum = $subscriber_table->get_pagenum(); //Fetch, prepare, sort, and filter our data... $subscriber_table->prepare_items(); $total_pages = $subscriber_table->get_pagination_arg('total_pages'); if ($pagenum > $total_pages && $total_pages > 0) { wp_redirect(esc_url_raw(add_query_arg('paged', $total_pages))); exit; } ?> <div id="leaky-paywall-subscriber-add-edit"> <?php $email = !empty($_GET['edit']) ? trim(rawurldecode($_GET['edit'])) : ''; $user = get_user_by('email', $email); if (!empty($email) && !empty($user)) { $login = $user->user_login; $subscriber_id = get_user_meta($user->ID, '_issuem_leaky_paywall_' . $mode . '_subscriber_id' . $site, true); $subscriber_level_id = get_user_meta($user->ID, '_issuem_leaky_paywall_' . $mode . '_level_id' . $site, true); $payment_status = get_user_meta($user->ID, '_issuem_leaky_paywall_' . $mode . '_payment_status' . $site, true); $payment_gateway = get_user_meta($user->ID, '_issuem_leaky_paywall_' . $mode . '_payment_gateway' . $site, true); $price = get_user_meta($user->ID, '_issuem_leaky_paywall_' . $mode . '_price' . $site, true); $expires = get_user_meta($user->ID, '_issuem_leaky_paywall_' . $mode . '_expires' . $site, true); if ('0000-00-00 00:00:00' === $expires) { $expires = ''; } else { $expires = mysql2date($date_format, $expires); } ?> <form id="leaky-paywall-susbcriber-edit" name="leaky-paywall-subscriber-edit" method="post"> <div style="display: table"> <p><label for="leaky-paywall-subscriber-login" style="display:table-cell"><?php _e('Username (required)', 'issuem-leaky-paywall'); ?> </label><input id="leaky-paywall-subscriber-login" class="regular-text" type="text" value="<?php echo $login; ?> " name="leaky-paywall-subscriber-login" /></p><input id="leaky-paywall-subscriber-original-login" type="hidden" value="<?php echo $login; ?> " name="leaky-paywall-subscriber-original-login" /></p> <p><label for="leaky-paywall-subscriber-email" style="display:table-cell"><?php _e('Email Address (required)', 'issuem-leaky-paywall'); ?> </label><input id="leaky-paywall-subscriber-email" class="regular-text" type="text" value="<?php echo $email; ?> " placeholder="*****@*****.**" name="leaky-paywall-subscriber-email" /></p><input id="leaky-paywall-subscriber-original-email" type="hidden" value="<?php echo $email; ?> " name="leaky-paywall-subscriber-original-email" /></p> <p><label for="leaky-paywall-subscriber-price" style="display:table-cell"><?php _e('Price Paid', 'issuem-leaky-paywall'); ?> </label><input id="leaky-paywall-subscriber-price" class="regular-text" type="text" value="<?php echo $price; ?> " placeholder="0.00" name="leaky-paywall-subscriber-price" /></p> <p> <label for="leaky-paywall-subscriber-expires" style="display:table-cell"><?php _e('Expires', 'issuem-leaky-paywall'); ?> </label><input id="leaky-paywall-subscriber-expires" class="regular-text datepicker" type="text" value="<?php echo $expires; ?> " placeholder="<?php echo date_i18n($date_format, time()); ?> "name="leaky-paywall-subscriber-expires" /> <input type="hidden" name="date_format" value="<?php echo $jquery_date_format; ?> " /> </p> <p> <label for="leaky-paywall-subscriber-level-id" style="display:table-cell"><?php _e('Subscription Level', 'issuem-leaky-paywall'); ?> </label> <select name="leaky-paywall-subscriber-level-id"> <?php foreach ($settings['levels'] as $key => $level) { echo '<option value="' . $key . '" ' . selected($key, $subscriber_level_id, true) . '>' . stripslashes($level['label']) . '</option>'; } ?> </select> </p> <p> <label for="leaky-paywall-subscriber-status" style="display:table-cell"><?php _e('Status', 'issuem-leaky-paywall'); ?> </label> <select name="leaky-paywall-subscriber-status"> <option value="active" <?php selected('active', $payment_status); ?> ><?php _e('Active', 'issuem-leaky-paywall'); ?> </option> <option value="canceled" <?php selected('canceled', $payment_status); ?> ><?php _e('Canceled', 'issuem-leaky-paywall'); ?> </option> <option value="deactivated" <?php selected('deactivated', $payment_status); ?> ><?php _e('Deactivated', 'issuem-leaky-paywall'); ?> </option> </select> </p> <p> <label for="leaky-paywall-subscriber-payment-gateway" style="display:table-cell"><?php _e('Payment Method', 'issuem-leaky-paywall'); ?> </label> <?php $payment_gateways = leaky_paywall_payment_gateways(); ?> <select name="leaky-paywall-subscriber-payment-gateway"> <?php foreach ($payment_gateways as $key => $gateway) { echo '<option value="' . $key . '" ' . selected($key, $payment_gateway, false) . '>' . $gateway . '</option>'; } echo apply_filters('leaky_paywall_subscriber_payment_gateway_select_option', ''); ?> </select> </p> <p> <label for="leaky-paywall-subscriber-id" style="display:table-cell"><?php _e('Subscriber ID', 'issuem-leaky-paywall'); ?> </label><input id="leaky-paywall-subscriber-id" class="regular-text" type="text" value="<?php echo $subscriber_id; ?> " name="leaky-paywall-subscriber-id" /> </p> <?php do_action('update_leaky_paywall_subscriber_form', $user->ID); ?> </div> <?php submit_button('Update Subscriber'); ?> <p> <a href="<?php echo esc_url(remove_query_arg('edit')); ?> "><?php _e('Cancel', 'issuem-leaky-paywall'); ?> </a> </p> <?php wp_nonce_field('edit_subscriber', 'leaky_paywall_edit_subscriber'); ?> </form> <?php } else { ?> <form id="leaky-paywall-susbcriber-add" name="leaky-paywall-subscriber-add" method="post"> <div style="display: table"> <p><label for="leaky-paywall-subscriber-login" style="display:table-cell"><?php _e('Username (required)', 'issuem-leaky-paywall'); ?> </label><input id="leaky-paywall-subscriber-login" class="regular-text" type="text" value="" name="leaky-paywall-subscriber-login" /></p> <p><label for="leaky-paywall-subscriber-email" style="display:table-cell"><?php _e('Email Address (required)', 'issuem-leaky-paywall'); ?> </label><input id="leaky-paywall-subscriber-email" class="regular-text" type="text" value="" placeholder="*****@*****.**" name="leaky-paywall-subscriber-email" /></p> <p><label for="leaky-paywall-subscriber-price" style="display:table-cell"><?php _e('Price Paid', 'issuem-leaky-paywall'); ?> </label><input id="leaky-paywall-subscriber-price" class="regular-text" type="text" value="" placeholder="0.00" name="leaky-paywall-subscriber-price" /></p> <p> <label for="leaky-paywall-subscriber-expires" style="display:table-cell"><?php _e('Expires', 'issuem-leaky-paywall'); ?> </label><input id="leaky-paywall-subscriber-expires" class="regular-text datepicker" type="text" value="" placeholder="<?php echo date_i18n($date_format, time()); ?> "name="leaky-paywall-subscriber-expires" /> <input type="hidden" name="date_format" value="<?php echo $jquery_date_format; ?> " /> </p> <p> <label for="leaky-paywall-subscriber-level-id" style="display:table-cell"><?php _e('Subscription Level', 'issuem-leaky-paywall'); ?> </label> <select name="leaky-paywall-subscriber-level-id"> <?php foreach ($settings['levels'] as $key => $level) { echo '<option value="' . $key . '">' . stripslashes($level['label']) . '</option>'; } ?> </select> </p> <p> <label for="leaky-paywall-subscriber-status" style="display:table-cell"><?php _e('Status', 'issuem-leaky-paywall'); ?> </label> <select name="leaky-paywall-subscriber-status"> <option value="active"><?php _e('Active', 'issuem-leaky-paywall'); ?> </option> <option value="canceled"><?php _e('Canceled', 'issuem-leaky-paywall'); ?> </option> <option value="deactivated"><?php _e('Deactivated', 'issuem-leaky-paywall'); ?> </option> </select> </p> <p> <label for="leaky-paywall-subscriber-payment-gateway" style="display:table-cell"><?php _e('Payment Method', 'issuem-leaky-paywall'); ?> </label> <select name="leaky-paywall-subscriber-payment-gateway"> <option value="manual"><?php _e('Manual', 'issuem-leaky-paywall'); ?> </option> <option value="stripe"><?php _e('Stripe', 'issuem-leaky-paywall'); ?> </option> <option value="paypal_standard"><?php _e('PayPal', 'issuem-leaky-paywall'); ?> </option> </select> </p> <p> <label for="leaky-paywall-subscriber-id" style="display:table-cell"><?php _e('Subscriber ID', 'issuem-leaky-paywall'); ?> </label><input id="leaky-paywall-subscriber-id" class="regular-text" type="text" value="" name="leaky-paywall-subscriber-id" /> </p> <?php do_action('add_leaky_paywall_subscriber_form'); ?> </div> <?php submit_button('Add New Subscriber'); ?> <?php wp_nonce_field('add_new_subscriber', 'leaky_paywall_add_subscriber'); ?> </form> <?php do_action('leaky_paywall_after_new_subscriber_form'); ?> <?php } ?> <br class="clear"> </div> <!-- Forms are NOT created automatically, so you need to wrap the table in one to use features like bulk actions --> <form id="leaky-paywall-subscribers" method="get"> <!-- For plugins, we also need to ensure that the form posts back to our current page --> <input type="hidden" name="page" value="<?php echo $_REQUEST['page']; ?> " /> <!-- Now we can render the completed list table --> <div class="tablenav top"> <?php $subscriber_table->user_views(); ?> <?php $subscriber_table->search_box(__('Search Subscribers'), 'issuem-leaky-paywall'); ?> </div> <?php $subscriber_table->display(); ?> </form> </div> <?php }
/** * Process registration * * @since 4.0.0 */ public function process_signup() { if (empty($_POST['stripeToken'])) { wp_die(__('Missing Stripe token, please try again or contact support if the issue persists.', 'issuem-leaky-paywall'), __('Error', 'issuem-leaky-paywall'), array('response' => 400)); } Stripe::setApiKey($this->secret_key); $paid = false; $customer_exists = false; $settings = get_leaky_paywall_settings(); $mode = 'off' === $settings['test_mode'] ? 'live' : 'test'; $level = get_leaky_paywall_subscription_level($this->level_id); $cu = false; try { if (is_multisite_premium() && !empty($level['site']) && !is_main_site($level['site'])) { $site = '_' . $level['site']; } else { $site = ''; } if (is_user_logged_in() && !is_admin()) { //Update the existing user $user_id = get_current_user_id(); $subscriber_id = get_user_meta($user_id, '_issuem_leaky_paywall_' . $mode . '_subscriber_id' . $site, true); } if (!empty($subscriber_id)) { $cu = Stripe_Customer::retrieve(get_user_meta($user_id, '_issuem_leaky_paywall_' . $mode . '_subscriber_id' . $site, true)); } if (empty($cu)) { if ($user = get_user_by('email', $this->email)) { try { $subscriber_id = get_user_meta($user->ID, '_issuem_leaky_paywall_' . $mode . '_subscriber_id' . $site, true); if (!empty($subscriber_id)) { $cu = Stripe_Customer::retrieve($subscriber_id); } else { throw new Exception(__('Unable to find valid Stripe customer ID.', 'issuem-leaky-paywall')); } } catch (Exception $e) { $cu = false; } } } if (!empty($cu)) { if (true === $cu->deleted) { $cu = array(); } else { $existing_customer = true; } } $customer_array = array('email' => $this->email, 'source' => $_POST['stripeToken'], 'description' => $this->level_name); $customer_array = apply_filters('leaky_paywall_process_stripe_payment_customer_array', $customer_array); // recurring subscription if (!empty($this->recurring) && 'on' === $this->recurring && !empty($this->plan_id)) { $customer_array['plan'] = $this->plan_id; if (!empty($cu)) { $subscriptions = $cu->subscriptions->all('limit=1'); if (!empty($subscriptions->data)) { foreach ($subscriptions->data as $subscription) { $sub = $cu->subscriptions->retrieve($subscription->id); $sub->plan = $this->plan_id; $sub->save(); } } else { $cu->subscriptions->create(array('plan' => $this->plan_id)); } } else { // new customer, and this will charge them? $cu = Stripe_Customer::create($customer_array); } } else { // Create a Customer if (empty($cu)) { $cu = Stripe_Customer::create($customer_array); } else { $cu->sources->create(array('source' => $_POST['stripeToken'])); } $charge_array = array('customer' => $cu->id, 'amount' => number_format($this->amount, 2, '', ''), 'currency' => apply_filters('leaky_paywall_stripe_currency', strtolower($this->currency)), 'description' => $this->level_name); $charge = Stripe_Charge::create($charge_array); } } catch (Exception $e) { echo '<pre>'; print_r($e); echo '</pre>'; die('stripe error'); return new WP_Error('broke', sprintf(__('Error processing request: %s', 'issuem-leaky-paywall'), $e->getMessage())); } $customer_id = $cu->id; $meta_args = array('level_id' => $this->level_id, 'subscriber_id' => $customer_id, 'subscriber_email' => $this->email, 'price' => $this->level_price, 'description' => $this->level_name, 'payment_gateway' => 'stripe', 'payment_status' => 'active', 'interval' => $this->length_unit, 'interval_count' => $this->length, 'site' => !empty($level['site']) ? $level['site'] : '', 'plan' => !empty($customer_array['plan']) ? $customer_array['plan'] : ''); if (is_user_logged_in() || !empty($existing_customer)) { $user_id = leaky_paywall_update_subscriber(NULL, $this->email, $customer_id, $meta_args); //if the email already exists, we want to update the subscriber, not create a new one } else { // create the new customer as a leaky paywall subscriber $user_id = leaky_paywall_new_subscriber(NULL, $this->email, $customer_id, $meta_args); } if ($user_id) { do_action('leaky_paywall_stripe_signup', $user_id); // log the user in wp_set_current_user($user_id); wp_set_auth_cookie($user_id, true); // redirect user after sign up 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; } else { wp_die(__('An error occurred, please contact the site administrator: ', 'leaky-paywall') . get_bloginfo('admin_email'), __('Error', 'leaky-paywall'), array('response' => '401')); } }
/** * 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; }