/** * Handles PayPal® IPN processing. * * These same routines also handle s2Member Pro/PayPal® Pro operations; * giving you the ability *( as needed )* to Hook into these routines using * WordPress® Hooks/Filters; as seen in the source code below. * * Please do NOT modify the source code directly. * Instead, use WordPress® Hooks/Filters. * * For example, if you'd like to add your own custom conditionals, use: * ``add_filter ("ws_plugin__s2member_during_paypal_notify_conditionals", "your_function");`` * * @package s2Member\PayPal * @since 3.5 * * @attaches-to ``add_action("init");`` * * @return null Or exits script execution after handling IPN procesing. */ public static function paypal_notify() { global $current_site, $current_blog; /* For Multisite support. */ /**/ do_action("ws_plugin__s2member_before_paypal_notify", get_defined_vars()); /**/ if (!empty($_GET["s2member_paypal_notify"]) && ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_business"] || !empty($_GET["s2member_paypal_proxy"]))) { @ignore_user_abort(true); /* Important. Continue processing even if/when the connection is broken by the sending party. */ /**/ include_once ABSPATH . "wp-admin/includes/admin.php"; /* Get administrative functions. Needed for `wp_delete_user()`. */ /**/ $email_configs_were_on = c_ws_plugin__s2member_email_configs::email_config_status(); /* Filters on? */ c_ws_plugin__s2member_email_configs::email_config_release(); /* Release s2Member Filters. */ /**/ if (is_array($paypal = c_ws_plugin__s2member_paypal_utilities::paypal_postvars()) && ($_paypal = $paypal) && ($_paypal_s = serialize($_paypal))) { $paypal["s2member_log"][] = "IPN received on: " . date("D M j, Y g:i:s a T"); $paypal["s2member_log"][] = "s2Member POST vars verified " . (!empty($paypal["proxy_verified"]) ? "with a Proxy Key" : "through a POST back to PayPal®."); /**/ $payment_status_issues = "/^(failed|denied|expired|refunded|partially_refunded|reversed|reversal|canceled_reversal|voided)\$/i"; /**/ $paypal["subscr_gateway"] = !empty($_GET["s2member_paypal_proxy"]) ? esc_html(trim(stripslashes($_GET["s2member_paypal_proxy"]))) : "paypal"; /**/ if (empty($paypal["custom"]) && !empty($paypal["recurring_payment_id"])) { /* Lookup on Recurring Profiles? */ $paypal["custom"] = c_ws_plugin__s2member_utils_users::get_user_custom_with($paypal["recurring_payment_id"]); } /**/ if (!empty($paypal["custom"]) && preg_match("/^" . preg_quote(preg_replace("/\\:([0-9]+)\$/", "", $_SERVER["HTTP_HOST"]), "/") . "/i", $paypal["custom"])) { $paypal["s2member_log"][] = "s2Member originating domain ( `\$_SERVER[\"HTTP_HOST\"]` ) validated."; /**/ eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;'); if (!apply_filters("ws_plugin__s2member_during_paypal_notify_conditionals", false, get_defined_vars())) { unset($__refs, $__v); /* Unset defined __refs, __v. */ /**/ if ($_paypal_cp = c_ws_plugin__s2member_paypal_notify_in_virtual_terminal::cp(get_defined_vars())) { $paypal = $_paypal_cp; } else { if ($_paypal_cp = c_ws_plugin__s2member_paypal_notify_in_express_checkout::cp(get_defined_vars())) { $paypal = $_paypal_cp; } else { if ($_paypal_cp = c_ws_plugin__s2member_paypal_notify_in_cart::cp(get_defined_vars())) { $paypal = $_paypal_cp; } else { if ($_paypal_cp = c_ws_plugin__s2member_paypal_notify_in_send_money::cp(get_defined_vars())) { $paypal = $_paypal_cp; } else { if ($_paypal_cp = c_ws_plugin__s2member_paypal_notify_in_web_accept_sp::cp(get_defined_vars())) { $paypal = $_paypal_cp; } else { if ($_paypal_cp = c_ws_plugin__s2member_paypal_notify_in_wa_ccaps_wo_level::cp(get_defined_vars())) { $paypal = $_paypal_cp; } else { if ($_paypal_cp = c_ws_plugin__s2member_paypal_notify_in_subscr_or_wa_w_level::cp(get_defined_vars())) { $paypal = $_paypal_cp; } else { if ($_paypal_cp = c_ws_plugin__s2member_paypal_notify_in_rec_profile_creation_w_level::cp(get_defined_vars())) { $paypal = $_paypal_cp; } else { if ($_paypal_cp = c_ws_plugin__s2member_paypal_notify_in_subscr_modify_w_level::cp(get_defined_vars())) { $paypal = $_paypal_cp; } else { if ($_paypal_cp = c_ws_plugin__s2member_paypal_notify_in_subscr_or_rp_payment_w_level::cp(get_defined_vars())) { $paypal = $_paypal_cp; } else { if ($_paypal_cp = c_ws_plugin__s2member_paypal_notify_in_subscr_or_rp_payment_failed_w_level::cp(get_defined_vars())) { $paypal = $_paypal_cp; } else { if ($_paypal_cp = c_ws_plugin__s2member_paypal_notify_in_subscr_or_rp_cancellation_w_level::cp(get_defined_vars())) { $paypal = $_paypal_cp; } else { if ($_paypal_cp = c_ws_plugin__s2member_paypal_notify_in_subscr_or_rp_eots_w_level::cp(get_defined_vars())) { $paypal = $_paypal_cp; } else { if ($_paypal_cp = c_ws_plugin__s2member_paypal_notify_in_sp_refund_reversal::cp(get_defined_vars())) { $paypal = $_paypal_cp; } else { /* Ignoring this IPN request. The txn_type/status does NOT require any action. */ $paypal["s2member_log"][] = "Ignoring this IPN request. The `txn_type/status` does NOT require any action on the part of s2Member."; } } } } } } } } } } } } } } } else { /* Else a custom conditional has been applied by Filters. */ unset($__refs, $__v); } /* Unset defined __refs, __v. */ } else { if (!empty($paypal["txn_type"]) && preg_match("/^recurring_payment_profile_cancel\$/i", $paypal["txn_type"])) { $paypal["s2member_log"][] = "Transaction type ( `recurring_payment_profile_cancel` ), but there is no match to an existing account; so verification of `\$_SERVER[\"HTTP_HOST\"]` was not possible."; $paypal["s2member_log"][] = "It's likely this account was just upgraded/downgraded by s2Member Pro; so the Subscr. ID has probably been updated on-site; nothing to worry about here."; } else { if (!empty($paypal["txn_type"]) && preg_match("/^recurring_/i", $paypal["txn_type"])) { /* Otherwise, is this a ^recurring_ txn_type? */ $paypal["s2member_log"][] = "Transaction type ( `^recurring_?` ), but there is no match to an existing account; so verification of `\$_SERVER[\"HTTP_HOST\"]` was not possible."; } else { /* Else, use the default ``$_SERVER["HTTP_HOST"]`` error. */ $paypal["s2member_log"][] = "Unable to verify `\$_SERVER[\"HTTP_HOST\"]`. Please check the `custom` value in your Button Code. It MUST start with your domain name."; } } } } else { $paypal["s2member_log"][] = "Unable to verify \$_POST vars. This is most likely related to an invalid configuration of s2Member, or a problem with server compatibility."; $paypal["s2member_log"][] = "If you're absolutely SURE that your configuration is valid, you may want to run some tests on your server, just to be sure \$_POST variables are populated, and that your server is able to connect/communicate with your Payment Gateway over an HTTPS connection."; $paypal["s2member_log"][] = "s2Member uses the `WP_Http` class for remote connections; which will try to use `cURL` first, and then fall back on the `FOPEN` method when `cURL` is not available. On a Windows® server, you may have to disable your `cURL` extension; and instead, set `allow_url_fopen = yes` in your php.ini file. The `cURL` extension (usually) does NOT support SSL connections on a Windows® server."; $paypal["s2member_log"][] = "Please see this thread: `http://www.primothemes.com/forums/viewtopic.php?f=36&t=2636` for details regarding the ideal server configuration for s2Member."; $paypal["s2member_log"][] = var_export($_REQUEST, true); /* Recording _POST + _GET vars for analysis and debugging. */ } /**/ if ($email_configs_were_on) { /* Back on? */ c_ws_plugin__s2member_email_configs::email_config(); } /* Add IPN proxy ( when available ) to the ``$paypal`` array. */ if (!empty($_GET["s2member_paypal_proxy"])) { $paypal["s2member_paypal_proxy"] = $_GET["s2member_paypal_proxy"]; } /* Add IPN proxy use vars ( when available ) to the ``$paypal`` array. */ if (!empty($_GET["s2member_paypal_proxy_use"])) { $paypal["s2member_paypal_proxy_use"] = $_GET["s2member_paypal_proxy_use"]; } /* Also add IPN proxy self-verification ( when available ) to the ``$paypal`` array. */ if (!empty($_GET["s2member_paypal_proxy_verification"])) { $paypal["s2member_paypal_proxy_verification"] = $_GET["s2member_paypal_proxy_verification"]; } /* If debugging/logging is enabled; we need to append ``$paypal`` to the log file. Logging now supports Multisite Networking as well. */ $logv = c_ws_plugin__s2member_utilities::ver_details(); $logm = c_ws_plugin__s2member_utilities::mem_details(); $log4 = $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"] . "\nUser-Agent: " . $_SERVER["HTTP_USER_AGENT"]; $log4 = is_multisite() && !is_main_site() ? ($_log4 = $current_blog->domain . $current_blog->path) . "\n" . $log4 : $log4; $log2 = is_multisite() && !is_main_site() ? "paypal-ipn-4-" . trim(preg_replace("/[^a-z0-9]/i", "-", $_log4), "-") . ".log" : "paypal-ipn.log"; /**/ if ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["gateway_debug_logs"]) { if (is_dir($logs_dir = $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["logs_dir"])) { if (is_writable($logs_dir) && c_ws_plugin__s2member_utils_logs::archive_oversize_log_files()) { file_put_contents($logs_dir . "/" . $log2, $logv . "\n" . $logm . "\n" . $log4 . "\n" . var_export($paypal, true) . "\n\n", FILE_APPEND); } } } /**/ eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;'); do_action("ws_plugin__s2member_during_paypal_notify", get_defined_vars()); unset($__refs, $__v); /* Unset defined __refs, __v. */ /**/ status_header(200); /* Send a 200 OK status header. */ header("Content-Type: text/plain; charset=utf-8"); /* Content-Type text/plain with UTF-8. */ eval('while (@ob_end_clean ());'); /* End/clean all output buffers that may or may not exist. */ /**/ exit(!empty($paypal["s2member_paypal_proxy_return_url"]) ? $paypal["s2member_paypal_proxy_return_url"] : ""); } /**/ eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;'); do_action("ws_plugin__s2member_after_paypal_notify", get_defined_vars()); unset($__refs, $__v); /* Unset defined __refs, __v. */ }
/** * Handles PayPal IPN processing. * * These same routines also handle s2Member Pro/PayPal Pro operations; * giving you the ability *(as needed)* to Hook into these routines using * WordPress Hooks/Filters; as seen in the source code below. * * Please do NOT modify the source code directly. * Instead, use WordPress Hooks/Filters. * * For example, if you'd like to add your own custom conditionals, use: * ``add_filter ('ws_plugin__s2member_during_paypal_notify_conditionals', 'your_function');`` * * @package s2Member\PayPal * @since 3.5 * * @attaches-to ``add_action('init');`` */ public static function paypal_notify() { global $current_site, $current_blog; do_action('ws_plugin__s2member_before_paypal_notify', get_defined_vars()); if (!empty($_GET['s2member_paypal_notify']) && ($GLOBALS['WS_PLUGIN__']['s2member']['o']['paypal_business'] || !empty($_REQUEST['s2member_paypal_proxy']))) { @ignore_user_abort(TRUE); // Important. Continue processing even if/when the connection is broken by the sending party. include_once ABSPATH . 'wp-admin/includes/admin.php'; // Get administrative functions. Needed for `wp_delete_user()`. $email_configs_were_on = c_ws_plugin__s2member_email_configs::email_config_status(); // Filters on? c_ws_plugin__s2member_email_configs::email_config_release(); // Release s2Member Filters. $paypal = array(); // Initialize PayPal array; we also reference this with a variable for a possible proxy handler. if (!empty($_REQUEST['s2member_paypal_proxy']) && in_array($_REQUEST['s2member_paypal_proxy'], array('alipay', 'stripe', 'authnet', 'clickbank', 'ccbill', 'google'), TRUE)) { ${esc_html(trim(stripslashes($_REQUEST['s2member_paypal_proxy'])))} =& $paypal; } // Internal alias by reference. if (is_array($paypal = c_ws_plugin__s2member_paypal_utilities::paypal_postvars()) && ($_paypal = $paypal) && ($_paypal_s = serialize($_paypal))) { $paypal['s2member_log'][] = 'IPN received on: ' . date('D M j, Y g:i:s a T'); $paypal['s2member_log'][] = 's2Member POST vars verified ' . (!empty($paypal['proxy_verified']) ? 'with a Proxy Key' : 'through a POST back to PayPal.'); $payment_status_issues = '/^(failed|denied|expired|refunded|partially_refunded|reversed|reversal|canceled_reversal|voided)$/i'; $paypal['subscr_gateway'] = !empty($_REQUEST['s2member_paypal_proxy']) ? esc_html(trim(stripslashes($_REQUEST['s2member_paypal_proxy']))) : 'paypal'; $coupon = !empty($_REQUEST['s2member_paypal_proxy_coupon']) && is_array($_REQUEST['s2member_paypal_proxy_coupon']) ? stripslashes_deep($_REQUEST['s2member_paypal_proxy_coupon']) : array(); $coupon = isset($coupon['full_coupon_code'], $coupon['coupon_code'], $coupon['affiliate_id']) && is_string($coupon['full_coupon_code']) && is_string($coupon['coupon_code']) && is_string($coupon['affiliate_id']) ? $coupon : array('full_coupon_code' => '', 'coupon_code' => '', 'affiliate_id' => ''); if (!empty($paypal['txn_type']) && $paypal['txn_type'] === 'merch_pmt') { // This is mostly irrelevant, but it helps to keep the logs cleaner. sleep(15); } // Wait for Pro-Form procesing to complete. if (empty($paypal['custom']) && !empty($paypal['recurring_payment_id'])) { // Recurring Profile ID. $paypal['custom'] = c_ws_plugin__s2member_utils_users::get_user_custom_with($paypal['recurring_payment_id']); } else { if (empty($paypal['custom']) && !empty($paypal['mp_id'])) { // Billing Agreement ID. $paypal['custom'] = c_ws_plugin__s2member_utils_users::get_user_custom_with($paypal['mp_id']); } } if (!empty($paypal['custom']) && preg_match('/^' . preg_quote(preg_replace('/\\:([0-9]+)$/', '', $_SERVER['HTTP_HOST']), '/') . '/i', $paypal['custom'])) { $paypal['s2member_log'][] = 's2Member originating domain (`$_SERVER["HTTP_HOST"]`) validated.'; foreach (array_keys(get_defined_vars()) as $__v) { $__refs[$__v] =& ${$__v}; } if (!apply_filters('ws_plugin__s2member_during_paypal_notify_conditionals', FALSE, get_defined_vars())) { unset($__refs, $__v); // From the filter above. if ($_paypal_cp = c_ws_plugin__s2member_paypal_notify_in_virtual_terminal::cp(get_defined_vars())) { $paypal = $_paypal_cp; } else { if ($_paypal_cp = c_ws_plugin__s2member_paypal_notify_in_express_checkout::cp(get_defined_vars())) { $paypal = $_paypal_cp; } else { if ($_paypal_cp = c_ws_plugin__s2member_paypal_notify_in_cart::cp(get_defined_vars())) { $paypal = $_paypal_cp; } else { if ($_paypal_cp = c_ws_plugin__s2member_paypal_notify_in_send_money::cp(get_defined_vars())) { $paypal = $_paypal_cp; } else { if ($_paypal_cp = c_ws_plugin__s2member_paypal_notify_in_web_accept_sp::cp(get_defined_vars())) { $paypal = $_paypal_cp; } else { if ($_paypal_cp = c_ws_plugin__s2member_paypal_notify_in_wa_ccaps_wo_level::cp(get_defined_vars())) { $paypal = $_paypal_cp; } else { if ($_paypal_cp = c_ws_plugin__s2member_paypal_notify_in_subscr_or_wa_w_level::cp(get_defined_vars())) { $paypal = $_paypal_cp; } else { if ($_paypal_cp = c_ws_plugin__s2member_paypal_notify_in_rec_profile_creation_w_level::cp(get_defined_vars())) { $paypal = $_paypal_cp; } else { if ($_paypal_cp = c_ws_plugin__s2member_paypal_notify_in_subscr_modify_w_level::cp(get_defined_vars())) { $paypal = $_paypal_cp; } else { if ($_paypal_cp = c_ws_plugin__s2member_paypal_notify_in_subscr_or_rp_payment_w_level::cp(get_defined_vars())) { $paypal = $_paypal_cp; } else { if ($_paypal_cp = c_ws_plugin__s2member_paypal_notify_in_subscr_or_rp_payment_failed_w_level::cp(get_defined_vars())) { $paypal = $_paypal_cp; } else { if ($_paypal_cp = c_ws_plugin__s2member_paypal_notify_in_subscr_or_rp_cancellation_w_level::cp(get_defined_vars())) { $paypal = $_paypal_cp; } else { if ($_paypal_cp = c_ws_plugin__s2member_paypal_notify_in_subscr_or_rp_eots_w_level::cp(get_defined_vars())) { $paypal = $_paypal_cp; } else { if ($_paypal_cp = c_ws_plugin__s2member_paypal_notify_in_sp_refund_reversal::cp(get_defined_vars())) { $paypal = $_paypal_cp; } else { if ($_paypal_cp = c_ws_plugin__s2member_paypal_notify_in_billing_agreement_signup::cp(get_defined_vars())) { $paypal = $_paypal_cp; } else { // Ignoring this IPN request. The txn_type/status does NOT require any action. $paypal['s2member_log'][] = 'Ignoring this IPN request. The `txn_type/status` does NOT require any action on the part of s2Member.'; } } } } } } } } } } } } } } } } else { unset($__refs, $__v); } // Else a custom conditional has been applied by Filters. } else { if (!empty($paypal['txn_type']) && preg_match('/^recurring_payment_profile_cancel$/i', $paypal['txn_type'])) { $paypal['s2member_log'][] = 'Transaction type (`recurring_payment_profile_cancel`), but there is no match to an existing account; so verification of `$_SERVER["HTTP_HOST"]` was not possible.'; $paypal['s2member_log'][] = 'It\'s likely this account was just upgraded/downgraded by s2Member Pro; so the Subscr. ID has probably been updated on-site; nothing to worry about here.'; } else { if (!empty($paypal['txn_type']) && preg_match('/^recurring_/i', $paypal['txn_type'])) { // Otherwise, is this a ^recurring_ txn_type? $paypal['s2member_log'][] = 'Transaction type (`^recurring_?`), but there is no match to an existing account; so verification of `$_SERVER["HTTP_HOST"]` was not possible.'; } else { // Else, use the default ``$_SERVER['HTTP_HOST']`` error. $paypal['s2member_log'][] = 'Unable to verify `$_SERVER["HTTP_HOST"]`. Please check the `custom` value in your Button Code. It MUST start with your domain name.'; } } } } else { $paypal['s2member_log'][] = 'Unable to verify $_POST vars. This is most likely related to an invalid configuration of s2Member, or a problem with server compatibility.'; $paypal['s2member_log'][] = 'Please see this KB article: `http://www.s2member.com/kb/server-scanner/`. We suggest that you run the s2Member Server Scanner.'; $paypal['s2member_log'][] = var_export($_REQUEST, TRUE); // Recording _POST + _GET vars for analysis and debugging. } if ($email_configs_were_on) { // Back on? c_ws_plugin__s2member_email_configs::email_config(); } /* Add IPN proxy (when available) to the ``$paypal`` array. */ if (!empty($_REQUEST['s2member_paypal_proxy'])) { $paypal['s2member_paypal_proxy'] = esc_html(trim(stripslashes((string) $_REQUEST['s2member_paypal_proxy']))); } /* Add IPN proxy use vars (when available) to the ``$paypal`` array. */ if (!empty($_REQUEST['s2member_paypal_proxy_use'])) { $paypal['s2member_paypal_proxy_use'] = esc_html(trim(stripslashes((string) $_REQUEST['s2member_paypal_proxy_use']))); } /* Add IPN proxy coupon vars (when available) to the ``$paypal`` array. */ if (!empty($_REQUEST['s2member_paypal_proxy_coupon'])) { $paypal['s2member_paypal_proxy_coupon'] = stripslashes_deep((array) $_REQUEST['s2member_paypal_proxy_coupon']); } /* Also add IPN proxy self-verification (when available) to the ``$paypal`` array. */ if (!empty($_REQUEST['s2member_paypal_proxy_verification'])) { $paypal['s2member_paypal_proxy_verification'] = esc_html(trim(stripslashes((string) $_REQUEST['s2member_paypal_proxy_verification']))); } /* If debugging/logging is enabled; we need to append ``$paypal`` to the log file. Logging now supports Multisite Networking as well. */ $logt = c_ws_plugin__s2member_utilities::time_details(); $logv = c_ws_plugin__s2member_utilities::ver_details(); $logm = c_ws_plugin__s2member_utilities::mem_details(); $log4 = $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] . "\n" . 'User-Agent: ' . @$_SERVER['HTTP_USER_AGENT']; $log4 = is_multisite() && !is_main_site() ? ($_log4 = $current_blog->domain . $current_blog->path) . "\n" . $log4 : $log4; $log2 = is_multisite() && !is_main_site() ? 'gateway-core-ipn-4-' . trim(preg_replace('/[^a-z0-9]/i', '-', !empty($_log4) ? $_log4 : ''), '-') . '.log' : 'gateway-core-ipn.log'; if ($GLOBALS['WS_PLUGIN__']['s2member']['o']['gateway_debug_logs']) { if (is_dir($logs_dir = $GLOBALS['WS_PLUGIN__']['s2member']['c']['logs_dir'])) { if (is_writable($logs_dir) && c_ws_plugin__s2member_utils_logs::archive_oversize_log_files()) { file_put_contents($logs_dir . '/' . $log2, 'LOG ENTRY: ' . $logt . "\n" . $logv . "\n" . $logm . "\n" . $log4 . "\n" . c_ws_plugin__s2member_utils_logs::conceal_private_info(var_export($paypal, TRUE)) . "\n\n", FILE_APPEND); } } } foreach (array_keys(get_defined_vars()) as $__v) { $__refs[$__v] =& ${$__v}; } do_action('ws_plugin__s2member_during_paypal_notify', get_defined_vars()); unset($__refs, $__v); status_header(200); // Send a 200 OK status header. header('Content-Type: text/plain; charset=UTF-8'); // Content-Type text/plain with UTF-8. while (@ob_end_clean()) { } // Clean any existing output buffers. exit(!empty($paypal['s2member_paypal_proxy_return_url']) ? $paypal['s2member_paypal_proxy_return_url'] : ''); } foreach (array_keys(get_defined_vars()) as $__v) { $__refs[$__v] =& ${$__v}; } do_action('ws_plugin__s2member_after_paypal_notify', get_defined_vars()); unset($__refs, $__v); }
/** * Handles PayPal IPN processing. * * These same routines also handle s2Member Pro/PayPal Pro operations; * giving you the ability *(as needed)* to Hook into these routines using * WordPress Hooks/Filters; as seen in the source code below. * * Please do NOT modify the source code directly. * Instead, use WordPress Hooks/Filters. * * For example, if you'd like to add your own custom conditionals, use: * ``add_filter ("ws_plugin__s2member_during_paypal_notify_conditionals", "your_function");`` * * @package s2Member\PayPal * @since 3.5 * * @attaches-to ``add_action("init");`` * * @return null Or exits script execution after handling IPN procesing. */ public static function paypal_notify() { global $current_site, $current_blog; do_action("ws_plugin__s2member_before_paypal_notify", get_defined_vars()); if (!empty($_GET["s2member_paypal_notify"]) && ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_business"] || !empty($_REQUEST["s2member_paypal_proxy"]))) { @ignore_user_abort(true); // Important. Continue processing even if/when the connection is broken by the sending party. include_once ABSPATH . "wp-admin/includes/admin.php"; // Get administrative functions. Needed for `wp_delete_user()`. $email_configs_were_on = c_ws_plugin__s2member_email_configs::email_config_status(); // Filters on? c_ws_plugin__s2member_email_configs::email_config_release(); // Release s2Member Filters. $paypal = array(); // Initialize PayPal array; we also reference this with a variable for a possible proxy handler. if (!empty($_REQUEST["s2member_paypal_proxy"]) && in_array($_REQUEST["s2member_paypal_proxy"], array("alipay", "authnet", "clickbank", "ccbill", "google"), TRUE)) { ${esc_html(trim(stripslashes($_REQUEST["s2member_paypal_proxy"])))} =& $paypal; } // Internal alias by reference. if (is_array($paypal = c_ws_plugin__s2member_paypal_utilities::paypal_postvars()) && ($_paypal = $paypal) && ($_paypal_s = serialize($_paypal))) { $paypal["s2member_log"][] = "IPN received on: " . date("D M j, Y g:i:s a T"); $paypal["s2member_log"][] = "s2Member POST vars verified " . (!empty($paypal["proxy_verified"]) ? "with a Proxy Key" : "through a POST back to PayPal."); $payment_status_issues = "/^(failed|denied|expired|refunded|partially_refunded|reversed|reversal|canceled_reversal|voided)\$/i"; $paypal["subscr_gateway"] = !empty($_REQUEST["s2member_paypal_proxy"]) ? esc_html(trim(stripslashes($_REQUEST["s2member_paypal_proxy"]))) : "paypal"; $coupon = !empty($_REQUEST["s2member_paypal_proxy_coupon"]) && is_array($_REQUEST["s2member_paypal_proxy_coupon"]) ? stripslashes_deep($_REQUEST["s2member_paypal_proxy_coupon"]) : array(); $coupon = isset($coupon["full_coupon_code"], $coupon["coupon_code"], $coupon["affiliate_id"]) && is_string($coupon["full_coupon_code"]) && is_string($coupon["coupon_code"]) && is_string($coupon["affiliate_id"]) ? $coupon : array("full_coupon_code" => "", "coupon_code" => "", "affiliate_id" => ""); if (!empty($paypal["txn_type"]) && $paypal["txn_type"] === "merch_pmt") { // This is mostly irrelevant, but it helps to keep the logs cleaner. sleep(5); } // Wait for Pro Form procesing to complete. if (empty($paypal["custom"]) && !empty($paypal["recurring_payment_id"])) { // Recurring Profile ID. $paypal["custom"] = c_ws_plugin__s2member_utils_users::get_user_custom_with($paypal["recurring_payment_id"]); } else { if (empty($paypal["custom"]) && !empty($paypal["mp_id"])) { // Lookup; based on a Billing Agreement ID. $paypal["custom"] = c_ws_plugin__s2member_utils_users::get_user_custom_with($paypal["mp_id"]); } } if (!empty($paypal["custom"]) && preg_match("/^" . preg_quote(preg_replace("/\\:([0-9]+)\$/", "", $_SERVER["HTTP_HOST"]), "/") . "/i", $paypal["custom"])) { $paypal["s2member_log"][] = "s2Member originating domain ( `\$_SERVER[\"HTTP_HOST\"]` ) validated."; foreach (array_keys(get_defined_vars()) as $__v) { $__refs[$__v] =& ${$__v}; } if (!apply_filters("ws_plugin__s2member_during_paypal_notify_conditionals", false, get_defined_vars())) { unset($__refs, $__v); if ($_paypal_cp = c_ws_plugin__s2member_paypal_notify_in_virtual_terminal::cp(get_defined_vars())) { $paypal = $_paypal_cp; } else { if ($_paypal_cp = c_ws_plugin__s2member_paypal_notify_in_express_checkout::cp(get_defined_vars())) { $paypal = $_paypal_cp; } else { if ($_paypal_cp = c_ws_plugin__s2member_paypal_notify_in_cart::cp(get_defined_vars())) { $paypal = $_paypal_cp; } else { if ($_paypal_cp = c_ws_plugin__s2member_paypal_notify_in_send_money::cp(get_defined_vars())) { $paypal = $_paypal_cp; } else { if ($_paypal_cp = c_ws_plugin__s2member_paypal_notify_in_web_accept_sp::cp(get_defined_vars())) { $paypal = $_paypal_cp; } else { if ($_paypal_cp = c_ws_plugin__s2member_paypal_notify_in_wa_ccaps_wo_level::cp(get_defined_vars())) { $paypal = $_paypal_cp; } else { if ($_paypal_cp = c_ws_plugin__s2member_paypal_notify_in_subscr_or_wa_w_level::cp(get_defined_vars())) { $paypal = $_paypal_cp; } else { if ($_paypal_cp = c_ws_plugin__s2member_paypal_notify_in_rec_profile_creation_w_level::cp(get_defined_vars())) { $paypal = $_paypal_cp; } else { if ($_paypal_cp = c_ws_plugin__s2member_paypal_notify_in_subscr_modify_w_level::cp(get_defined_vars())) { $paypal = $_paypal_cp; } else { if ($_paypal_cp = c_ws_plugin__s2member_paypal_notify_in_subscr_or_rp_payment_w_level::cp(get_defined_vars())) { $paypal = $_paypal_cp; } else { if ($_paypal_cp = c_ws_plugin__s2member_paypal_notify_in_subscr_or_rp_payment_failed_w_level::cp(get_defined_vars())) { $paypal = $_paypal_cp; } else { if ($_paypal_cp = c_ws_plugin__s2member_paypal_notify_in_subscr_or_rp_cancellation_w_level::cp(get_defined_vars())) { $paypal = $_paypal_cp; } else { if ($_paypal_cp = c_ws_plugin__s2member_paypal_notify_in_subscr_or_rp_eots_w_level::cp(get_defined_vars())) { $paypal = $_paypal_cp; } else { if ($_paypal_cp = c_ws_plugin__s2member_paypal_notify_in_sp_refund_reversal::cp(get_defined_vars())) { $paypal = $_paypal_cp; } else { if ($_paypal_cp = c_ws_plugin__s2member_paypal_notify_in_billing_agreement_signup::cp(get_defined_vars())) { $paypal = $_paypal_cp; } else { if ($_paypal_cp = c_ws_plugin__s2member_paypal_notify_in_merch_pmt::cp(get_defined_vars())) { $paypal = $_paypal_cp; } else { // Ignoring this IPN request. The txn_type/status does NOT require any action. $paypal["s2member_log"][] = "Ignoring this IPN request. The `txn_type/status` does NOT require any action on the part of s2Member."; } } } } } } } } } } } } } } } } } else { // Else a custom conditional has been applied by Filters. unset($__refs, $__v); } } else { if (!empty($paypal["txn_type"]) && preg_match("/^recurring_payment_profile_cancel\$/i", $paypal["txn_type"])) { $paypal["s2member_log"][] = "Transaction type ( `recurring_payment_profile_cancel` ), but there is no match to an existing account; so verification of `\$_SERVER[\"HTTP_HOST\"]` was not possible."; $paypal["s2member_log"][] = "It's likely this account was just upgraded/downgraded by s2Member Pro; so the Subscr. ID has probably been updated on-site; nothing to worry about here."; } else { if (!empty($paypal["txn_type"]) && preg_match("/^recurring_/i", $paypal["txn_type"])) { // Otherwise, is this a ^recurring_ txn_type? $paypal["s2member_log"][] = "Transaction type ( `^recurring_?` ), but there is no match to an existing account; so verification of `\$_SERVER[\"HTTP_HOST\"]` was not possible."; } else { // Else, use the default ``$_SERVER["HTTP_HOST"]`` error. $paypal["s2member_log"][] = "Unable to verify `\$_SERVER[\"HTTP_HOST\"]`. Please check the `custom` value in your Button Code. It MUST start with your domain name."; } } } } else { $paypal["s2member_log"][] = "Unable to verify \$_POST vars. This is most likely related to an invalid configuration of s2Member, or a problem with server compatibility."; $paypal["s2member_log"][] = "Please see this KB article: `http://www.s2member.com/kb/server-scanner/`. We suggest that you run the s2Member Server Scanner."; $paypal["s2member_log"][] = var_export($_REQUEST, true); // Recording _POST + _GET vars for analysis and debugging. } if ($email_configs_were_on) { // Back on? c_ws_plugin__s2member_email_configs::email_config(); } /* Add IPN proxy (when available) to the ``$paypal`` array. */ if (!empty($_REQUEST["s2member_paypal_proxy"])) { $paypal["s2member_paypal_proxy"] = esc_html(trim(stripslashes((string) $_REQUEST["s2member_paypal_proxy"]))); } /* Add IPN proxy use vars (when available) to the ``$paypal`` array. */ if (!empty($_REQUEST["s2member_paypal_proxy_use"])) { $paypal["s2member_paypal_proxy_use"] = esc_html(trim(stripslashes((string) $_REQUEST["s2member_paypal_proxy_use"]))); } /* Add IPN proxy coupon vars (when available) to the ``$paypal`` array. */ if (!empty($_REQUEST["s2member_paypal_proxy_coupon"])) { $paypal["s2member_paypal_proxy_coupon"] = stripslashes_deep((array) $_REQUEST["s2member_paypal_proxy_coupon"]); } /* Also add IPN proxy self-verification (when available) to the ``$paypal`` array. */ if (!empty($_REQUEST["s2member_paypal_proxy_verification"])) { $paypal["s2member_paypal_proxy_verification"] = esc_html(trim(stripslashes((string) $_REQUEST["s2member_paypal_proxy_verification"]))); } /* If debugging/logging is enabled; we need to append ``$paypal`` to the log file. Logging now supports Multisite Networking as well. */ $logt = c_ws_plugin__s2member_utilities::time_details(); $logv = c_ws_plugin__s2member_utilities::ver_details(); $logm = c_ws_plugin__s2member_utilities::mem_details(); $log4 = $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"] . "\nUser-Agent: " . $_SERVER["HTTP_USER_AGENT"]; $log4 = is_multisite() && !is_main_site() ? ($_log4 = $current_blog->domain . $current_blog->path) . "\n" . $log4 : $log4; $log2 = is_multisite() && !is_main_site() ? "gateway-core-ipn-4-" . trim(preg_replace("/[^a-z0-9]/i", "-", $_log4), "-") . ".log" : "gateway-core-ipn.log"; if ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["gateway_debug_logs"]) { if (is_dir($logs_dir = $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["logs_dir"])) { if (is_writable($logs_dir) && c_ws_plugin__s2member_utils_logs::archive_oversize_log_files()) { file_put_contents($logs_dir . "/" . $log2, "LOG ENTRY: " . $logt . "\n" . $logv . "\n" . $logm . "\n" . $log4 . "\n" . c_ws_plugin__s2member_utils_logs::conceal_private_info(var_export($paypal, true)) . "\n\n", FILE_APPEND); } } } foreach (array_keys(get_defined_vars()) as $__v) { $__refs[$__v] =& ${$__v}; } do_action("ws_plugin__s2member_during_paypal_notify", get_defined_vars()); unset($__refs, $__v); status_header(200); // Send a 200 OK status header. header("Content-Type: text/plain; charset=UTF-8"); // Content-Type text/plain with UTF-8. while (@ob_end_clean()) { } // Clean any existing output buffers. exit(!empty($paypal["s2member_paypal_proxy_return_url"]) ? $paypal["s2member_paypal_proxy_return_url"] : ""); } foreach (array_keys(get_defined_vars()) as $__v) { $__refs[$__v] =& ${$__v}; } do_action("ws_plugin__s2member_after_paypal_notify", get_defined_vars()); unset($__refs, $__v); }