/** * Logs HTTP communication (if enabled). * * @package optimizeMember\Utilities * @since 120212 */ public static function http_api_debug($response = NULL, $state = NULL, $class = NULL, $args = NULL, $url = NULL) { if (!$GLOBALS['WS_PLUGIN__']['optimizemember']['o']['gateway_debug_logs']) { return; } // Logging is NOT enabled in this case. $is_optimizemember = !empty($args['optimizemember']) || strpos($url, 'optimizemember') !== FALSE ? TRUE : FALSE; if (!$GLOBALS['WS_PLUGIN__']['optimizemember']['o']['gateway_debug_logs_extensive'] && !$is_optimizemember) { return; } // Extensive logging is NOT enabled in this case. global $current_site, $current_blog; // For Multisite support. $http_api_debug = array('state' => $state, 'transport_class' => $class, 'args' => $args, 'url' => $url, 'response' => $response); $logt = c_ws_plugin__optimizemember_utilities::time_details(); $logv = c_ws_plugin__optimizemember_utilities::ver_details(); $logm = c_ws_plugin__optimizemember_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() ? 'http-api-debug-4-' . trim(preg_replace('/[^a-z0-9]/i', '-', !empty($_log4) ? $_log4 : ''), '-') . '.log' : 'http-api-debug.log'; $http_api_debug_conceal_private_info = c_ws_plugin__optimizemember_utils_logs::conceal_private_info(var_export($http_api_debug, TRUE)); if (is_dir($logs_dir = $GLOBALS['WS_PLUGIN__']['optimizemember']['c']['logs_dir'])) { if (is_writable($logs_dir) && c_ws_plugin__optimizemember_utils_logs::archive_oversize_log_files()) { if ($GLOBALS['WS_PLUGIN__']['optimizemember']['o']['gateway_debug_logs_extensive']) { file_put_contents($logs_dir . '/wp-' . $log2, 'LOG ENTRY: ' . $logt . "\n" . $logv . "\n" . $logm . "\n" . $log4 . "\n" . $http_api_debug_conceal_private_info . "\n\n", FILE_APPEND); } if ($is_optimizemember) { // Log optimizeMember HTTP connections separately. file_put_contents($logs_dir . '/opm-' . $log2, 'LOG ENTRY: ' . $logt . "\n" . $logv . "\n" . $logm . "\n" . $log4 . "\n" . $http_api_debug_conceal_private_info . "\n\n", FILE_APPEND); } } } }
/** * Logs Stripe API communication. * * @param string $function Name of the caller. * * @param integer $input_time Input time. * @param mixed $input_vars Input data/vars. * * @param integer $output_time Output time. * @param mixed $output_vars Output data/vars. */ public static function log_entry($function, $input_time, $input_vars, $output_time, $output_vars) { global $current_site, $current_blog; if (!$GLOBALS['WS_PLUGIN__']['optimizemember']['o']['gateway_debug_logs']) { return; } // Nothing to do in this case. $logt = c_ws_plugin__optimizemember_utilities::time_details(); $logv = c_ws_plugin__optimizemember_utilities::ver_details(); $logm = c_ws_plugin__optimizemember_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() ? 'stripe-api-4-' . trim(preg_replace('/[^a-z0-9]/i', '-', !empty($_log4) ? $_log4 : ''), '-') . '.log' : 'stripe-api.log'; if (is_dir($logs_dir = $GLOBALS['WS_PLUGIN__']['optimizemember']['c']['logs_dir'])) { if (is_writable($logs_dir) && c_ws_plugin__optimizemember_utils_logs::archive_oversize_log_files()) { if ($log = '-------- Function/Caller: ( ' . $function . ' ) --------' . "\n") { if ($log .= '-------- Input vars: ( ' . date(DATE_RFC822, $input_time) . ' ) --------' . "\n" . print_r($input_vars, TRUE) . "\n") { if ($log .= '-------- Output string/vars: ( ' . date(DATE_RFC822, $output_time) . ' ) --------' . "\n" . print_r($output_vars, TRUE)) { file_put_contents($logs_dir . '/' . $log2, 'LOG ENTRY: ' . $logt . "\n" . $logv . "\n" . $logm . "\n" . $log4 . "\n" . c_ws_plugin__optimizemember_utils_logs::conceal_private_info($log) . "\n\n", FILE_APPEND); } } } } } }
/** * Handles Stripe Webhook/IPN event processing. * * @package optimizeMember\Stripe * @since 140617 * * @attaches-to ``add_action('init');`` */ public static function stripe_notify() { global $current_site, $current_blog; if (!empty($_GET['optimizemember_pro_stripe_notify']) && $GLOBALS['WS_PLUGIN__']['optimizemember']['o']['pro_stripe_api_secret_key']) { $stripe = array(); // Initialize array of Webhook/IPN event data and s2Member log details. @ignore_user_abort(TRUE); // Continue processing even if/when connection is broken. require_once dirname(__FILE__) . '/stripe-sdk/lib/Stripe.php'; Stripe::setApiKey($GLOBALS['WS_PLUGIN__']['optimizemember']['o']['pro_stripe_api_secret_key']); if (is_object($event = c_ws_plugin__optimizemember_pro_stripe_utilities::get_event()) && ($stripe['event'] = $event)) { switch ($event->type) { case 'invoice.payment_succeeded': // Subscription payments. if (!empty($event->data->object) && ($stripe_invoice = $event->data->object) instanceof Stripe_Invoice && !empty($stripe_invoice->customer) && !empty($stripe_invoice->subscription) && ($stripe_invoice_total = number_format(c_ws_plugin__optimizemember_pro_stripe_utilities::cents_to_dollar_amount($stripe_invoice->total, $stripe_invoice->currency), 2, '.', '')) && is_object($stripe_subscription = c_ws_plugin__optimizemember_pro_stripe_utilities::get_customer_subscription($stripe_invoice->customer, $stripe_invoice->subscription)) && ($ipn_signup_vars = c_ws_plugin__optimizemember_utils_users::get_user_ipn_signup_vars(0, $stripe_subscription->id))) { $processing = TRUE; $ipn['txn_type'] = 'subscr_payment'; $ipn['txn_id'] = $stripe_invoice->id; $ipn['txn_cid'] = $ipn_signup_vars['subscr_cid']; $ipn['subscr_cid'] = $ipn_signup_vars['subscr_cid']; $ipn['subscr_id'] = $ipn_signup_vars['subscr_id']; $ipn['custom'] = $ipn_signup_vars['custom']; $ipn['mc_gross'] = $stripe_invoice_total; $ipn['mc_currency'] = strtoupper($stripe_invoice->currency); $ipn['tax'] = number_format(0, 2, '.', ''); $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_name'] = $ipn_signup_vars['item_name']; $ipn['item_number'] = $ipn_signup_vars['item_number']; $ipn['optimizemember_paypal_proxy'] = 'stripe'; $ipn['optimizemember_paypal_proxy_use'] = 'pro-emails'; $ipn['optimizemember_paypal_proxy_verification'] = c_ws_plugin__optimizemember_paypal_utilities::paypal_proxy_key_gen(); c_ws_plugin__optimizemember_utils_urls::remote(site_url('/?optimizemember_paypal_notify=1'), $ipn, array('timeout' => 20)); $stripe['optimizemember_log'][] = 'Stripe Webhook/IPN event type identified as: `' . $event->type . '` on: ' . date('D M j, Y g:i:s a T'); if ($maybe_end_subscription = self::_maybe_end_subscription_after_payment($stripe_invoice->customer, $stripe_subscription)) { $stripe['optimizemember_log'][] = $maybe_end_subscription; } $stripe['optimizemember_log'][] = 'Webhook/IPN event `' . $event->type . '` reformulated. Piping through optimizeMember\'s core gateway processor as `txn_type` (`' . $ipn['txn_type'] . '`).'; $stripe['optimizemember_log'][] = 'Please check core IPN logs for further processing details.'; } break; // Break switch handler. // Break switch handler. case 'invoice.payment_failed': // Subscription payment failures. if (!empty($event->data->object) && ($stripe_invoice = $event->data->object) instanceof Stripe_Invoice && !empty($stripe_invoice->customer) && !empty($stripe_invoice->subscription) && ($stripe_invoice_total = number_format(c_ws_plugin__optimizemember_pro_stripe_utilities::cents_to_dollar_amount($stripe_invoice->total, $stripe_invoice->currency), 2, '.', '')) && is_object($stripe_subscription = c_ws_plugin__optimizemember_pro_stripe_utilities::get_customer_subscription($stripe_invoice->customer, $stripe_invoice->subscription)) && ($ipn_signup_vars = c_ws_plugin__optimizemember_utils_users::get_user_ipn_signup_vars(0, $stripe_subscription->id))) { $processing = TRUE; $stripe['optimizemember_log'][] = 'Stripe Webhook/IPN event type identified as: `' . $event->type . '` on: ' . date('D M j, Y g:i:s a T'); if ($maybe_end_subscription = self::_maybe_end_subscription_after_payment($stripe_invoice->customer, $stripe_subscription)) { $stripe['optimizemember_log'][] = $maybe_end_subscription; } $stripe['optimizemember_log'][] = 'Ignoring `' . $event->type . '`. optimizeMember does NOT respond to individual payment failures; only to subscription cancellations.'; $stripe['optimizemember_log'][] = 'You may control the behavior(s) associated w/ subscription payment failures from your Stripe Dashboard please.'; } break; // Break switch handler. // Break switch handler. case 'customer.deleted': // Customer deletions. if (!empty($event->data->object) && ($stripe_customer = $event->data->object) instanceof Stripe_Customer && ($ipn_signup_vars = c_ws_plugin__optimizemember_utils_users::get_user_ipn_signup_vars(0, $stripe_customer->id))) { $processing = TRUE; $ipn['txn_type'] = 'subscr_eot'; $ipn['subscr_cid'] = $ipn_signup_vars['subscr_cid']; $ipn['subscr_id'] = $ipn_signup_vars['subscr_id']; $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_name'] = $ipn_signup_vars['item_name']; $ipn['item_number'] = $ipn_signup_vars['item_number']; $ipn['optimizemember_paypal_proxy'] = 'stripe'; $ipn['optimizemember_paypal_proxy_use'] = 'pro-emails'; $ipn['optimizemember_paypal_proxy_verification'] = c_ws_plugin__optimizemember_paypal_utilities::paypal_proxy_key_gen(); c_ws_plugin__optimizemember_utils_urls::remote(site_url('/?optimizemember_paypal_notify=1'), $ipn, array('timeout' => 20)); $stripe['optimizemember_log'][] = 'Stripe Webhook/IPN event type identified as: `' . $event->type . '` on: ' . date('D M j, Y g:i:s a T'); $stripe['optimizemember_log'][] = 'Webhook/IPN event `' . $event->type . '` reformulated. Piping through optimizeMember\'s core gateway processor as `txn_type` (`' . $ipn['txn_type'] . '`).'; $stripe['optimizemember_log'][] = 'Please check core IPN logs for further processing details.'; } break; // Break switch handler. // Break switch handler. case 'customer.subscription.deleted': // Customer subscription deletion. if (!empty($event->data->object) && ($stripe_subscription = $event->data->object) instanceof Stripe_Subscription && ($ipn_signup_vars = c_ws_plugin__optimizemember_utils_users::get_user_ipn_signup_vars(0, $stripe_subscription->id))) { $processing = TRUE; $ipn['txn_type'] = 'subscr_eot'; $ipn['subscr_cid'] = $ipn_signup_vars['subscr_cid']; $ipn['subscr_id'] = $ipn_signup_vars['subscr_id']; $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_name'] = $ipn_signup_vars['item_name']; $ipn['item_number'] = $ipn_signup_vars['item_number']; $ipn['optimizemember_paypal_proxy'] = 'stripe'; $ipn['optimizemember_paypal_proxy_use'] = 'pro-emails'; $ipn['optimizemember_paypal_proxy_verification'] = c_ws_plugin__optimizemember_paypal_utilities::paypal_proxy_key_gen(); c_ws_plugin__optimizemember_utils_urls::remote(site_url('/?optimizemember_paypal_notify=1'), $ipn, array('timeout' => 20)); $stripe['optimizemember_log'][] = 'Stripe Webhook/IPN event type identified as: `' . $event->type . '` on: ' . date('D M j, Y g:i:s a T'); $stripe['optimizemember_log'][] = 'Webhook/IPN event `' . $event->type . '` reformulated. Piping through optimizeMember\'s core gateway processor as `txn_type` (`' . $ipn['txn_type'] . '`).'; $stripe['optimizemember_log'][] = 'Please check core IPN logs for further processing details.'; } break; // Break switch handler. } if (empty($processing)) { $stripe['optimizemember_log'][] = 'Ignoring this Webhook/IPN. The event does NOT require any action on the part of OptimizeMember.'; } } else { $stripe['optimizemember_log'][] = 'Unable to verify Webhook/IPN event ID. This is most likely related to an invalid Stripe configuration. Please check: optimizeMember -› Stripe Options.'; $stripe['optimizemember_log'][] = 'If you\'re absolutely SURE that your Stripe configuration is valid, you may want to run some tests on your server, just to be sure \\$_POST variables (and php://input) are populated; and that your server is able to connect to Stripe over an HTTPS connection.'; $stripe['optimizemember_log'][] = 'optimizeMember uses the Stripe SDK for remote connections; which relies upon the cURL extension for PHP. Please make sure that your installation of PHP has the cURL extension; and that it\'s configured together with OpenSSL for HTTPS communication.'; $stripe['optimizemember_log'][] = var_export($_REQUEST, TRUE) . "\n" . var_export(json_decode(@file_get_contents('php://input')), TRUE); } $logt = c_ws_plugin__optimizemember_utilities::time_details(); $logv = c_ws_plugin__optimizemember_utilities::ver_details(); $logm = c_ws_plugin__optimizemember_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() ? 'stripe-ipn-4-' . trim(preg_replace('/[^a-z0-9]/i', '-', !empty($_log4) ? $_log4 : ''), '-') . '.log' : 'stripe-ipn.log'; if ($GLOBALS['WS_PLUGIN__']['optimizemember']['o']['gateway_debug_logs']) { if (is_dir($logs_dir = $GLOBALS['WS_PLUGIN__']['optimizemember']['c']['logs_dir'])) { if (is_writable($logs_dir) && c_ws_plugin__optimizemember_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__optimizemember_utils_logs::conceal_private_info(var_export($stripe, TRUE)) . "\n\n", FILE_APPEND); } } } 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; // Exit now. } }
/** * Handles ClickBank® IPN URL processing. * * @package optimizeMember\ClickBank * @since 1.5 * * @attaches-to ``add_action("init");`` * * @return null Or exits script execution after handling the Notification. */ public static function clickbank_notify() { global $current_site, $current_blog; if (!empty($_GET["optimizemember_pro_clickbank_notify"]) && $GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["pro_clickbank_username"]) { @ignore_user_abort(true); // Continue processing even if/when connection is broken by the sender. if (is_array($clickbank = c_ws_plugin__optimizemember_pro_clickbank_utilities::clickbank_postvars()) && ($_clickbank = $clickbank)) { $clickbank["optimizemember_log"][] = "IPN received on: " . date("D M j, Y g:i:s a T"); $clickbank["optimizemember_log"][] = "optimizeMember POST vars verified with ClickBank®."; $s2vars = c_ws_plugin__optimizemember_pro_clickbank_utilities::clickbank_parse_s2vars($clickbank["cvendthru"], $clickbank["ctransaction"]); if (isset($s2vars["s2_p1"], $s2vars["s2_p3"]) && $s2vars["s2_p1"] === "0 D") { $s2vars["s2_p1"] = $s2vars["s2_p3"]; } $clickbank["s2vars"] = $s2vars; if (strcasecmp($clickbank["ccustfirstname"] . " " . $clickbank["ccustlastname"], $clickbank["ccustfullname"]) !== 0 && preg_match("/(?:[^ ]+)(?: +)(?:[^ ]+)/", $clickbank["ccustfullname"])) { list($clickbank["ccustfirstname"], $clickbank["ccustlastname"]) = preg_split("/ +/", $clickbank["ccustfullname"], 2); } if (preg_match("/^(?:TEST_)?SALE\$/i", $clickbank["ctransaction"]) && preg_match("/^STANDARD\$/i", $clickbank["cprodtype"])) { $clickbank["optimizemember_log"][] = "ClickBank® transaction identified as ( `SALE/STANDARD` )."; $clickbank["optimizemember_log"][] = "IPN reformulated. Piping through optimizeMember's core/standard PayPal® processor as `txn_type` ( `web_accept` )."; $clickbank["optimizemember_log"][] = "Please check PayPal® IPN logs for further processing details."; $processing = $processed = true; $ipn = array(); // Reset. $ipn["txn_type"] = "web_accept"; $ipn["txn_id"] = $clickbank["ctransreceipt"]; $ipn["custom"] = $s2vars["s2_custom"]; $ipn["mc_gross"] = number_format($clickbank["corderamount"] / 100, 2, ".", ""); $ipn["mc_currency"] = strtoupper($clickbank["ccurrency"]); $ipn["tax"] = number_format("0.00", 2, ".", ""); $ipn["payer_email"] = $clickbank["ccustemail"]; $ipn["first_name"] = ucwords(strtolower($clickbank["ccustfirstname"])); $ipn["last_name"] = ucwords(strtolower($clickbank["ccustlastname"])); $ipn["option_name1"] = $s2vars["s2_referencing"] ? "Referencing Customer ID" : "Originating Domain"; $ipn["option_selection1"] = $s2vars["s2_referencing"] ? $s2vars["s2_referencing"] : $_SERVER["HTTP_HOST"]; $ipn["option_name2"] = "Customer IP Address"; $ipn["option_selection2"] = $s2vars["s2_customer_ip"]; $ipn["item_number"] = $s2vars["s2_invoice"]; $ipn["item_name"] = $s2vars["s2_desc"]; $ipn["optimizemember_paypal_proxy"] = "clickbank"; $ipn["optimizemember_paypal_proxy_use"] = "standard-emails"; $ipn["optimizemember_paypal_proxy_verification"] = c_ws_plugin__optimizemember_paypal_utilities::paypal_proxy_key_gen(); c_ws_plugin__optimizemember_utils_urls::remote(site_url("/?optimizemember_paypal_notify=1"), $ipn, array("timeout" => 20)); } else { if (preg_match("/^(?:TEST_)?SALE\$/i", $clickbank["ctransaction"]) && preg_match("/^RECURRING\$/i", $clickbank["cprodtype"])) { $clickbank["optimizemember_log"][] = "ClickBank® transaction identified as ( `SALE/RECURRING` )."; $clickbank["optimizemember_log"][] = "IPN reformulated. Piping through optimizeMember's core/standard PayPal® processor as `txn_type` ( `subscr_signup` )."; $clickbank["optimizemember_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["s2_subscr_id"]; $ipn["recurring"] = $clickbank["cfuturepayments"] > 1 ? "1" : "0"; $ipn["txn_id"] = $clickbank["ctransreceipt"]; $ipn["custom"] = $s2vars["s2_custom"]; $ipn["period1"] = $s2vars["s2_p1"]; $ipn["period3"] = $s2vars["s2_p3"]; $ipn["mc_amount1"] = number_format($clickbank["corderamount"] / 100, 2, ".", ""); $ipn["mc_amount3"] = number_format($clickbank["crebillamnt"] / 100, 2, ".", ""); $ipn["mc_gross"] = preg_match("/^[1-9]/", $ipn["period1"]) ? $ipn["mc_amount1"] : $ipn["mc_amount3"]; $ipn["mc_currency"] = strtoupper($clickbank["ccurrency"]); $ipn["tax"] = number_format("0.00", 2, ".", ""); $ipn["payer_email"] = $clickbank["ccustemail"]; $ipn["first_name"] = ucwords(strtolower($clickbank["ccustfirstname"])); $ipn["last_name"] = ucwords(strtolower($clickbank["ccustlastname"])); $ipn["option_name1"] = $s2vars["s2_referencing"] ? "Referencing Customer ID" : "Originating Domain"; $ipn["option_selection1"] = $s2vars["s2_referencing"] ? $s2vars["s2_referencing"] : $_SERVER["HTTP_HOST"]; $ipn["option_name2"] = "Customer IP Address"; $ipn["option_selection2"] = $s2vars["s2_customer_ip"]; $ipn["item_number"] = $s2vars["s2_invoice"]; $ipn["item_name"] = $s2vars["s2_desc"]; $ipn["optimizemember_paypal_proxy"] = "clickbank"; $ipn["optimizemember_paypal_proxy_use"] = "standard-emails"; $ipn["optimizemember_paypal_proxy_use"] .= $ipn["mc_gross"] > 0 ? ",subscr-signup-as-subscr-payment" : ""; $ipn["optimizemember_paypal_proxy_verification"] = c_ws_plugin__optimizemember_paypal_utilities::paypal_proxy_key_gen(); c_ws_plugin__optimizemember_utils_urls::remote(site_url("/?optimizemember_paypal_notify=1"), $ipn, array("timeout" => 20)); } else { if (preg_match("/^(?:TEST_)?BILL\$/i", $clickbank["ctransaction"]) && preg_match("/^RECURRING\$/i", $clickbank["cprodtype"])) { $clickbank["optimizemember_log"][] = "ClickBank® transaction identified as ( `BILL/RECURRING` )."; $clickbank["optimizemember_log"][] = "IPN reformulated. Piping through optimizeMember's core/standard PayPal® processor as `txn_type` ( `subscr_payment` )."; $clickbank["optimizemember_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["s2_subscr_id"]; $ipn["txn_id"] = $clickbank["ctransreceipt"]; $ipn["custom"] = $s2vars["s2_custom"]; $ipn["mc_gross"] = number_format($clickbank["corderamount"] / 100, 2, ".", ""); $ipn["mc_currency"] = strtoupper($clickbank["ccurrency"]); $ipn["tax"] = number_format("0.00", 2, ".", ""); $ipn["payer_email"] = $clickbank["ccustemail"]; $ipn["first_name"] = ucwords(strtolower($clickbank["ccustfirstname"])); $ipn["last_name"] = ucwords(strtolower($clickbank["ccustlastname"])); $ipn["option_name1"] = $s2vars["s2_referencing"] ? "Referencing Customer ID" : "Originating Domain"; $ipn["option_selection1"] = $s2vars["s2_referencing"] ? $s2vars["s2_referencing"] : $_SERVER["HTTP_HOST"]; $ipn["option_name2"] = "Customer IP Address"; $ipn["option_selection2"] = $s2vars["s2_customer_ip"]; $ipn["item_number"] = $s2vars["s2_invoice"]; $ipn["item_name"] = $s2vars["s2_desc"]; $ipn["optimizemember_paypal_proxy"] = "clickbank"; $ipn["optimizemember_paypal_proxy_use"] = "standard-emails"; $ipn["optimizemember_paypal_proxy_verification"] = c_ws_plugin__optimizemember_paypal_utilities::paypal_proxy_key_gen(); c_ws_plugin__optimizemember_utils_urls::remote(site_url("/?optimizemember_paypal_notify=1"), $ipn, array("timeout" => 20)); } else { if (preg_match("/^(?:TEST_)?(?:RFND|CGBK|INSF)\$/i", $clickbank["ctransaction"])) { $clickbank["optimizemember_log"][] = "ClickBank® transaction identified as ( `RFND|CGBK|INSF` )."; $clickbank["optimizemember_log"][] = "IPN reformulated. Piping through optimizeMember's core/standard PayPal® processor as `payment_status` ( `refunded|reversed` )."; $clickbank["optimizemember_log"][] = "Please check PayPal® IPN logs for further processing details."; $processing = $processed = true; $ipn = array(); // Reset. $ipn["payment_status"] = preg_match("/^(?:TEST_)?RFND\$/", $clickbank["ctransaction"]) ? "refunded" : "reversed"; $ipn["parent_txn_id"] = preg_match("/^RECURRING\$/i", $clickbank["cprodtype"]) && $s2vars["s2_subscr_id"] ? $s2vars["s2_subscr_id"] : $clickbank["ctransreceipt"]; $ipn["custom"] = $s2vars["s2_custom"]; $ipn["mc_fee"] = "-" . number_format("0.00", 2, ".", ""); $ipn["mc_gross"] = "-" . number_format(abs($clickbank["corderamount"]) / 100, 2, ".", ""); $ipn["mc_currency"] = strtoupper($clickbank["ccurrency"]); $ipn["tax"] = "-" . number_format("0.00", 2, ".", ""); $ipn["payer_email"] = $clickbank["ccustemail"]; $ipn["first_name"] = ucwords(strtolower($clickbank["ccustfirstname"])); $ipn["last_name"] = ucwords(strtolower($clickbank["ccustlastname"])); $ipn["option_name1"] = $s2vars["s2_referencing"] ? "Referencing Customer ID" : "Originating Domain"; $ipn["option_selection1"] = $s2vars["s2_referencing"] ? $s2vars["s2_referencing"] : $_SERVER["HTTP_HOST"]; $ipn["option_name2"] = "Customer IP Address"; $ipn["option_selection2"] = $s2vars["s2_customer_ip"]; $ipn["item_number"] = $s2vars["s2_invoice"]; $ipn["item_name"] = $s2vars["s2_desc"]; $ipn["optimizemember_paypal_proxy"] = "clickbank"; $ipn["optimizemember_paypal_proxy_use"] = "standard-emails"; $ipn["optimizemember_paypal_proxy_verification"] = c_ws_plugin__optimizemember_paypal_utilities::paypal_proxy_key_gen(); c_ws_plugin__optimizemember_utils_urls::remote(site_url("/?optimizemember_paypal_notify=1"), $ipn, array("timeout" => 20)); } } } } if (preg_match("/^(?:TEST_)?(?:SALE|BILL)\$/i", $clickbank["ctransaction"]) && preg_match("/^RECURRING\$/i", $clickbank["cprodtype"]) && (preg_match("/^COMPLETED\$/i", $clickbank["crebillstatus"]) || $clickbank["cfuturepayments"] <= 0) || preg_match("/^(?:TEST_)?CANCEL-REBILL\$/i", $clickbank["ctransaction"]) && preg_match("/^RECURRING\$/i", $clickbank["cprodtype"])) { $clickbank["optimizemember_log"][] = "ClickBank® transaction identified as ( `RECURRING/COMPLETED` or `CANCEL-REBILL` )."; $clickbank["optimizemember_log"][] = "IPN reformulated. Piping through optimizeMember's core/standard PayPal® processor as `txn_type` ( `subscr_cancel` )."; $clickbank["optimizemember_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["s2_subscr_id"]; $ipn["custom"] = $s2vars["s2_custom"]; $ipn["period1"] = $s2vars["s2_p1"]; $ipn["period3"] = $s2vars["s2_p3"]; $ipn["payer_email"] = $clickbank["ccustemail"]; $ipn["first_name"] = ucwords(strtolower($clickbank["ccustfirstname"])); $ipn["last_name"] = ucwords(strtolower($clickbank["ccustlastname"])); $ipn["option_name1"] = $s2vars["s2_referencing"] ? "Referencing Customer ID" : "Originating Domain"; $ipn["option_selection1"] = $s2vars["s2_referencing"] ? $s2vars["s2_referencing"] : $_SERVER["HTTP_HOST"]; $ipn["option_name2"] = "Customer IP Address"; $ipn["option_selection2"] = $s2vars["s2_customer_ip"]; $ipn["item_number"] = $s2vars["s2_invoice"]; $ipn["item_name"] = $s2vars["s2_desc"]; $ipn["optimizemember_paypal_proxy"] = "clickbank"; $ipn["optimizemember_paypal_proxy_use"] = "standard-emails"; $ipn["optimizemember_paypal_proxy_verification"] = c_ws_plugin__optimizemember_paypal_utilities::paypal_proxy_key_gen(); c_ws_plugin__optimizemember_utils_urls::remote(site_url("/?optimizemember_paypal_notify=1"), $ipn, array("timeout" => 20)); } if (!$processed) { // If nothing was processed, here we add a message to the logs indicating the IPN was ignored. $clickbank["optimizemember_log"][] = "Ignoring this IPN request. The transaction does NOT require any action on the part of optimizeMember."; } } else { $clickbank["optimizemember_log"][] = "Unable to verify POST vars. This is most likely related to an invalid ClickBank® configuration. Please check: optimizeMember -› ClickBank® Options."; $clickbank["optimizemember_log"][] = "If you're absolutely SURE that your ClickBank® 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 ClickBank® over an HTTPS connection."; $clickbank["optimizemember_log"][] = "optimizeMember 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."; $clickbank["optimizemember_log"][] = var_export($_REQUEST, true); // Recording _POST + _GET vars for analysis and debugging. } /* If debugging/logging is enabled; we need to append $clickbank to the log file. Logging now supports Multisite Networking as well. */ $logt = c_ws_plugin__optimizemember_utilities::time_details(); $logv = c_ws_plugin__optimizemember_utilities::ver_details(); $logm = c_ws_plugin__optimizemember_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() ? "clickbank-ipn-4-" . trim(preg_replace("/[^a-z0-9]/i", "-", $_log4), "-") . ".log" : "clickbank-ipn.log"; if ($GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["gateway_debug_logs"]) { if (is_dir($logs_dir = $GLOBALS["WS_PLUGIN__"]["optimizemember"]["c"]["logs_dir"])) { if (is_writable($logs_dir) && c_ws_plugin__optimizemember_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__optimizemember_utils_logs::conceal_private_info(var_export($clickbank, true)) . "\n\n", FILE_APPEND); } } } 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; // Exit now. } }
/** * Handles ClickBank® Return URL processing. * * @package optimizeMember\ClickBank * @since 1.5 * * @attaches-to ``add_action("init");`` * * @return null Or exits script execution after redirection. */ public static function clickbank_return() { global $current_site, $current_blog; if (!empty($_GET["optimizemember_pro_clickbank_return"]) && $GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["pro_clickbank_username"]) { if (is_array($clickbank = c_ws_plugin__optimizemember_pro_clickbank_utilities::clickbank_postvars()) && ($_clickbank = $clickbank)) { $clickbank["optimizemember_log"][] = "Return-Data received on: " . date("D M j, Y g:i:s a T"); $clickbank["optimizemember_log"][] = "optimizeMember POST vars verified with ClickBank®."; $clickbank["optimizemember_log"][] = "Sleeping for 5 seconds. Giving ClickBank® a chance to finalize processing."; sleep(5); $clickbank["optimizemember_log"][] = "Awake. It's " . date("D M j, Y g:i:s a T") . ". Processing will continue."; if (is_array($order = json_decode(c_ws_plugin__optimizemember_utils_urls::remote("https://api.clickbank.com/rest/1.3/orders/" . $clickbank["cbreceipt"], false, array_merge(c_ws_plugin__optimizemember_pro_clickbank_utilities::clickbank_api_headers(), array("timeout" => 20))), true)) && ($order = $order["orderData"])) { if (isset($order[0]) && is_array($order[0])) { $order = $order[0]; } // If there is more than one, we only want the first one. $clickbank["optimizemember_log"][] = "Order API variables have been obtained from ClickBank®."; $s2vars = c_ws_plugin__optimizemember_pro_clickbank_utilities::clickbank_parse_s2vars(http_build_query($clickbank, null, "&"), $order["txnType"]); if (isset($s2vars["s2_p1"], $s2vars["s2_p3"]) && $s2vars["s2_p1"] === "0 D") { $s2vars["s2_p1"] = $s2vars["s2_p3"]; } $clickbank["s2vars"] = $s2vars; if (strcasecmp($order["firstName"] . " " . $order["lastName"], $order["customerDisplayName"]) !== 0 && preg_match("/([^ ]+)( +)([^ ]+)/", $order["customerDisplayName"])) { list($order["firstName"], $order["lastName"]) = preg_split("/ +/", $order["customerDisplayName"], 2); } if (preg_match("/^(TEST_)?SALE\$/i", $order["txnType"]) && !isset($s2vars["s2_p1"], $s2vars["s2_p3"])) { $clickbank["optimizemember_log"][] = "ClickBank® transaction identified as ( `SALE/STANDARD` )."; $clickbank["optimizemember_log"][] = "Return-Data reformulated. Piping through optimizeMember's core/standard PayPal® processor as `txn_type` ( `web_accept` )."; $clickbank["optimizemember_log"][] = "Please check PayPal® RTN logs for further processing details."; $rtn = array(); // Reset. $rtn["txn_type"] = "web_accept"; $rtn["txn_id"] = $order["receipt"]; $rtn["custom"] = $s2vars["s2_custom"]; $rtn["mc_gross"] = number_format($order["amount"], 2, ".", ""); $rtn["mc_currency"] = strtoupper($order["currency"]); $rtn["tax"] = "0.00"; // No tax. $rtn["payer_email"] = $order["email"]; $rtn["first_name"] = ucwords(strtolower($order["firstName"])); $rtn["last_name"] = ucwords(strtolower($order["lastName"])); $rtn["option_name1"] = $s2vars["s2_referencing"] ? "Referencing Customer ID" : "Originating Domain"; $rtn["option_selection1"] = $s2vars["s2_referencing"] ? $s2vars["s2_referencing"] : $_SERVER["HTTP_HOST"]; $rtn["option_name2"] = "Customer IP Address"; $rtn["option_selection2"] = $s2vars["s2_customer_ip"]; $rtn["item_number"] = $s2vars["s2_invoice"]; $rtn["item_name"] = $s2vars["s2_desc"]; $rtn_q = "&optimizemember_paypal_proxy=clickbank&optimizemember_paypal_proxy_use=standard-emails"; if (!empty($_GET["optimizemember_pro_clickbank_return_success"])) { $rtn_q .= "&optimizemember_paypal_return_success=" . rawurlencode(trim(stripslashes($_GET["optimizemember_pro_clickbank_return_success"]))); } $rtn_r = add_query_arg(urlencode_deep($rtn), site_url("/?optimizemember_pro_clickbank_return&optimizemember_paypal_return=1" . $rtn_q)); $rtn_r = c_ws_plugin__optimizemember_utils_urls::add_optimizemember_sig($rtn_r, "optimizemember_paypal_proxy_verification"); $clickbank["optimizemember_log"][] = $rtn_r; wp_redirect($rtn_r); } else { if (preg_match("/^(TEST_)?SALE\$/i", $order["txnType"]) && isset($s2vars["s2_p1"], $s2vars["s2_p3"])) { $clickbank["optimizemember_log"][] = "ClickBank® transaction identified as ( `SALE/RECURRING` )."; $clickbank["optimizemember_log"][] = "Return-Data reformulated. Piping through optimizeMember's core/standard PayPal® processor as `txn_type` ( `subscr_signup` )."; $clickbank["optimizemember_log"][] = "Please check PayPal® RTN logs for further processing details."; $rtn = array(); // Reset. $rtn["txn_type"] = "subscr_signup"; $rtn["subscr_id"] = $s2vars["s2_subscr_id"]; $rtn["recurring"] = $order["futurePayments"] > 1 ? "1" : "0"; $rtn["txn_id"] = $order["receipt"]; $rtn["custom"] = $s2vars["s2_custom"]; $rtn["period1"] = $s2vars["s2_p1"]; $rtn["period3"] = $s2vars["s2_p3"]; $rtn["mc_amount1"] = number_format($order["amount"], 2, ".", ""); $rtn["mc_amount3"] = @number_format($order["rebillAmount"], 2, ".", ""); $rtn["mc_currency"] = strtoupper($order["currency"]); $rtn["tax"] = "0.00"; // No tax. $rtn["payer_email"] = $order["email"]; $rtn["first_name"] = ucwords(strtolower($order["firstName"])); $rtn["last_name"] = ucwords(strtolower($order["lastName"])); $rtn["option_name1"] = $s2vars["s2_referencing"] ? "Referencing Customer ID" : "Originating Domain"; $rtn["option_selection1"] = $s2vars["s2_referencing"] ? $s2vars["s2_referencing"] : $_SERVER["HTTP_HOST"]; $rtn["option_name2"] = "Customer IP Address"; $rtn["option_selection2"] = $s2vars["s2_customer_ip"]; $rtn["item_number"] = $s2vars["s2_invoice"]; $rtn["item_name"] = $s2vars["s2_desc"]; $rtn_q = "&optimizemember_paypal_proxy=clickbank&optimizemember_paypal_proxy_use=standard-emails"; if (!empty($_GET["optimizemember_pro_clickbank_return_success"])) { $rtn_q .= "&optimizemember_paypal_return_success=" . rawurlencode(trim(stripslashes($_GET["optimizemember_pro_clickbank_return_success"]))); } $rtn_r = add_query_arg(urlencode_deep($rtn), site_url("/?optimizemember_pro_clickbank_return&optimizemember_paypal_return=1" . $rtn_q)); $rtn_r = c_ws_plugin__optimizemember_utils_urls::add_optimizemember_sig($rtn_r, "optimizemember_paypal_proxy_verification"); $clickbank["optimizemember_log"][] = $rtn_r; wp_redirect($rtn_r); } else { $clickbank["optimizemember_log"][] = "Unexpected txnType. The ClickBank® txnType did not match a required action."; $clickbank["optimizemember_log"][] = "Redirecting Customer to the Home Page, due to an error that occurred."; echo '<script type="text/javascript">' . "\n"; echo "alert('" . c_ws_plugin__optimizemember_utils_strings::esc_js_sq(_x("ERROR: Unexpected txnType. Please contact Support for assistance.\n\nThe ClickBank® txnType did not match a required action.", "optimizemember-front", "optimizemember")) . "');" . "\n"; echo "window.location = '" . c_ws_plugin__optimizemember_utils_strings::esc_js_sq(home_url("/")) . "';"; echo '</script>' . "\n"; } } } else { $clickbank["optimizemember_log"][] = "Unable to obtain API vars. The ClickBank® API may NOT have data for this order yet. Or, your ClickBank® API Keys are NOT configured properly under `optimizeMember -› ClickBank® Options`."; $clickbank["optimizemember_log"][] = var_export($_REQUEST, true); // Recording ``$_POST`` + ``$_GET`` vars for analysis and debugging. $clickbank["optimizemember_log"][] = "Return-Data reformulated. Piping through optimizeMember's core/standard PayPal® processor with `proxy_use` ( `ty-email` )."; $clickbank["optimizemember_log"][] = "Please check PayPal® RTN logs for further processing details."; $rtn_q = "&optimizemember_paypal_proxy=clickbank&optimizemember_paypal_proxy_use=standard-emails,ty-email"; if (!empty($_GET["optimizemember_pro_clickbank_return_success"])) { $rtn_q .= "&optimizemember_paypal_return_success=" . rawurlencode(trim(stripslashes($_GET["optimizemember_pro_clickbank_return_success"]))); } $rtn_r = site_url("/?optimizemember_pro_clickbank_return&optimizemember_paypal_return=1" . $rtn_q); $rtn_r = c_ws_plugin__optimizemember_utils_urls::add_optimizemember_sig($rtn_r, "optimizemember_paypal_proxy_verification"); $clickbank["optimizemember_log"][] = $rtn_r; wp_redirect($rtn_r); } } else { $clickbank["optimizemember_log"][] = "Unable to verify POST vars. This is most likely related to an invalid ClickBank® configuration. Please check: optimizeMember -› ClickBank® Options."; $clickbank["optimizemember_log"][] = "If you're absolutely SURE that your ClickBank® 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 ClickBank® over an HTTPS connection."; $clickbank["optimizemember_log"][] = "optimizeMember 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."; $clickbank["optimizemember_log"][] = var_export($_REQUEST, true); // Recording _POST + _GET vars for analysis and debugging. $clickbank["optimizemember_log"][] = "Redirecting Customer to the Home Page, due to an error that occurred."; echo '<script type="text/javascript">' . "\n"; echo "alert('" . c_ws_plugin__optimizemember_utils_strings::esc_js_sq(_x("ERROR: Unable to verify POST vars. Please contact Support for assistance.\n\nThis is most likely related to an invalid ClickBank® configuration. If you are the site owner, please check: optimizeMember -› ClickBank® Options.", "optimizemember-front", "optimizemember")) . "');" . "\n"; echo "window.location = '" . c_ws_plugin__optimizemember_utils_strings::esc_js_sq(home_url("/")) . "';"; echo '</script>' . "\n"; } $logt = c_ws_plugin__optimizemember_utilities::time_details(); $logv = c_ws_plugin__optimizemember_utilities::ver_details(); $logm = c_ws_plugin__optimizemember_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() ? "clickbank-rtn-4-" . trim(preg_replace("/[^a-z0-9]/i", "-", $_log4), "-") . ".log" : "clickbank-rtn.log"; if ($GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["gateway_debug_logs"]) { if (is_dir($logs_dir = $GLOBALS["WS_PLUGIN__"]["optimizemember"]["c"]["logs_dir"])) { if (is_writable($logs_dir) && c_ws_plugin__optimizemember_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__optimizemember_utils_logs::conceal_private_info(var_export($clickbank, true)) . "\n\n", FILE_APPEND); } } } exit; // Exit now. } }