/** * Handles AliPay Return URL processing. * * @package optimizeMember\AliPay * @since 1.5 * * @attaches-to ``add_action("init");`` * * @return null Or exits script execution after redirection. */ public static function alipay_return() { global $current_site, $current_blog; /**/ if (!empty($_GET["optimizemember_pro_alipay_return"]) && $GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["pro_alipay_seller_email"]) { if (is_array($alipay = c_ws_plugin__optimizemember_pro_alipay_utilities::alipay_postvars()) && ($_alipay = $alipay)) { $alipay["optimizemember_log"][] = "Return-Data received on: " . date("D M j, Y g:i:s a T"); $alipay["optimizemember_log"][] = "optimizeMember POST vars verified through a POST back to AliPay."; /**/ if (preg_match("/^(TRADE_FINISHED|TRADE_SUCCESS)\$/i", $alipay["trade_status"]) && !$alipay["refund_status"]) { $alipay["optimizemember_log"][] = "AliPay transaction identified as ( `TRADE_FINISHED|TRADE_SUCCESS` )."; $alipay["optimizemember_log"][] = "Return-Data reformulated. Piping through optimizeMember's core/standard PayPal processor as `txn_type` ( `web_accept` )."; $alipay["optimizemember_log"][] = "Please check PayPal RTN logs for further processing details."; /**/ list($alipay["invoice"], $alipay["item_number"], $alipay["referencing"], $alipay["customer_ip"]) = preg_split("/~/", $alipay["out_trade_no"]); list($alipay["first_name"], $alipay["last_name"]) = preg_split("/@/", $alipay["buyer_email"], 2); /**/ $rtn = array(); /**/ $rtn["txn_type"] = "web_accept"; $rtn["txn_id"] = $alipay["trade_no"]; $rtn["custom"] = $alipay["extra_common_param"]; /**/ $rtn["mc_gross"] = number_format($alipay["total_fee"], 2, ".", ""); $rtn["mc_currency"] = "CNY"; /* Yuan. */ $rtn["tax"] = "0"; /* No tax. */ /**/ $rtn["payer_email"] = $alipay["buyer_email"]; $rtn["first_name"] = $alipay["first_name"]; $rtn["last_name"] = $alipay["last_name"]; /**/ $rtn["option_name1"] = $alipay["referencing"] ? "Referencing Customer ID" : "Originating Domain"; $rtn["option_selection1"] = $alipay["referencing"] ? $alipay["referencing"] : $_SERVER["HTTP_HOST"]; /**/ $rtn["option_name2"] = "Customer IP Address"; $rtn["option_selection2"] = $alipay["customer_ip"]; /**/ $rtn["item_number"] = $alipay["item_number"]; $rtn["item_name"] = $alipay["body"]; /**/ $rtn_q = "&optimizemember_paypal_proxy=alipay&optimizemember_paypal_proxy_use=standard-emails"; if (!empty($_GET["optimizemember_pro_alipay_return_success"])) { $rtn_q .= "&optimizemember_paypal_return_success=" . rawurlencode(trim(stripslashes($_GET["optimizemember_pro_alipay_return_success"]))); } /**/ $rtn_r = add_query_arg(urlencode_deep($rtn), site_url("/?optimizemember_pro_alipay_return&optimizemember_paypal_return=1" . $rtn_q)); $rtn_r = c_ws_plugin__optimizemember_utils_urls::add_optimizemember_sig($rtn_r, "optimizemember_paypal_proxy_verification"); /**/ $alipay["optimizemember_log"][] = $rtn_r; /**/ wp_redirect($rtn_r); } else { $alipay["optimizemember_log"][] = "Unexpected status. The AliPay status did not match a required action."; /**/ $alipay["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 status. Please contact Support for assistance.\n\nThe AliPay status did NOT match a required action.", "s2member-front", "s2member")) . "');" . "\n"; echo "window.location = '" . c_ws_plugin__optimizemember_utils_strings::esc_js_sq(home_url("/")) . "';"; echo '</script>' . "\n"; } } else { $alipay["optimizemember_log"][] = "Unable to verify POST vars. This is most likely related to an invalid AliPay configuration. Please check: optimizeMember -> AliPay Options."; $alipay["optimizemember_log"][] = "If you're absolutely SURE that your AliPay 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 AliPay over an HTTPS connection."; $alipay["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."; $alipay["optimizemember_log"][] = var_export($_REQUEST, true); /* Recording _POST + _GET vars for analysis and debugging. */ /**/ $alipay["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 AliPay configuration. If you are the site owner, please check: optimizeMember -> AliPay Options.", "s2member-front", "s2member")) . "');" . "\n"; echo "window.location = '" . c_ws_plugin__optimizemember_utils_strings::esc_js_sq(home_url("/")) . "';"; echo '</script>' . "\n"; } /**/ $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() ? "alipay-rtn-4-" . trim(preg_replace("/[^a-z0-9]/i", "-", $_log4), "-") . ".log" : "alipay-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, $logv . "\n" . $logm . "\n" . $log4 . "\n" . var_export($alipay, true) . "\n\n", FILE_APPEND); } } } /**/ exit; /* Exit now. */ } }
/** * Handles AliPay IPN URL processing. * * @package optimizeMember\AliPay * @since 1.5 * * @attaches-to ``add_action("init");`` * * @return null Or exits script execution after handling the Notification. */ public static function alipay_notify() { global $current_site, $current_blog; /* For Multisite support. */ /**/ if (!empty($_POST["notify_type"]) && preg_match("/^trade_status_sync\$/i", $_POST["notify_type"]) && $GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["pro_alipay_seller_email"]) { @ignore_user_abort(true); /* Continue processing even if/when connection is broken by the sender. */ /**/ if (is_array($alipay = c_ws_plugin__optimizemember_pro_alipay_utilities::alipay_postvars()) && ($_alipay = $alipay)) { $alipay["optimizemember_log"][] = "IPN received on: " . date("D M j, Y g:i:s a T"); $alipay["optimizemember_log"][] = "optimizeMember POST vars verified through a POST back to AliPay."; /**/ if (!is_array($alipay_already_p = get_transient("s2m_" . md5("optimizemember_pro_alipay_notify_ids"))) || !in_array($alipay["notify_id"], $alipay_already_p)) { $alipay_already_p = is_array($alipay_already_p) ? array_push($alipay_already_p, $alipay["notify_id"]) : array($alipay["notify_id"]); set_transient("s2m_" . md5("optimizemember_pro_alipay_notify_ids"), array_slice(array_unique($alipay_already_p), 0, 1000), 31556926); /**/ if (preg_match("/^(TRADE_FINISHED|TRADE_SUCCESS)\$/i", $alipay["trade_status"]) && !$alipay["refund_status"]) { $alipay["optimizemember_log"][] = "AliPay transaction identified as ( `TRADE_FINISHED|TRADE_SUCCESS` )."; $alipay["optimizemember_log"][] = "IPN reformulated. Piping through optimizeMember's core/standard PayPal processor as `txn_type` ( `web_accept` )."; $alipay["optimizemember_log"][] = "Please check PayPal IPN logs for further processing details."; /**/ list($alipay["invoice"], $alipay["item_number"], $alipay["referencing"], $alipay["customer_ip"]) = preg_split("/~/", $alipay["out_trade_no"]); list($alipay["first_name"], $alipay["last_name"]) = preg_split("/@/", $alipay["buyer_email"], 2); /**/ $ipn = array(); /* Reset. */ /**/ $ipn["txn_type"] = "web_accept"; /**/ $ipn["txn_id"] = $alipay["trade_no"]; /**/ $ipn["custom"] = $alipay["extra_common_param"]; /**/ $ipn["mc_gross"] = number_format($alipay["total_fee"], 2, ".", ""); $ipn["mc_currency"] = strtoupper("CNY"); /* Yuan. */ $ipn["tax"] = number_format("0.00", 2, ".", ""); /**/ $ipn["payer_email"] = $alipay["buyer_email"]; $ipn["first_name"] = $alipay["first_name"]; $ipn["last_name"] = $alipay["last_name"]; /**/ $ipn["option_name1"] = $alipay["referencing"] ? "Referencing Customer ID" : "Originating Domain"; $ipn["option_selection1"] = $alipay["referencing"] ? $alipay["referencing"] : $_SERVER["HTTP_HOST"]; /**/ $ipn["option_name2"] = "Customer IP Address"; $ipn["option_selection2"] = $alipay["customer_ip"]; /**/ $ipn["item_number"] = $alipay["item_number"]; $ipn["item_name"] = $alipay["body"]; /**/ $ipn_q = "&optimizemember_paypal_proxy=alipay&optimizemember_paypal_proxy_use=standard-emails"; $ipn_q .= "&optimizemember_paypal_proxy_verification=" . urlencode(c_ws_plugin__optimizemember_paypal_utilities::paypal_proxy_key_gen()); /**/ c_ws_plugin__optimizemember_utils_urls::remote(site_url("/?optimizemember_paypal_notify=1" . $ipn_q), $ipn, array("timeout" => 20)); } else { if (preg_match("/^(TRADE_CLOSED|TRADE_SUCCESS)\$/i", $alipay["trade_status"]) && $alipay["refund_status"]) { $alipay["optimizemember_log"][] = "AliPay transaction identified as ( `REFUND_SUCCESS` )."; $alipay["optimizemember_log"][] = "IPN reformulated. Piping through optimizeMember's core/standard PayPal processor as `payment_status` ( `refunded` )."; $alipay["optimizemember_log"][] = "Please check PayPal IPN logs for further processing details."; /**/ list($alipay["invoice"], $alipay["item_number"], $alipay["referencing"], $alipay["customer_ip"]) = preg_split("/~/", $alipay["out_trade_no"]); list($alipay["first_name"], $alipay["last_name"]) = preg_split("/@/", $alipay["buyer_email"], 2); /**/ $ipn = array(); /* Reset. */ /**/ $ipn["payment_status"] = "refunded"; /**/ $ipn["parent_txn_id"] = $alipay["trade_no"]; /**/ $ipn["custom"] = $alipay["extra_common_param"]; /**/ $ipn["mc_fee"] = "-" . number_format("0.00", 2, ".", ""); $ipn["mc_gross"] = "-" . number_format(abs($alipay["total_fee"]), 2, ".", ""); $ipn["mc_currency"] = strtoupper("CNY"); /* Yuan. */ $ipn["tax"] = "-" . number_format("0.00", 2, ".", ""); /**/ $ipn["payer_email"] = $alipay["buyer_email"]; $ipn["first_name"] = $alipay["first_name"]; $ipn["last_name"] = $alipay["last_name"]; /**/ $ipn["option_name1"] = $alipay["referencing"] ? "Referencing Customer ID" : "Originating Domain"; $ipn["option_selection1"] = $alipay["referencing"] ? $alipay["referencing"] : $_SERVER["HTTP_HOST"]; /**/ $ipn["option_name2"] = "Customer IP Address"; $ipn["option_selection2"] = $alipay["customer_ip"]; /**/ $ipn["item_number"] = $alipay["item_number"]; $ipn["item_name"] = $alipay["body"]; /**/ $ipn_q = "&optimizemember_paypal_proxy=alipay&optimizemember_paypal_proxy_use=standard-emails"; $ipn_q .= "&optimizemember_paypal_proxy_verification=" . urlencode(c_ws_plugin__optimizemember_paypal_utilities::paypal_proxy_key_gen()); /**/ c_ws_plugin__optimizemember_utils_urls::remote(site_url("/?optimizemember_paypal_notify=1" . $ipn_q), $ipn, array("timeout" => 20)); } else { $alipay["optimizemember_log"][] = "Ignoring this IPN request. The status does NOT require any action on the part of optimizeMember."; } } } else { $alipay["optimizemember_log"][] = "Ignoring duplicate IPN. optimizeMember has already processed AliPay Notification ID: " . $alipay["notify_id"] . "."; } } else { $alipay["optimizemember_log"][] = "Unable to verify POST vars. This is most likely related to an invalid AliPay configuration. Please check: optimizeMember -> AliPay Options."; $alipay["optimizemember_log"][] = "If you're absolutely SURE that your AliPay 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 AliPay over an HTTPS connection."; $alipay["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."; $alipay["optimizemember_log"][] = var_export($_REQUEST, true); /* Recording _POST + _GET vars for analysis and debugging. */ } /* If debugging/logging is enabled; we need to append $alipay to the log file. Logging now supports Multisite Networking as well. */ $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() ? "alipay-ipn-4-" . trim(preg_replace("/[^a-z0-9]/i", "-", $_log4), "-") . ".log" : "alipay-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, $logv . "\n" . $logm . "\n" . $log4 . "\n" . var_export($alipay, true) . "\n\n", FILE_APPEND); } } } /**/ status_header(200); /* 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("success"); /* Exit now with "success". */ } }