/**
  * 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;
 }
 /**
  * Process incoming webhooks
  *
  * @since 4.0.0
  */
 public function process_webhooks()
 {
     if (!isset($_GET['listener']) || strtolower($_GET['listener']) != 'stripe') {
         return;
     }
     $body = @file_get_contents('php://input');
     $stripe_event = json_decode($body);
     $settings = get_leaky_paywall_settings();
     if ($stripe_event->livemode == false) {
         $mode == 'test';
     } else {
         $mode == 'live';
     }
     if (isset($stripe_event->type)) {
         $stripe_object = $stripe_event->data->object;
         if (!empty($stripe_object->customer)) {
             $user = get_leaky_paywall_subscriber_by_subscriber_id($stripe_object->customer, $mode);
         }
         if (!empty($user)) {
             if (is_multisite_premium()) {
                 if ($site_id = get_leaky_paywall_subscribers_site_id_by_subscriber_id($stripe_object->customer)) {
                     $site = '_' . $site_id;
                 }
             }
             //https://stripe.com/docs/api#event_types
             switch ($stripe_event->type) {
                 case 'charge.succeeded':
                     update_user_meta($user->ID, '_issuem_leaky_paywall_' . $mode . '_payment_status' . $site, 'active');
                     break;
                 case 'charge.failed':
                     update_user_meta($user->ID, '_issuem_leaky_paywall_' . $mode . '_payment_status' . $site, 'deactivated');
                     break;
                 case 'charge.refunded':
                     if ($stripe_object->refunded) {
                         update_user_meta($user->ID, '_issuem_leaky_paywall_' . $mode . '_payment_status' . $site, 'deactivated');
                     } else {
                         update_user_meta($user->ID, '_issuem_leaky_paywall_' . $mode . '_payment_status' . $site, 'deactivated');
                     }
                     break;
                 case 'charge.dispute.created':
                 case 'charge.dispute.updated':
                 case 'charge.dispute.closed':
                     break;
                 case 'customer.deleted':
                     update_user_meta($user->ID, '_issuem_leaky_paywall_' . $mode . '_payment_status' . $site, 'canceled');
                     break;
                 case 'invoice.payment_succeeded':
                     update_user_meta($user->ID, '_issuem_leaky_paywall_' . $mode . '_payment_status' . $site, 'active');
                     break;
                 case 'invoice.payment_failed':
                     update_user_meta($user->ID, '_issuem_leaky_paywall_' . $mode . '_payment_status' . $site, 'deactivated');
                     break;
                 case 'customer.subscription.updated':
                     $expires = date_i18n('Y-m-d 23:59:59', $stripe_object->current_period_end);
                     update_user_meta($user->ID, '_issuem_leaky_paywall_' . $mode . '_expires' . $site, $expires);
                     break;
                 case 'customer.subscription.created':
                     update_user_meta($user->ID, '_issuem_leaky_paywall_' . $mode . '_payment_status' . $site, 'active');
                     break;
                 case 'customer.subscription.deleted':
                     update_user_meta($user->ID, '_issuem_leaky_paywall_' . $mode . '_payment_status' . $site, 'canceled');
                     break;
             }
         }
     }
 }
示例#3
0
 function get_leaky_paywall_subscriber_by_subscriber_id($subscriber_id, $mode = false, $blog_id = false)
 {
     $site = '';
     if (empty($mode)) {
         $settings = get_leaky_paywall_settings();
         $mode = 'off' === $settings['test_mode'] ? 'live' : 'test';
     }
     if (is_multisite_premium()) {
         if (empty($blog_id)) {
             if ($blog_id = get_leaky_paywall_subscribers_site_id_by_subscriber_id($subscriber_id)) {
                 $site = '_' . $blog_id;
             }
         } else {
             $site = '_' . $blog_id;
         }
     }
     $args = array('meta_key' => '_issuem_leaky_paywall_' . $mode . '_subscriber_id' . $site, 'meta_value' => $subscriber_id);
     $users = get_users($args);
     if (!empty($users)) {
         foreach ($users as $user) {
             return $user;
         }
     }
     return false;
 }