__load_config_file()) { $this->__log("DEBUG", __FUNCTION__, "The ayah_config.php file is missing."); } // Get and use any valid parameters that were passed in via the $params array. foreach ((array)$this->__valid_construct_params as $partial_variable_name) { // Build the full variable name...and create an upper case version. $variable_name = "ayah_" . $partial_variable_name; $uc_variable_name = strtoupper($variable_name); // Check to see if it was passed in via $params. if (isset($params[$partial_variable_name])) { $this->{$variable_name} = $params[$partial_variable_name]; } // Check to see if it was defined in the ayah_config file. elseif (defined($uc_variable_name)) { $this->{$variable_name} = constant($uc_variable_name); } } // Generate some warnings/errors if needed variables are not set. if ($this->ayah_publisher_key == "") { $this->__log("ERROR", __FUNCTION__, "Warning: Publisher key is not defined. This won't work."); } else { $this->__log("DEBUG", __FUNCTION__, "Publisher key: '$this->ayah_publisher_key'"); } if ($this->ayah_scoring_key == "") { $this->__log("ERROR", __FUNCTION__, "Warning: Scoring key is not defined. This won't work."); } else { // For security reasons, don't output the scoring key as part of the debug info. } if ($this->ayah_web_service_host == "") { $this->__log("ERROR", __FUNCTION__, "Warning: Web service host is not defined. This won't work."); } else { $this->__log("DEBUG", __FUNCTION__, "AYAH Webservice host: '$this->ayah_web_service_host'"); } // If available, set the session secret. if(array_key_exists("session_secret", $_REQUEST)) { $this->session_secret = $_REQUEST["session_secret"]; } } /** * Returns the markup for the PlayThru * * @return string */ public function getPublisherHTML($config = array()) { // Initialize. $session_secret = ""; $fields = array('config' => $config); $webservice_url = '/ws/setruntimeoptions/' . $this->ayah_publisher_key; // If necessary, process the config data. if ( ! empty($config)) { // Log it. $this->__log("DEBUG", __FUNCTION__, "Setting runtime options...config data='".implode(",", $config)."'"); // Add the gameid to the options url. if (array_key_exists("gameid", $config)) { $webservice_url .= '/' . $config['gameid']; } } // Call the webservice and get the response. $resp = $this->doHttpsPostReturnJSONArray($this->ayah_web_service_host, $webservice_url, $fields); if ($resp) { // Get the session secret from the response. $session_secret = $resp->session_secret; // Build the url to the AYAH webservice. $url = 'https://'; // The AYAH webservice API requires https. $url.= $this->ayah_web_service_host; // Add the host. $url.= "/ws/script/"; // Add the path to the API script. $url.= urlencode($this->ayah_publisher_key); // Add the encoded publisher key. $url.= (empty($session_secret))? "" : "/".$session_secret; // If set, add the session_secret. // Build and return the needed HTML code. return "
"; } else { // Build and log a detailed message. $url = "https://".$this->ayah_web_service_host.$webservice_url; $message = "Unable to connect to the AYAH webservice server. url='$url'"; $this->__log("ERROR", __FUNCTION__, $message); // Build and display a helpful message to the site user. $style = "padding: 10px; border: 1px solid #EED3D7; background: #F2DEDE; color: #B94A48;"; $message = "Unable to load the Are You a Human PlayThru™. Please contact the site owner to report the problem."; echo "

$message

\n"; } } /** * Check whether the user is a human * Wrapper for the scoreGame API call * * @return boolean */ public function scoreResult() { $result = false; if ($this->session_secret) { $fields = array( 'session_secret' => urlencode($this->session_secret), 'scoring_key' => $this->ayah_scoring_key ); $resp = $this->doHttpsPostReturnJSONArray($this->ayah_web_service_host, "/ws/scoreGame", $fields); if ($resp) { $result = ($resp->status_code == 1); } } else { $this->__log("DEBUG", __FUNCTION__, "Unable to score the result. Please check that your ayah_config.php file contains your correct publisher key and scoring key."); } return $result; } /** * Records a conversion * Called on the goal page that A and B redirect to * A/B Testing Specific Function * * @return boolean */ public function recordConversion() { // Build the url to the AYAH webservice.. $url = 'https://'; // The AYAH webservice API requires https. $url.= $this->ayah_web_service_host; // Add the host. $url.= "/ws/recordConversion/"; // Add the path to the API script. $url.= urlencode($this->ayah_publisher_key); // Add the encoded publisher key. if( isset( $this->session_secret ) ){ return ''; } else { $this->__log("ERROR", __FUNCTION__, 'AYAH Conversion Error: No Session Secret'); return FALSE; } } /** * Do a HTTPS POST, return some JSON decoded as array (Internal function) * @param $host hostname * @param $path path * @param $fields associative array of fields * return JSON decoded data structure or empty data structure */ protected function doHttpsPostReturnJSONArray($hostname, $path, $fields) { $result = $this->doHttpsPost($hostname, $path, $fields); if ($result) { $result = $this->doJSONArrayDecode($result); } else { $this->__log("ERROR", __FUNCTION__, "Post to https://$hostname$path returned no result."); $result = array(); } return $result; } // Internal function; does an HTTPS post protected function doHttpsPost($hostname, $path, $fields) { $result = ""; // URLencode the post string $fields_string = ""; foreach($fields as $key=>$value) { if (is_array($value)) { if ( ! empty($value)) { foreach ($value as $k => $v) { $fields_string .= $key . '['. $k .']=' . $v . '&'; } } else { $fields_string .= $key . '=&'; } } else { $fields_string .= $key.'='.$value.'&'; } } rtrim($fields_string,'&'); // Use cURL? if ($this->__use_curl()) { // Build the cURL url. $curl_url = "https://" . $hostname . $path; $fp = fopen('curlurl', 'w+'); fwrite($fp, $curl_url);fclose($fp); // Log it. $this->__log("DEBUG", __FUNCTION__, "Using cURl: url='$curl_url', fields='$fields_string'"); // Initialize cURL session. if ($ch = curl_init($curl_url)) { // Set the cURL options. curl_setopt($ch, CURLOPT_POST, count($fields)); curl_setopt($ch, CURLOPT_POSTFIELDS, $fields_string); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // Execute the cURL request. $result = curl_exec($ch); // Close the curl session. curl_close($ch); } else { // Log it. $this->__log("DEBUG", __FUNCTION__, "Unable to initialize cURL: url='$curl_url'"); } } else { // Log it. $this->__log("DEBUG", __FUNCTION__, "Using fsockopen(): fields='$fields_string'"); // Build a header $http_request = "POST $path HTTP/1.1\r\n"; $http_request .= "Host: $hostname\r\n"; $http_request .= "Content-Type: application/x-www-form-urlencoded;\r\n"; $http_request .= "Content-Length: " . strlen($fields_string) . "\r\n"; $http_request .= "User-Agent: AreYouAHuman/PHP " . $this->get_version_number() . "\r\n"; $http_request .= "Connection: Close\r\n"; $http_request .= "\r\n"; $http_request .= $fields_string ."\r\n"; $result = ''; $errno = $errstr = ""; $fs = fsockopen("ssl://" . $hostname, 443, $errno, $errstr, 10); if( false == $fs ) { $this->__log("ERROR", __FUNCTION__, "Could not open socket"); } else { fwrite($fs, $http_request); while (!feof($fs)) { $result .= fgets($fs, 4096); } $result = explode("\r\n\r\n", $result, 2); $result = $result[1]; } } // Log the result. $this->__log("DEBUG", __FUNCTION__, "result='$result'"); // Return the result. return $result; } // Internal function: does a JSON decode of the string protected function doJSONArrayDecode($string) { $result = array(); if (function_exists("json_decode")) { try { $result = json_decode( $string); } catch (Exception $e) { $this->__log("ERROR", __FUNCTION__, "Exception when calling json_decode: " . $e->getMessage()); $result = null; } } elseif (file_Exists("json.php")) { require_once('json.php'); $json = new Services_JSON(); $result = $json->decode($string); if (!is_array($result)) { $this->__log("ERROR", __FUNCTION__, "Expected array; got something else: $result"); $result = array(); } } else { $this->__log("ERROR", __FUNCTION__, "No JSON decode function available."); } return $result; } /** * Get the current debug mode (TRUE or FALSE) * * @return boolean */ public function debug_mode($mode=null) { // Set it if the mode is passed. if (null !== $mode) { // Save it. $this->ayah_debug_mode = $mode; // Display a message if debug_mode is TRUE. if ($mode) { $version_number = $this->get_version_number(); $this->__log("DEBUG", "", "Debug mode is now on. (ayah.php version=$version_number)"); // Flush the buffer. $this->__flush_message_buffer(); } } // If necessary, set the default. if ( ! isset($this->ayah_debug_mode) or (null == $this->ayah_debug_mode)) $this->ayah_debug_mode = FALSE; // Return TRUE or FALSE. return ($this->ayah_debug_mode)? TRUE : FALSE; } /** * Get the current version number * * @return string */ public function get_version_number() { return (isset($this->__version_number))? $this->__version_number : FALSE; } /** * Determine whether or not cURL is available to use. * * @return boolean */ private function __use_curl() { if (FALSE === $this->ayah_use_curl) { return FALSE; } elseif (function_exists('curl_init') and function_exists('curl_exec')) { return TRUE; } return FALSE; } /** * Load the config file. * * @return boolean */ private function __load_config_file() { // Initialize. $name = 'ayah_config.php'; $locations = array( './', dirname(__FILE__)."/", ); // Look for the config file in each location. foreach ($locations as $location) { if (file_exists($location.$name)) { require_once($location.$name); return TRUE; } } // Could not find the config file. return FALSE; } /** * Log a message * * @return null */ protected function __log($type, $function, $message) { // Add a prefix to the message. $message = __CLASS__ . "::$function: " . $message; // Is it an error message? if (FALSE !== stripos($type, "error")) { error_log($message); } // Build the full message. $message_style = "padding: 10px; border: 1px solid #EED3D7; background: #F2DEDE; color: #B94A48;"; $full_message = "

$type: $message

\n"; // Output to the screen too? if ($this->debug_mode()) { echo "$full_message"; } else { // Add the message to the buffer in case we need it later. $this->__message_buffer[] = $full_message; } } private function __flush_message_buffer() { // Flush the buffer. if ( ! empty($this->__message_buffer)) { foreach ($this->__message_buffer as $buffered_message) { // Print the buffered message. echo "$buffered_message"; } } } } endif; // if ( ! class_exists('AYAH')):