/** * Handles ClickBank IPN URL processing. * * @package s2Member\ClickBank * @since 1.5 * * @attaches-to ``add_action('init');`` */ public static function clickbank_notify() { global $current_site, $current_blog; // For Multisite support. if (!empty($_GET['s2member_pro_clickbank_notify']) && $GLOBALS['WS_PLUGIN__']['s2member']['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__s2member_pro_clickbank_utilities::clickbank_postvars_v2_1()) && ($_clickbank = $clickbank)) { $clickbank['s2member_log'][] = 'IPN received on: ' . date('D M j, Y g:i:s a T'); $clickbank['s2member_log'][] = 's2Member POST vars verified with ClickBank.'; $s2vars = c_ws_plugin__s2member_pro_clickbank_utilities::clickbank_parse_s2vars_v2_1($clickbank['cvendthru'], $clickbank['ctransaction']); if (isset($s2vars['s2_p1'], $s2vars['s2_p3']) && $s2vars['s2_p1'] === '0 D') { // No Trial defaults to Regular Period. $s2vars['s2_p1'] = $s2vars['s2_p3']; } // Initial Period. No Trial defaults to Regular Period. $clickbank['s2vars'] = $s2vars; // So they appear in the log entry for this Notification. 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['s2member_log'][] = 'ClickBank transaction identified as ( `SALE/STANDARD` ).'; $clickbank['s2member_log'][] = 'IPN reformulated. Piping through s2Member\'s core/standard PayPal processor as `txn_type` ( `web_accept` ).'; $clickbank['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'] = $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['s2member_paypal_proxy'] = 'clickbank'; $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 (preg_match('/^(?:TEST_)?SALE$/i', $clickbank['ctransaction']) && preg_match('/^RECURRING$/i', $clickbank['cprodtype'])) { $clickbank['s2member_log'][] = 'ClickBank transaction identified as ( `SALE/RECURRING` ).'; $clickbank['s2member_log'][] = 'IPN reformulated. Piping through s2Member\'s core/standard PayPal processor as `txn_type` ( `subscr_signup` ).'; $clickbank['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['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['s2member_paypal_proxy'] = 'clickbank'; $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 (preg_match('/^(?:TEST_)?BILL$/i', $clickbank['ctransaction']) && preg_match('/^RECURRING$/i', $clickbank['cprodtype'])) { $clickbank['s2member_log'][] = 'ClickBank transaction identified as ( `BILL/RECURRING` ).'; $clickbank['s2member_log'][] = 'IPN reformulated. Piping through s2Member\'s core/standard PayPal processor as `txn_type` ( `subscr_payment` ).'; $clickbank['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['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['s2member_paypal_proxy'] = 'clickbank'; $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 (preg_match('/^(?:TEST_)?(?:RFND|CGBK|INSF)$/i', $clickbank['ctransaction'])) { $clickbank['s2member_log'][] = 'ClickBank transaction identified as ( `RFND|CGBK|INSF` ).'; $clickbank['s2member_log'][] = 'IPN reformulated. Piping through s2Member\'s core/standard PayPal processor as `payment_status` ( `refunded|reversed` ).'; $clickbank['s2member_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['s2member_paypal_proxy'] = 'clickbank'; $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)); } } } } if (preg_match('/^(?:TEST_)?(?:SALE|BILL)$/i', $clickbank['ctransaction']) && preg_match('/^RECURRING$/i', $clickbank['cprodtype']) && (preg_match('/^COMPLETED$/i', $clickbank['crebillstatus']) || $clickbank['cfuturepayments'] <= 0) && apply_filters('c_ws_plugin__s2member_pro_clickbank_notify_handles_completions', TRUE, get_defined_vars()) || preg_match('/^(?:TEST_)?CANCEL-REBILL$/i', $clickbank['ctransaction']) && preg_match('/^RECURRING$/i', $clickbank['cprodtype'])) { $clickbank['s2member_log'][] = 'ClickBank transaction identified as ( `RECURRING/COMPLETED` or `CANCEL-REBILL` ).'; $clickbank['s2member_log'][] = 'IPN reformulated. Piping through s2Member\'s core/standard PayPal processor as `txn_type` ( `subscr_cancel` ).'; $clickbank['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['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['s2member_paypal_proxy'] = 'clickbank'; $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)); } if (empty($processed)) { // If nothing was processed, here we add a message to the logs indicating the IPN was ignored. $clickbank['s2member_log'][] = 'Ignoring this IPN request. The transaction does NOT require any action on the part of s2Member.'; } } else { $clickbank['s2member_log'][] = 'Unable to verify POST vars. This is most likely related to an invalid ClickBank configuration. Please check: s2Member → ClickBank Options.'; $clickbank['s2member_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['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.'; $clickbank['s2member_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__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() ? 'clickbank-ipn-4-' . trim(preg_replace('/[^a-z0-9]/i', '-', !empty($_log4) ? $_log4 : ''), '-') . '.log' : 'clickbank-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($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 s2Member\ClickBank * @since 1.5 * * @attaches-to ``add_action('init');`` */ public static function clickbank_return() { global $current_site, $current_blog; // For Multisite support. if (!empty($_GET['s2member_pro_clickbank_return']) && $GLOBALS['WS_PLUGIN__']['s2member']['o']['pro_clickbank_username']) { if (is_array($clickbank = c_ws_plugin__s2member_pro_clickbank_utilities::clickbank_postvars_v2_1()) && ($_clickbank = $clickbank)) { $clickbank['s2member_log'][] = 'Return-Data received on: ' . date('D M j, Y g:i:s a T'); $clickbank['s2member_log'][] = 's2Member POST vars verified with ClickBank.'; $clickbank['s2member_log'][] = 'Sleeping for 5 seconds. Giving ClickBank a chance to finalize processing.'; sleep(5); // Sleep here to give ClickBank a chance to finalize processing. Allows the API call to succeed. $clickbank['s2member_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__s2member_utils_urls::remote('https://api.clickbank.com/rest/1.3/orders/' . $clickbank['cbreceipt'], FALSE, array_merge(c_ws_plugin__s2member_pro_clickbank_utilities::clickbank_api_headers(), array('timeout' => 20))), TRUE)) && ($order = $order['orderData'])) { if (is_array($order) && isset($order[0]) && is_array($order[0])) { $order = $order[0]; } // If there is more than one, we only want the first one. foreach ($order as $_k => &$_v) { if (is_array($_v) && isset($_v['@nil'])) { $_v = NULL; } } // Nullify properly. unset($_k, $_v); // Housekeeping. $clickbank['s2member_log'][] = 'Order API variables have been obtained from ClickBank.'; $s2vars = c_ws_plugin__s2member_pro_clickbank_utilities::clickbank_parse_s2vars_v2_1(http_build_query($clickbank, NULL, '&'), $order['txnType']); if (!empty($s2vars['s2_p1']) && !empty($s2vars['s2_p3']) && $s2vars['s2_p1'] === '0 D') { // Initial Period. No Trial defaults to Regular Period. $s2vars['s2_p1'] = $s2vars['s2_p3']; } $clickbank['s2vars'] = $s2vars; // So they appear in the log entry for this Notification. 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']) && empty($s2vars['s2_p1']) && empty($s2vars['s2_p3'])) { $clickbank['s2member_log'][] = 'ClickBank transaction identified as (`SALE/STANDARD`).'; $clickbank['s2member_log'][] = 'Return-Data reformulated. Piping through s2Member\'s core/standard PayPal processor as `txn_type` (`web_accept`).'; $clickbank['s2member_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'] = !empty($s2vars['s2_referencing']) ? 'Referencing Customer ID' : 'Originating Domain'; $rtn['option_selection1'] = !empty($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 = '&s2member_paypal_proxy=clickbank&s2member_paypal_proxy_use=standard-emails'; if (!empty($_GET['s2member_pro_clickbank_return_success'])) { // Using a custom Return URL on success? $rtn_q .= '&s2member_paypal_return_success=' . rawurlencode(trim(stripslashes($_GET['s2member_pro_clickbank_return_success']))); } $rtn_r = add_query_arg(urlencode_deep($rtn), home_url('/?s2member_pro_clickbank_return&s2member_paypal_return=1' . $rtn_q)); $rtn_r = c_ws_plugin__s2member_utils_urls::add_s2member_sig($rtn_r, 's2member_paypal_proxy_verification'); $clickbank['s2member_log'][] = $rtn_r; // Log the full Return redirection URL here. wp_redirect($rtn_r); // Proxy this through s2Member's core PayPal processor. } else { if (preg_match('/^(TEST_)?SALE$/i', $order['txnType']) && !empty($s2vars['s2_p1']) && !empty($s2vars['s2_p3'])) { $clickbank['s2member_log'][] = 'ClickBank transaction identified as (`SALE/RECURRING`).'; $clickbank['s2member_log'][] = 'Return-Data reformulated. Piping through s2Member\'s core/standard PayPal processor as `txn_type` (`subscr_signup`).'; $clickbank['s2member_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'] = !empty($s2vars['s2_referencing']) ? 'Referencing Customer ID' : 'Originating Domain'; $rtn['option_selection1'] = !empty($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 = '&s2member_paypal_proxy=clickbank&s2member_paypal_proxy_use=standard-emails'; if (!empty($_GET['s2member_pro_clickbank_return_success'])) { // Using a custom Return URL on success? $rtn_q .= '&s2member_paypal_return_success=' . rawurlencode(trim(stripslashes($_GET['s2member_pro_clickbank_return_success']))); } $rtn_r = add_query_arg(urlencode_deep($rtn), home_url('/?s2member_pro_clickbank_return&s2member_paypal_return=1' . $rtn_q)); $rtn_r = c_ws_plugin__s2member_utils_urls::add_s2member_sig($rtn_r, 's2member_paypal_proxy_verification'); $clickbank['s2member_log'][] = $rtn_r; // Log the full Return redirection URL here. wp_redirect($rtn_r); // Proxy this through s2Member's core PayPal processor. } else { $clickbank['s2member_log'][] = 'Unexpected txnType. The ClickBank txnType did not match a required action.'; $clickbank['s2member_log'][] = 'Redirecting Customer to the Home Page, due to an error that occurred.'; echo '<script type="text/javascript">' . "\n"; echo "alert('" . c_ws_plugin__s2member_utils_strings::esc_js_sq(_x('ERROR: Unexpected txnType. Please contact Support for assistance.\\n\\nThe ClickBank txnType did not match a required action.', 's2member-front', 's2member')) . "');" . "\n"; echo "window.location = '" . c_ws_plugin__s2member_utils_strings::esc_js_sq(home_url('/')) . "';"; echo '</script>' . "\n"; } } } else { $clickbank['s2member_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 `s2Member ⥱ ClickBank Options`.'; $clickbank['s2member_log'][] = var_export($_REQUEST, TRUE); // Recording ``$_POST`` + ``$_GET`` vars for analysis and debugging. $clickbank['s2member_log'][] = 'Return-Data reformulated. Piping through s2Member\'s core/standard PayPal processor with `proxy_use` (`ty-email`).'; $clickbank['s2member_log'][] = 'Please check PayPal RTN logs for further processing details.'; $rtn_q = '&s2member_paypal_proxy=clickbank&s2member_paypal_proxy_use=standard-emails,ty-email'; if (!empty($_GET['s2member_pro_clickbank_return_success'])) { $rtn_q .= '&s2member_paypal_return_success=' . rawurlencode(trim(stripslashes($_GET['s2member_pro_clickbank_return_success']))); } $rtn_r = home_url('/?s2member_pro_clickbank_return&s2member_paypal_return=1' . $rtn_q); $rtn_r = c_ws_plugin__s2member_utils_urls::add_s2member_sig($rtn_r, 's2member_paypal_proxy_verification'); $clickbank['s2member_log'][] = $rtn_r; // Log the full Return redirection URL here. wp_redirect($rtn_r); // Proxy this through s2Member's core PayPal processor. } } else { $clickbank['s2member_log'][] = 'Unable to verify POST vars. This is most likely related to an invalid ClickBank configuration. Please check: s2Member ⥱ ClickBank Options.'; $clickbank['s2member_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['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.'; $clickbank['s2member_log'][] = var_export($_REQUEST, TRUE); // Recording _POST + _GET vars for analysis and debugging. $clickbank['s2member_log'][] = 'Redirecting Customer to the Home Page, due to an error that occurred.'; echo '<script type="text/javascript">' . "\n"; echo "alert('" . c_ws_plugin__s2member_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: s2Member ⥱ ClickBank Options.', 's2member-front', 's2member')) . "');" . "\n"; echo "window.location = '" . c_ws_plugin__s2member_utils_strings::esc_js_sq(home_url("/")) . "';"; echo '</script>' . "\n"; } $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() ? 'clickbank-rtn-4-' . trim(preg_replace('/[^a-z0-9]/i', '-', !empty($_log4) ? $_log4 : ''), '-') . '.log' : 'clickbank-rtn.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($clickbank, TRUE)) . "\n\n", FILE_APPEND); } } } exit; // Clean exit; all done here. } }