Пример #1
0
        /**
         * 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;
 }