/** * 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; } } } }
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; }