/** * Handles Google® IPN URL processing. * * @package s2Member\Google * @since 1.5 * * @attaches-to ``add_action("init");`` * * @return null Or exits script execution after handling the Notification. */ public static function google_notify() { global $current_site, $current_blog; /* For Multisite support. */ /**/ if (!empty($_GET["s2member_pro_google_notify"]) && $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["pro_google_merchant_id"]) { @ignore_user_abort(true); /* Continue processing even if/when connection is broken by the sender. */ /**/ if (is_array($google = c_ws_plugin__s2member_pro_google_utilities::google_postvars()) && ($_google = $google)) { $google["s2member_log"][] = "IPN received on: " . date("D M j, Y g:i:s a T"); $google["s2member_log"][] = "s2Member POST vars verified with Google®."; /**/ if (preg_match("/^new-order-notification\$/i", $google["_type"]) && is_array($s2vars_item1 = c_ws_plugin__s2member_pro_google_utilities::google_parse_s2vars($google["order-summary_shopping-cart_items_item-1_merchant-private-item-data"])) && !$s2vars_item1["s2_subscr_id"]) { $google["s2member_log"][] = "Google® transaction identified as ( `SALE/BUY-NOW` )."; $google["s2member_log"][] = "IPN reformulated. Piping through s2Member's core/standard PayPal® processor as `txn_type` ( `web_accept` )."; $google["s2member_log"][] = "Please check PayPal® IPN logs for further processing details."; /**/ $processing = $processed = true; $ipn = array(); /* Reset. */ /**/ $ipn["txn_type"] = "web_accept"; /**/ $ipn["txn_id"] = $s2vars_item1["s2_txn_id"] ? $s2vars_item1["s2_txn_id"] : $google["order-summary_google-order-number"]; /**/ $ipn["custom"] = $s2vars_item1["s2_custom"]; /**/ $ipn["mc_gross"] = number_format($google["order-summary_order-total"], 2, ".", ""); $ipn["mc_currency"] = strtoupper($google["order-summary_order-total_currency"]); $ipn["tax"] = number_format($google["order-summary_order-adjustment_total-tax"], 2, ".", ""); /**/ $ipn["payer_email"] = $google["buyer-billing-address_email"]; $ipn["first_name"] = $google["buyer-billing-address_structured-name_first-name"]; $ipn["last_name"] = $google["buyer-billing-address_structured-name_last-name"]; /**/ $ipn["option_name1"] = $s2vars_item1["s2_referencing"] ? "Referencing Customer ID" : "Originating Domain"; $ipn["option_selection1"] = $s2vars_item1["s2_referencing"] ? $s2vars_item1["s2_referencing"] : $_SERVER["HTTP_HOST"]; /**/ $ipn["option_name2"] = "Customer IP Address"; /* IP Address. */ $ipn["option_selection2"] = $s2vars_item1["s2_customer_ip"]; /**/ $ipn["item_number"] = $s2vars_item1["s2_item_number"]; $ipn["item_name"] = $google["order-summary_shopping-cart_items_item-1_item-name"]; /**/ $ipn_q = "&s2member_paypal_proxy=google&s2member_paypal_proxy_use=standard-emails"; $ipn_q .= "&s2member_paypal_proxy_verification=" . urlencode(c_ws_plugin__s2member_paypal_utilities::paypal_proxy_key_gen()); /**/ c_ws_plugin__s2member_utils_urls::remote(site_url("/?s2member_paypal_notify=1" . $ipn_q), $ipn, array("timeout" => 20)); } else { if (preg_match("/^new-order-notification\$/i", $google["_type"]) && is_array($s2vars_item1 = c_ws_plugin__s2member_pro_google_utilities::google_parse_s2vars($google["order-summary_shopping-cart_items_item-1_merchant-private-item-data"])) && $s2vars_item1["s2_subscr_id"] && !$s2vars_item1["s2_subscr_payment"]) { $google["s2member_log"][] = "Google® transaction identified as ( `SALE/SUBSCRIPTION` )."; $google["s2member_log"][] = "IPN reformulated. Piping through s2Member's core/standard PayPal® processor as `txn_type` ( `subscr_signup` )."; $google["s2member_log"][] = "Please check PayPal® IPN logs for further processing details."; /**/ $processing = $processed = true; $ipn = array(); /* Reset. */ /**/ $ipn["txn_type"] = "subscr_signup"; $ipn["subscr_id"] = $s2vars_item1["s2_subscr_id"]; /**/ $ipn["recurring"] = !($times = $google["order-summary_shopping-cart_items_item-2_subscription_payments_subscription-payment-1_times"]) || $times > 1 ? "1" : "0"; /**/ $ipn["txn_id"] = $google["order-summary_google-order-number"]; /**/ $ipn["custom"] = $s2vars_item1["s2_custom"]; /**/ $ipn["period1"] = $s2vars_item1["s2_period1"]; /* Just use s2Member's period calculations to make this easier. */ $ipn["period3"] = $s2vars_item1["s2_period3"]; /* Just use s2Member's period calculations to make this easier. */ /**/ $ipn["mc_amount1"] = number_format($google["order-summary_shopping-cart_items_item-1_unit-price"], 2, ".", ""); $ipn["mc_amount3"] = number_format($google["order-summary_shopping-cart_items_item-2_subscription_recurrent-item_unit-price"], 2, ".", ""); /**/ $ipn["mc_gross"] = preg_match("/^[1-9]/", $ipn["period1"]) ? $ipn["mc_amount1"] : $ipn["mc_amount3"]; /**/ $ipn["mc_currency"] = strtoupper($google["order-summary_order-total_currency"]); $ipn["tax"] = number_format($google["order-summary_order-adjustment_total-tax"], 2, ".", ""); /**/ $ipn["payer_email"] = $google["buyer-billing-address_email"]; $ipn["first_name"] = $google["buyer-billing-address_structured-name_first-name"]; $ipn["last_name"] = $google["buyer-billing-address_structured-name_last-name"]; /**/ $ipn["option_name1"] = $s2vars_item1["s2_referencing"] ? "Referencing Customer ID" : "Originating Domain"; $ipn["option_selection1"] = $s2vars_item1["s2_referencing"] ? $s2vars_item1["s2_referencing"] : $_SERVER["HTTP_HOST"]; /**/ $ipn["option_name2"] = "Customer IP Address"; /* IP Address. */ $ipn["option_selection2"] = $s2vars_item1["s2_customer_ip"]; /**/ $ipn["item_number"] = $s2vars_item1["s2_item_number"]; $ipn["item_name"] = $google["order-summary_shopping-cart_items_item-1_item-name"]; /**/ $ipn_q = "&s2member_paypal_proxy=google&s2member_paypal_proxy_use=standard-emails"; $ipn_q .= $ipn["mc_gross"] > 0 ? ",subscr-signup-as-subscr-payment" : ""; /* Use as first payment? */ $ipn_q .= "&s2member_paypal_proxy_verification=" . urlencode(c_ws_plugin__s2member_paypal_utilities::paypal_proxy_key_gen()); /**/ c_ws_plugin__s2member_utils_urls::remote(site_url("/?s2member_paypal_notify=1" . $ipn_q), $ipn, array("timeout" => 20)); } else { if (preg_match("/^new-order-notification\$/i", $google["_type"]) && is_array($s2vars_item1 = c_ws_plugin__s2member_pro_google_utilities::google_parse_s2vars($google["order-summary_shopping-cart_items_item-1_merchant-private-item-data"])) && $s2vars_item1["s2_subscr_id"] && $s2vars_item1["s2_subscr_payment"]) { $google["s2member_log"][] = "Google® transaction identified as ( `SUBSCRIPTION PAYMENT` )."; $google["s2member_log"][] = "IPN reformulated. Piping through s2Member's core/standard PayPal® processor as `txn_type` ( `subscr_payment` )."; $google["s2member_log"][] = "Please check PayPal® IPN logs for further processing details."; /**/ $processing = $processed = true; $ipn = array(); /* Reset. */ /**/ $ipn["txn_type"] = "subscr_payment"; $ipn["subscr_id"] = $s2vars_item1["s2_subscr_id"]; /**/ $ipn["txn_id"] = $google["order-summary_google-order-number"]; /**/ $ipn["custom"] = $s2vars_item1["s2_custom"]; /**/ $ipn["mc_gross"] = number_format($google["order-summary_order-total"], 2, ".", ""); $ipn["mc_currency"] = strtoupper($google["order-summary_order-total_currency"]); $ipn["tax"] = number_format($google["order-summary_order-adjustment_total-tax"], 2, ".", ""); /**/ $ipn["payer_email"] = $google["buyer-billing-address_email"]; $ipn["first_name"] = $google["buyer-billing-address_structured-name_first-name"]; $ipn["last_name"] = $google["buyer-billing-address_structured-name_last-name"]; /**/ $ipn["option_name1"] = $s2vars_item1["s2_referencing"] ? "Referencing Customer ID" : "Originating Domain"; $ipn["option_selection1"] = $s2vars_item1["s2_referencing"] ? $s2vars_item1["s2_referencing"] : $_SERVER["HTTP_HOST"]; /**/ $ipn["option_name2"] = "Customer IP Address"; /* IP Address. */ $ipn["option_selection2"] = $s2vars_item1["s2_customer_ip"]; /**/ $ipn["item_number"] = $s2vars_item1["s2_item_number"]; $ipn["item_name"] = $google["order-summary_shopping-cart_items_item-1_item-name"]; /**/ $ipn_q = "&s2member_paypal_proxy=google&s2member_paypal_proxy_use=standard-emails"; $ipn_q .= "&s2member_paypal_proxy_verification=" . urlencode(c_ws_plugin__s2member_paypal_utilities::paypal_proxy_key_gen()); /**/ c_ws_plugin__s2member_utils_urls::remote(site_url("/?s2member_paypal_notify=1" . $ipn_q), $ipn, array("timeout" => 20)); } else { if (preg_match("/^cancelled-subscription-notification\$/i", $google["_type"]) && is_array($s2vars_item1 = c_ws_plugin__s2member_pro_google_utilities::google_parse_s2vars($google["order-summary_shopping-cart_items_item-1_merchant-private-item-data"])) && $s2vars_item1["s2_subscr_id"]) { $google["s2member_log"][] = "Google® transaction identified as ( `SUBSCRIPTION CANCELLATION` )."; $google["s2member_log"][] = "IPN reformulated. Piping through s2Member's core/standard PayPal® processor as `txn_type` ( `subscr_cancel` )."; $google["s2member_log"][] = "Please check PayPal® IPN logs for further processing details."; /**/ $processing = $processed = true; $ipn = array(); /* Reset. */ /**/ $ipn["txn_type"] = "subscr_cancel"; $ipn["subscr_id"] = $s2vars_item1["s2_subscr_id"]; /**/ $ipn["custom"] = $s2vars_item1["s2_custom"]; /**/ $ipn["period1"] = $s2vars_item1["s2_period1"]; $ipn["period3"] = $s2vars_item1["s2_period3"]; /**/ $ipn["payer_email"] = $google["order-summary_risk-information_billing-address_email"]; $ipn["first_name"] = preg_replace("/( )(.+)/", "", $google["order-summary_risk-information_billing-address_contact-name"]); $ipn["last_name"] = preg_replace("/(.+?)( )/", "", $google["order-summary_risk-information_billing-address_contact-name"]); /**/ $ipn["option_name1"] = $s2vars_item1["s2_referencing"] ? "Referencing Customer ID" : "Originating Domain"; $ipn["option_selection1"] = $s2vars_item1["s2_referencing"] ? $s2vars_item1["s2_referencing"] : $_SERVER["HTTP_HOST"]; /**/ $ipn["option_name2"] = "Customer IP Address"; /* IP Address. */ $ipn["option_selection2"] = $s2vars_item1["s2_customer_ip"]; /**/ $ipn["item_number"] = $s2vars_item1["s2_item_number"]; $ipn["item_name"] = $google["order-summary_shopping-cart_items_item-1_item-name"]; /**/ $ipn_q = "&s2member_paypal_proxy=google&s2member_paypal_proxy_use=standard-emails"; $ipn_q .= "&s2member_paypal_proxy_verification=" . urlencode(c_ws_plugin__s2member_paypal_utilities::paypal_proxy_key_gen()); /**/ c_ws_plugin__s2member_utils_urls::remote(site_url("/?s2member_paypal_notify=1" . $ipn_q), $ipn, array("timeout" => 20)); } else { if (preg_match("/^(refund|chargeback)-amount-notification\$/i", $google["_type"]) && is_array($s2vars_item1 = c_ws_plugin__s2member_pro_google_utilities::google_parse_s2vars($google["order-summary_shopping-cart_items_item-1_merchant-private-item-data"])) && (preg_match("/^refund/", $google["_type"]) && $google["latest-fee-refund-amount"] >= $google["order-summary_total-charge-amount"] || preg_match("/^chargeback/", $google["_type"]) && $google["latest-chargeback-amount"] >= $google["order-summary_total-charge-amount"])) { $google["s2member_log"][] = "Google® transaction identified as ( `REFUND|CHARGEBACK` )."; $google["s2member_log"][] = "IPN reformulated. Piping through s2Member's core/standard PayPal® processor as `payment_status` ( `refunded|reversed` )."; $google["s2member_log"][] = "Please check PayPal® IPN logs for further processing details."; /**/ $processing = $processed = true; $ipn = array(); /* Reset. */ /**/ $ipn["custom"] = $s2vars_item1["s2_custom"]; /**/ if ($s2vars_item1["s2_subscr_id"] && !$s2vars_item1["s2_txn_id"]) { $ipn["parent_txn_id"] = $s2vars_item1["s2_subscr_id"]; } else { if ($s2vars_item1["s2_txn_id"] && !$s2vars_item1["s2_subscr_id"]) { $ipn["parent_txn_id"] = $s2vars_item1["s2_txn_id"]; } else { /* Default to Google's Order #. */ $ipn["parent_txn_id"] = $google["order-summary_google-order-number"]; } } /**/ if (preg_match("/^refund/", $google["_type"])) { $ipn["payment_status"] = "refunded"; /* Refunding. */ $ipn["mc_fee"] = "-" . number_format($google["latest-fee-refund-amount"], 2, ".", ""); $ipn["mc_gross"] = "-" . number_format($google["latest-refund-amount"], 2, ".", ""); $ipn["mc_currency"] = strtoupper($google["latest-refund-amount_currency"]); $ipn["tax"] = "-" . number_format("0.00", 2, ".", ""); } else { if (preg_match("/^chargeback/", $google["_type"])) { $ipn["payment_status"] = "reversed"; /* Reversed/chargeback. */ $ipn["mc_fee"] = "-" . number_format($google["latest-chargeback-fee-amount"], 2, ".", ""); $ipn["mc_gross"] = "-" . number_format($google["latest-chargeback-amount"], 2, ".", ""); $ipn["mc_currency"] = strtoupper($google["latest-chargeback-amount_currency"]); $ipn["tax"] = "-" . number_format("0.00", 2, ".", ""); } } /**/ $ipn["payer_email"] = $google["order-summary_risk-information_billing-address_email"]; $ipn["first_name"] = preg_replace("/( )(.+)/", "", $google["order-summary_risk-information_billing-address_contact-name"]); $ipn["last_name"] = preg_replace("/(.+?)( )/", "", $google["order-summary_risk-information_billing-address_contact-name"]); /**/ $ipn["option_name1"] = $s2vars_item1["s2_referencing"] ? "Referencing Customer ID" : "Originating Domain"; $ipn["option_selection1"] = $s2vars_item1["s2_referencing"] ? $s2vars_item1["s2_referencing"] : $_SERVER["HTTP_HOST"]; /**/ $ipn["option_name2"] = "Customer IP Address"; /* IP Address. */ $ipn["option_selection2"] = $s2vars_item1["s2_customer_ip"]; /**/ $ipn["item_number"] = $s2vars_item1["s2_item_number"]; $ipn["item_name"] = $google["order-summary_shopping-cart_items_item-1_item-name"]; /**/ $ipn_q = "&s2member_paypal_proxy=google&s2member_paypal_proxy_use=standard-emails"; $ipn_q .= "&s2member_paypal_proxy_verification=" . urlencode(c_ws_plugin__s2member_paypal_utilities::paypal_proxy_key_gen()); /**/ c_ws_plugin__s2member_utils_urls::remote(site_url("/?s2member_paypal_notify=1" . $ipn_q), $ipn, array("timeout" => 20)); } else { if (!$processed) { /* If nothing was processed, here we add a message to the logs indicating the IPN was ignored. */ $google["s2member_log"][] = "Ignoring this IPN request. The transaction does NOT require any action on the part of s2Member."; } } } } } } } else { $google["s2member_log"][] = "Unable to verify POST vars. This is most likely related to an invalid Google® configuration. Please check: s2Member -> Google® Options."; $google["s2member_log"][] = "If you're absolutely SURE that your Google® 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 to Google® over an HTTPS connection."; $google["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. Instead, set allow_url_fopen = yes in your php.ini file. The cURL extension (usually) does NOT support SSL connections on a Windows® server."; $google["s2member_log"][] = var_export($_REQUEST, true); /* Recording _POST + _GET vars for analysis and debugging. */ } /* We need to log this final event before it occurs, so that is makes it into the log entry. */ $google["s2member_log"][] = "Sending Google® an XML Notification Acknowlegment w/ original serial number."; /* If debugging/logging is enabled; we need to append $google 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() ? "google-ipn-4-" . trim(preg_replace("/[^a-z0-9]/i", "-", $_log4), "-") . ".log" : "google-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($google, true) . "\n\n", FILE_APPEND); } } } /**/ $confirmation = '<?xml version="1.0" encoding="UTF-8"?>'; $confirmation .= '<notification-acknowledgment xmlns="http://checkout.google.com/schema/2"'; $confirmation .= ' serial-number="' . esc_attr(trim(stripslashes($_REQUEST["serial-number"]))) . '" />'; /**/ status_header(200); /* Send a 200 OK status header. */ header("Content-Type: application/xml"); /* Google® expects application/xml here. */ eval('while (@ob_end_clean ());'); /* End/clean all output buffers that may or may not exist. */ /**/ exit($confirmation); /* Exit w/ serial number confirmation. */ } }
/** * Handles Google IPN URL processing. * * @package s2Member\Google * @since 1.5 * * @attaches-to ``add_action("init");`` * * @return null Or exits script execution after handling the Notification. */ public static function google_notify() { global $current_site, $current_blog; if (!empty($_GET["s2member_pro_google_notify"]) && $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["pro_google_merchant_id"]) { @ignore_user_abort(true); // Continue processing even if/when connection is broken by the sender. if (is_array($google = c_ws_plugin__s2member_pro_google_utilities::google_postvars()) && ($_google = $google)) { $google["s2member_log"][] = "IPN received on: " . date("D M j, Y g:i:s a T"); $google["s2member_log"][] = "s2Member POST vars verified with Google."; if (!empty($google["typ"]) && preg_match('/^google\\/payments\\/inapp\\/item\\/v[0-9]+\\/postback\\/buy$/i', $google["typ"]) && is_array($s2vars = c_ws_plugin__s2member_pro_google_utilities::google_parse_s2vars($google)) && !empty($google["response"]["orderId"])) { $google["s2member_log"][] = "Google transaction identified as ( `SALE/BUY-NOW` )."; $google["s2member_log"][] = "IPN reformulated. Piping through s2Member's core/standard PayPal processor as `txn_type` ( `web_accept` )."; $google["s2member_log"][] = "Please check PayPal IPN logs for further processing details."; $processing = $processed = true; $ipn = array(); // Reset. $ipn["txn_type"] = "web_accept"; $ipn["txn_id"] = $google["response"]["orderId"]; $ipn["custom"] = $s2vars["cs"]; $ipn["mc_gross"] = number_format($google["request"]["price"], 2, ".", ""); $ipn["mc_currency"] = strtoupper($google["request"]["currencyCode"]); $ipn["tax"] = number_format((double) @$google["request"]["tax"], 2, ".", ""); $ipn["payer_email"] = $s2vars["em"]; $ipn["first_name"] = $s2vars["fn"]; $ipn["last_name"] = $s2vars["ln"]; $ipn["option_name1"] = $s2vars["rf"] ? "Referencing Customer ID" : "Originating Domain"; $ipn["option_selection1"] = $s2vars["rf"] ? $s2vars["rf"] : $_SERVER["HTTP_HOST"]; $ipn["option_name2"] = "Customer IP Address"; // IP Address. $ipn["option_selection2"] = $s2vars["ip"]; $ipn["item_number"] = $s2vars["in"]; $ipn["item_name"] = $google["request"]["description"]; $ipn["s2member_paypal_proxy"] = "google"; $ipn["s2member_paypal_proxy_use"] = "standard-emails"; $ipn["s2member_paypal_proxy_verification"] = c_ws_plugin__s2member_paypal_utilities::paypal_proxy_key_gen(); c_ws_plugin__s2member_utils_urls::remote(home_url("/?s2member_paypal_notify=1"), $ipn, array("timeout" => 20)); } else { if (!empty($google["typ"]) && preg_match('/^google\\/payments\\/inapp\\/subscription\\/v[0-9]+\\/postback\\/buy$/i', $google["typ"]) && is_array($s2vars = c_ws_plugin__s2member_pro_google_utilities::google_parse_s2vars($google)) && !empty($google["response"]["orderId"])) { $google["s2member_log"][] = "Google transaction identified as ( `SALE/SUBSCRIPTION` )."; $google["s2member_log"][] = "IPN reformulated. Piping through s2Member's core/standard PayPal processor as `txn_type` ( `subscr_signup` )."; $google["s2member_log"][] = "Please check PayPal IPN logs for further processing details."; $processing = $processed = true; $ipn = array(); // Reset. $ipn["txn_type"] = "subscr_signup"; $ipn["subscr_id"] = $google["response"]["orderId"]; $ipn["txn_id"] = $google["response"]["orderId"]; $ipn["recurring"] = $s2vars["rr"]; $ipn["custom"] = $s2vars["cs"]; $ipn["period1"] = $s2vars["p1"]; $ipn["period3"] = $s2vars["p3"]; $ipn["mc_amount1"] = $ipn["mc_gross"] = number_format($google["request"]["initialPayment"]["price"], 2, ".", ""); $ipn["mc_currency"] = strtoupper($google["request"]["initialPayment"]["currencyCode"]); $ipn["tax"] = number_format((double) @$google["request"]["initialPayment"]["tax"], 2, ".", ""); $ipn["mc_amount3"] = number_format($google["request"]["recurrence"]["price"], 2, ".", ""); $ipn["payer_email"] = $s2vars["em"]; $ipn["first_name"] = $s2vars["fn"]; $ipn["last_name"] = $s2vars["ln"]; $ipn["option_name1"] = $s2vars["rf"] ? "Referencing Customer ID" : "Originating Domain"; $ipn["option_selection1"] = $s2vars["rf"] ? $s2vars["rf"] : $_SERVER["HTTP_HOST"]; $ipn["option_name2"] = "Customer IP Address"; // IP Address. $ipn["option_selection2"] = $s2vars["ip"]; $ipn["item_number"] = $s2vars["in"]; $ipn["item_name"] = $google["request"]["description"]; $ipn["s2member_paypal_proxy"] = "google"; $ipn["s2member_paypal_proxy_use"] = "standard-emails"; $ipn["s2member_paypal_proxy_use"] .= $ipn["mc_gross"] > 0 ? ",subscr-signup-as-subscr-payment" : ""; $ipn["s2member_paypal_proxy_verification"] = c_ws_plugin__s2member_paypal_utilities::paypal_proxy_key_gen(); c_ws_plugin__s2member_utils_urls::remote(home_url("/?s2member_paypal_notify=1"), $ipn, array("timeout" => 20)); } else { if (!empty($google["typ"]) && preg_match('/^google\\/payments\\/inapp\\/subscription\\/v[0-9]+\\/canceled$/i', $google["typ"]) && !empty($google["response"]["statusCode"]) && preg_match("/^SUBSCRIPTION_CANCELED\$/i", $google["response"]["statusCode"]) && !empty($google["response"]["orderId"]) && ($ipn_signup_vars = c_ws_plugin__s2member_utils_users::get_user_ipn_signup_vars(false, $google["response"]["orderId"]))) { $google["s2member_log"][] = "Google transaction identified as ( `SUBSCRIPTION_CANCELED` )."; $google["s2member_log"][] = "IPN reformulated. Piping through s2Member's core/standard PayPal processor as `txn_type` ( `subscr_cancel` )."; $google["s2member_log"][] = "Please check PayPal IPN logs for further processing details."; $processing = $processed = true; $ipn = array(); // Reset. $ipn["txn_type"] = "subscr_cancel"; $ipn["subscr_id"] = $google["response"]["orderId"]; $ipn["custom"] = $ipn_signup_vars["custom"]; $ipn["period1"] = $ipn_signup_vars["period1"]; $ipn["period3"] = $ipn_signup_vars["period3"]; $ipn["payer_email"] = $ipn_signup_vars["payer_email"]; $ipn["first_name"] = $ipn_signup_vars["first_name"]; $ipn["last_name"] = $ipn_signup_vars["last_name"]; $ipn["option_name1"] = $ipn_signup_vars["option_name1"]; $ipn["option_selection1"] = $ipn_signup_vars["option_selection1"]; $ipn["option_name2"] = $ipn_signup_vars["option_name2"]; $ipn["option_selection2"] = $ipn_signup_vars["option_selection2"]; $ipn["item_number"] = $ipn_signup_vars["item_number"]; $ipn["item_name"] = $ipn_signup_vars["item_name"]; $ipn["s2member_paypal_proxy"] = "google"; $ipn["s2member_paypal_proxy_use"] = "standard-emails"; $ipn["s2member_paypal_proxy_verification"] = c_ws_plugin__s2member_paypal_utilities::paypal_proxy_key_gen(); c_ws_plugin__s2member_utils_urls::remote(home_url("/?s2member_paypal_notify=1"), $ipn, array("timeout" => 20)); } else { if (!$processed) { // If nothing was processed, here we add a message to the logs indicating the IPN was ignored. $google["s2member_log"][] = "Ignoring this IPN request. The transaction does NOT require any action on the part of s2Member."; } } } } } else { $google["s2member_log"][] = "Unable to verify POST vars. This is most likely related to an invalid Google configuration. Please check: s2Member → Google Options."; $google["s2member_log"][] = "If you're absolutely SURE that your Google 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 to Google over an HTTPS connection."; $google["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. Instead, set allow_url_fopen = yes in your php.ini file. The cURL extension (usually) does NOT support SSL connections on a Windows server."; $google["s2member_log"][] = var_export($_REQUEST, true); // Recording _POST + _GET vars for analysis and debugging. } /* We need to log this final event before it occurs. */ $google["s2member_log"][] = "Sending Google an acknowlegment w/ order ID."; /* If debugging/logging is enabled; we need to append $google 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() ? "google-ipn-4-" . trim(preg_replace("/[^a-z0-9]/i", "-", $_log4), "-") . ".log" : "google-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($google, true)) . "\n\n", FILE_APPEND); } } } status_header(200); // Send a 200 OK status header. header("Content-Type: text/plain"); // Google expects text/plain here. while (@ob_end_clean()) { } // Clean any existing output buffers. exit(!empty($google["response"]["orderId"]) ? $google["response"]["orderId"] : ""); } }