/** * Calls upon Authorize.Net AIM, and returns the response. * * @package optimizeMember\AuthNet * @since 1.5 * * @param array $post_vars An array of variables to send through the Authorize.Net API call. * @return array An array of variables returned from the API call. * * @todo Continue optimizing this routine with ``empty()`` and ``isset()``. */ public static function authnet_aim_response($post_vars = FALSE) { global $current_site, $current_blog; /* For Multisite support. */ /**/ $url = "https://" . ($GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["pro_authnet_sandbox"] ? "test.authorize.net" : "secure.authorize.net") . "/gateway/transact.dll"; /**/ $post_vars = is_array($post_vars) ? $post_vars : array(); /* Must be in array format. */ /**/ $post_vars["x_version"] = "3.1"; /* Configure the Authorize.Net transaction version. */ $post_vars["x_login"] = $GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["pro_authnet_api_login_id"]; $post_vars["x_tran_key"] = $GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["pro_authnet_api_trans_key"]; /**/ $post_vars["x_delim_data"] = "true"; /* Yes, return a delimited string. */ $post_vars["x_delim_char"] = ","; /* Fields delimitation character. */ $post_vars["x_encap_char"] = '"'; /* Field encapsulation character. */ $post_vars["x_relay_response"] = "false"; /* Always off for AIM. */ /**/ $post_vars["x_invoice_num"] = !empty($post_vars["x_invoice_num"]) ? substr($post_vars["x_invoice_num"], 0, 20) : ""; $post_vars["x_description"] = !empty($post_vars["x_description"]) ? substr($post_vars["x_description"], 0, 255) : ""; $post_vars["x_description"] = c_ws_plugin__optimizemember_utils_strings::strip_2_kb_chars($post_vars["x_description"]); /**/ $input_time = date("D M j, Y g:i:s a T"); /* Record input time for logging. */ /**/ $csv = trim(c_ws_plugin__optimizemember_utils_urls::remote($url, $post_vars, array("timeout" => 20))); /**/ $output_time = date("D M j, Y g:i:s a T"); /* Now record after output time. */ /**/ $response = $csv ? c_ws_plugin__optimizemember_utils_strings::trim_dq_deep(preg_split("/\",\"/", $csv)) : array(); $response = c_ws_plugin__optimizemember_utils_strings::trim_deep(stripslashes_deep($response)); /**/ foreach (array("response_code", "response_subcode", "response_reason_code", "response_reason_text", "authorization_code", "avs_response", "transaction_id", "invoice_number", "description", "amount", "method", "transaction_type", "customer_id", "first_name", "last_name", "company", "address", "city", "state", "zipcode", "country", "phone", "fax", "email", "ship_to_first_name", "ship_to_last_name", "ship_to_company", "ship_to_address", "ship_to_city", "ship_to_state", "ship_to_zipcode", "ship_to_country", "tax", "duty", "freight", "tax_exempt", "po_number", "md5_hash", "card_code_response", "cavv_response", "card_number", "card_type", "split_tender_id", "requested_amount", "balance_on_card") as $order => $field_name) { $response[$field_name] = isset($response[$order]) ? $response[$order] : null; } /**/ if (empty($response["response_code"]) || $response["response_code"] !== "1") { if (strlen($response["response_reason_code"]) || $response["response_reason_text"]) { /* translators: Exclude `%2$s`. This is an English error returned by Authorize.Net. Please replace `%2$s` with: `Unable to process, please try again`, or something to that affect. Or, if you prefer, you could Filter ``$response["__error"]`` with `ws_plugin__optimizemember_pro_authnet_aim_response`. */ $response["__error"] = sprintf(_x('Error #%1$s. %2$s.', "s2member-front", "s2member"), $response["response_reason_code"], rtrim($response["response_reason_text"], ".")); } else { /* Else, generate an error messsage - so something is reported back to the Customer. */ $response["__error"] = _x("Error. Please contact Support for assistance.", "s2member-front", "s2member"); } } /* If debugging is enabled; we need to maintain a comprehensive 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() ? "authnet-api-4-" . trim(preg_replace("/[^a-z0-9]/i", "-", $_log4), "-") . ".log" : "authnet-api.log"; /**/ if (strlen($post_vars["x_card_num"]) > 4) { /* Only log last 4 digits for security. */ $post_vars["x_card_num"] = str_repeat("*", strlen($post_vars["x_card_num"]) - 4) . substr($post_vars["x_card_num"], -4); } /* Then display last 4 digits. */ /**/ 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()) { if ($log = "-------- Input vars: ( " . $input_time . " ) --------\n" . var_export($post_vars, true) . "\n") { if ($log .= "-------- Output string/vars: ( " . $output_time . " ) --------\n" . $csv . "\n" . var_export($response, true)) { file_put_contents($logs_dir . "/" . $log2, $logv . "\n" . $logm . "\n" . $log4 . "\n" . $log . "\n\n", FILE_APPEND); } } } } } /**/ return apply_filters("ws_plugin__optimizemember_pro_authnet_aim_response", c_ws_plugin__optimizemember_pro_authnet_utilities::_authnet_aim_response_filters($response), get_defined_vars()); }