diff --git a/includes/class-gf-web-api-wrapper.php b/includes/class-gf-web-api-wrapper.php index bb00525..8bb3f47 100644 --- a/includes/class-gf-web-api-wrapper.php +++ b/includes/class-gf-web-api-wrapper.php @@ -1,403 +1,401 @@ code = $code; - $this->message = $message; - $this->data = $data; - } +if(!class_exists('GFWebAPIError')){ + class GFWebAPIError{ + public $code; + public $message; + public $data; + + function __construct($code, $message, $data=null){ + $this->code = $code; + $this->message = $message; + $this->data = $data; + } - function get_message(){ - return sprintf("%s (%s)", $this->message, $this->code); - } + function get_message(){ + return sprintf("%s (%s)", $this->message, $this->code); + } - public static function is_error($thing){ - if ( is_object($thing) && is_a($thing, 'GFWebAPIError') ) - return true; + public static function is_error($thing){ + if ( is_object($thing) && is_a($thing, 'GFWebAPIError') ) + return true; - return false; + return false; + } } } -class GFWebAPIWrapper{ - - private $_api_url; - private $_public_key; - private $_private_key; - public $_expires_seconds = null; +if(!class_exists('GFWebAPIWrapper')){ + class GFWebAPIWrapper{ - function __construct($api_url, $public_key, $private_key){ - $this->_api_url = $api_url; - $this->_public_key = $public_key; - $this->_private_key = $private_key; + private $_api_url; + private $_public_key; + private $_private_key; + public $_expires_seconds = null; - } + function __construct($api_url, $public_key, $private_key){ + $this->_api_url = $api_url; + $this->_public_key = $public_key; + $this->_private_key = $private_key; - //------------- FORMS ---------------------------// - /** - * Gets a list of active forms - * Returns a list of all active forms along with their entry count. If there is an error, a GFWebAPIError object will be returned - * Output: - * - * array ( - * "30" => array( - * "id" => 30 - * "title" => "Contact Us" - * "entries" => 0 - * ) - * - * "2" => array( - * "id" => 2 - * "title" => "Send your Feedback" - * "entries" => 23 - * ) - * - * ) - * - * - * @return array|GFWebAPIError - */ - public function get_forms(){ - - $response = $this->send_request("GET", "forms"); - - return $this->prepare_response($response); - } + } - /** - * Gets a form - * Returns a full form object corresponding to the specified form id. If there is an error during the operation, a GFWebAPIError object will be returned - * @param $form_id - The form id to be returned - * @return array|GFWebAPIError - */ - public function get_form($form_id){ - $form_id = absint($form_id); - $response = $this->send_request("GET", "forms/{$form_id}"); - - $form = $this->prepare_response($response); - return $form; - } + //------------- FORMS ---------------------------// + /** + * Gets a list of active forms + * Returns a list of all active forms along with their entry count. If there is an error, a GFWebAPIError object will be returned + * Output: + * + * array ( + * "30" => array( + * "id" => 30 + * "title" => "Contact Us" + * "entries" => 0 + * ) + * + * "2" => array( + * "id" => 2 + * "title" => "Send your Feedback" + * "entries" => 23 + * ) + * + * ) + * + * + * @return array|GFWebAPIError + */ + public function get_forms(){ + + $response = $this->send_request("GET", "forms"); + + return $this->prepare_response($response); + } - /** - * Updates a form - * Updates a form and returns true if the form was updated successfully or GFWebAPIError if there was an error while updating the form - * @param $form_id - The form to be updated - * @param array $form - The new form meta (formatted as an array) - * @return bool|GFWebAPIError - */ - public function update_form($form_id, $form){ - $form_id = absint($form_id); - $response = $this->send_request("PUT", "forms/{$form_id}", "", json_encode($form)); + /** + * Gets a form + * Returns a full form object corresponding to the specified form id. If there is an error during the operation, a GFWebAPIError object will be returned + * @param $form_id - The form id to be returned + * @return array|GFWebAPIError + */ + public function get_form($form_id){ + $form_id = absint($form_id); + $response = $this->send_request("GET", "forms/{$form_id}"); + + $form = $this->prepare_response($response); + return $form; + } - $result = $this->prepare_response($response); + /** + * Updates a form + * Updates a form and returns true if the form was updated successfully or GFWebAPIError if there was an error while updating the form + * @param $form_id - The form to be updated + * @param array $form - The new form meta (formatted as an array) + * @return bool|GFWebAPIError + */ + public function update_form($form_id, $form){ + $form_id = absint($form_id); + $response = $this->send_request("PUT", "forms/{$form_id}", "", json_encode($form)); - return GFWebAPIError::is_error($result) ? $result : true; - } + $result = $this->prepare_response($response); - /** - * Creates new forms - * Creates all specified forms and returns an array of the new form ids. If there was an error while creating the forms, an instance of GFWebAPIError will be returned. - * @param array $forms - An array of form objects to be created. If a form object has an "id" property, it will be ignored when creating the form. - * @return array|GFWebAPIError - Returns an array with the new form ids or an instance of GFWebAPIError - */ - public function create_forms($forms){ + return GFWebAPIError::is_error($result) ? $result : true; + } - $response = $this->send_request("POST", "forms", "", json_encode($forms)); + /** + * Creates new forms + * Creates all specified forms and returns an array of the new form ids. If there was an error while creating the forms, an instance of GFWebAPIError will be returned. + * @param array $forms - An array of form objects to be created. If a form object has an "id" property, it will be ignored when creating the form. + * @return array|GFWebAPIError - Returns an array with the new form ids or an instance of GFWebAPIError + */ + public function create_forms($forms){ - $response = $this->prepare_response($response); + $response = $this->send_request("POST", "forms", "", json_encode($forms)); - if(!GFWebAPIError::is_error($response)) - $response = $response["data"]; + $response = $this->prepare_response($response); - return $response; - } + return $response; + } - /** - * Creates a single form - * Creates a form and returns the new form id. If there was an error while creating the form, an instance of GFWebAPIError will be returned. - * @param array $form - The form objects to be created. If the form object has an "id" property, it will be ignored when creating the form. - * @return array|GFWebAPIError - Returns the new form id or an instance of GFWebAPIError - */ - public function create_form($form){ + /** + * Creates a single form + * Creates a form and returns the new form id. If there was an error while creating the form, an instance of GFWebAPIError will be returned. + * @param array $form - The form objects to be created. If the form object has an "id" property, it will be ignored when creating the form. + * @return array|GFWebAPIError - Returns the new form id or an instance of GFWebAPIError + */ + public function create_form($form){ - $response = $this->create_forms(array($form)); + $response = $this->create_forms(array($form)); - if(!GFWebAPIError::is_error($response)) - $response = $response[0]; + if(!GFWebAPIError::is_error($response)) + $response = $response[0]; - return $response; - } + return $response; + } - /** - * Delete one or more forms - * Deletes a set of forms based on the $form_ids parameter - * @param array $form_ids - The form ids to be deleted - * @return bool|GFWebAPIError - Returns true if all forms were deleted successfully. If one or more forms couldn't be deleted, an instance of GFWebAPIError is returned. - */ - public function delete_forms($form_ids){ - $form_ids_string = implode(";", $form_ids); + /** + * Delete one or more forms + * Deletes a set of forms based on the $form_ids parameter + * @param array $form_ids - The form ids to be deleted + * @return bool|GFWebAPIError - Returns true if all forms were deleted successfully. If one or more forms couldn't be deleted, an instance of GFWebAPIError is returned. + */ + public function delete_forms($form_ids){ + $form_ids_string = implode(";", $form_ids); - $response = $this->send_request("DELETE", "forms/{$form_ids_string}"); + $response = $this->send_request("DELETE", "forms/{$form_ids_string}"); - $result = $this->prepare_response($response); + $result = $this->prepare_response($response); - return GFWebAPIError::is_error($result) ? $result : true; + return GFWebAPIError::is_error($result) ? $result : true; - } + } - /** - * Delete a single form - * Deletes a form specified by the $form_id parameter - * @param array $form_id - The form id to be deleted - * @return bool|GFWebAPIError - Returns true if the form was deleted successfully, or an instance of GFWebAPIError is there was an error. - */ - public function delete_form($form_id){ + /** + * Delete a single form + * Deletes a form specified by the $form_id parameter + * @param array $form_id - The form id to be deleted + * @return bool|GFWebAPIError - Returns true if the form was deleted successfully, or an instance of GFWebAPIError is there was an error. + */ + public function delete_form($form_id){ - return $this->delete_forms(array($form_id)); + return $this->delete_forms(array($form_id)); - } + } - //------------- ENTRIES --------------------------// - /** - * Get entries - * Returns a list of entries based on the specified parameters. - * @param int $form_id - The form id whose entries will be returned - * @param array $search - An array specifying the search criteria. - * Filter by status - * $search_criteria["status"] = "active"; - * - * Filter by date range - * $search_criteria["start_date"] = $start_date; - * $search_criteria["end_date"] = $end_date; - * - * Filter by any column in the main table - * $search_criteria["field_filters"][] = array("key" => "currency", value => "USD"); - * $search_criteria["field_filters"][] = array("key" => "is_read", value => true); - * - * Filter by Field Values - * $search_criteria["field_filters"][] = array('key' => "1", 'value' => "gquiz159982170"); - * - * Filter by a checkbox value (not recommended) - * $search_criteria["field_filters"][] = array('key' => "2.2", 'value' => "gquiz246fec995"); - * note: this will work for checkboxes but it won't work if the checkboxes have been re-ordered - best to use the following example below - * - * Filter by a checkbox value (recommended) - * $search_criteria["field_filters"][] = array('key' => "2", 'value' => "gquiz246fec995"); - * - * Filter by a global search of values of any form field - * $search_criteria["field_filters"][] = array('value' => $search_value); - * OR - * $search_criteria["field_filters"][] = array('key' => 0, 'value' => $search_value); - * - * Filter entries by Entry meta (added using the gform_entry_meta hook) - * $search_criteria["field_filters"][] = array('key' => "gquiz_score", 'value' => "1"); - * $search_criteria["field_filters"][] = array('key' => "gquiz_is_pass", 'value' => "1"); - * - * Filter by ALL / ANY of the field filters - * $search_criteria["field_filters"]["mode"] = "all"; // default - * $search_criteria["field_filters"]["mode"] = "any"; - * - * @param array $sorting - Specifies how the entries should be sorted. Entries can be sorted by a column in the lead table, by a field or by an entry meta. Following is the format. - * $sorting = array('key' => $sort_field, 'direction' => $sort_direction ); - * - * @param array $paging - Specifies the page size and page number, which controls which subset of the entry list will be returned. Following is the format: - * $paging = array('offset' => 0, 'page_size' => 20 ); - * - * @return array|GFWebAPIError - Returns an array of entry objects if the operation is completed successfully or an instance of GFWebAPIError if an error has occurred - */ - public function get_entries($form_id, $search=null, $sorting=null, $paging=null){ - $form_id = absint($form_id); - - $query["sorting"] = $sorting; - $query["paging"] = $paging; - $query["search"] = $search; - - $response = $this->send_request("GET", "forms/{$form_id}/entries", $query); - - return $this->prepare_response($response); - } + //------------- ENTRIES --------------------------// + /** + * Get entries + * Returns a list of entries based on the specified parameters. + * @param int $form_id - The form id whose entries will be returned + * @param array $search - An array specifying the search criteria. + * Filter by status + * $search_criteria["status"] = "active"; + * + * Filter by date range + * $search_criteria["start_date"] = $start_date; + * $search_criteria["end_date"] = $end_date; + * + * Filter by any column in the main table + * $search_criteria["field_filters"][] = array("key" => "currency", value => "USD"); + * $search_criteria["field_filters"][] = array("key" => "is_read", value => true); + * + * Filter by Field Values + * $search_criteria["field_filters"][] = array('key' => "1", 'value' => "gquiz159982170"); + * + * Filter by a checkbox value (not recommended) + * $search_criteria["field_filters"][] = array('key' => "2.2", 'value' => "gquiz246fec995"); + * note: this will work for checkboxes but it won't work if the checkboxes have been re-ordered - best to use the following example below + * + * Filter by a checkbox value (recommended) + * $search_criteria["field_filters"][] = array('key' => "2", 'value' => "gquiz246fec995"); + * + * Filter by a global search of values of any form field + * $search_criteria["field_filters"][] = array('value' => $search_value); + * OR + * $search_criteria["field_filters"][] = array('key' => 0, 'value' => $search_value); + * + * Filter entries by Entry meta (added using the gform_entry_meta hook) + * $search_criteria["field_filters"][] = array('key' => "gquiz_score", 'value' => "1"); + * $search_criteria["field_filters"][] = array('key' => "gquiz_is_pass", 'value' => "1"); + * + * Filter by ALL / ANY of the field filters + * $search_criteria["field_filters"]["mode"] = "all"; // default + * $search_criteria["field_filters"]["mode"] = "any"; + * + * @param array $sorting - Specifies how the entries should be sorted. Entries can be sorted by a column in the lead table, by a field or by an entry meta. Following is the format. + * $sorting = array('key' => $sort_field, 'direction' => $sort_direction ); + * + * @param array $paging - Specifies the page size and page number, which controls which subset of the entry list will be returned. Following is the format: + * $paging = array('offset' => 0, 'page_size' => 20 ); + * + * @return array|GFWebAPIError - Returns an array of entry objects if the operation is completed successfully or an instance of GFWebAPIError if an error has occurred + */ + public function get_entries($form_id, $search=null, $sorting=null, $paging=null){ + $form_id = absint($form_id); + + $query["sorting"] = $sorting; + $query["paging"] = $paging; + $query["search"] = $search; + + $response = $this->send_request("GET", "forms/{$form_id}/entries", $query); + + return $this->prepare_response($response); + } - /** - * Gets a single entry - * - * @param $entry_id - The ID of the entry to be returned - * @return array|GFWebAPIError - Returns an entry object if the operation is completed successfully or an instance of GFWebAPIError if an error has occurred. - */ - public function get_entry($entry_id){ - $entry_id = absint($entry_id); - $response = $this->send_request("GET", "entries/{$entry_id}"); - - return $this->prepare_response($response); - } + /** + * Gets a single entry + * + * @param $entry_id - The ID of the entry to be returned + * @return array|GFWebAPIError - Returns an entry object if the operation is completed successfully or an instance of GFWebAPIError if an error has occurred. + */ + public function get_entry($entry_id){ + $entry_id = absint($entry_id); + $response = $this->send_request("GET", "entries/{$entry_id}"); + + return $this->prepare_response($response); + } - /** - * Updates an entry - * Updates an entry and returns true if the entry was updated successfully or an instance of GFWebAPIError if there was an error. - * @param $entry_id - The entry to be updated - * @param array $entry - The new entry (formatted as an array) - * @return bool|GFWebAPIError - Returns true if the entry was updated successfully or an instance of GFWebAPIError if there was an error. - */ - public function update_entry($entry_id, $entry){ - $entry_id = absint($entry_id); - $response = $this->send_request("PUT", "entries/{$entry_id}", "", json_encode($entry)); + /** + * Updates an entry + * Updates an entry and returns true if the entry was updated successfully or an instance of GFWebAPIError if there was an error. + * @param $entry_id - The entry to be updated + * @param array $entry - The new entry (formatted as an array) + * @return bool|GFWebAPIError - Returns true if the entry was updated successfully or an instance of GFWebAPIError if there was an error. + */ + public function update_entry($entry_id, $entry){ + $entry_id = absint($entry_id); + $response = $this->send_request("PUT", "entries/{$entry_id}", "", json_encode($entry)); - $result = $this->prepare_response($response); + $result = $this->prepare_response($response); - return GFWebAPIError::is_error($result) ? $result : true; - } + return GFWebAPIError::is_error($result) ? $result : true; + } - /** - * Creates new entries - * Creates all specified entries and returns an array of the new entry ids. If there was an error while creating the entries, an instance of GFWebAPIError will be returned. - * @param array $entries - An array of entry objects to be created. If an entry object has an "id" property, it will be ignored when creating it. - * @return array|GFWebAPIError - Returns an array with the new entry ids if the operation is completed successfully or an instance of GFWebAPIError if there was an error. - */ - public function create_entries($entries){ + /** + * Creates new entries + * Creates all specified entries and returns an array of the new entry ids. If there was an error while creating the entries, an instance of GFWebAPIError will be returned. + * @param array $entries - An array of entry objects to be created. If an entry object has an "id" property, it will be ignored when creating it. + * @return array|GFWebAPIError - Returns an array with the new entry ids if the operation is completed successfully or an instance of GFWebAPIError if there was an error. + */ + public function create_entries($entries){ - $response = $this->send_request("POST", "entries", "", json_encode($entries)); + $response = $this->send_request("POST", "entries", "", json_encode($entries)); - $response = $this->prepare_response($response); + $response = $this->prepare_response($response); - if(!GFWebAPIError::is_error($response)) - $response = $response["data"]; + return $response; + } - return $response; - } + /** + * Creates a single entry + * Creates an entry and returns the new entry id. If there was an error while creating the entry, an instance of GFWebAPIError will be returned. + * @param array $entry - The entry object to be created. If an entry object has an "id" property, it will be ignored when creating it. + * @return array|GFWebAPIError - Returns an array with the new entry ids if the operation is completed successfully or an instance of GFWebAPIError if there was an error. + */ + public function create_entry($entry){ - /** - * Creates a single entry - * Creates an entry and returns the new entry id. If there was an error while creating the entry, an instance of GFWebAPIError will be returned. - * @param array $entry - The entry object to be created. If an entry object has an "id" property, it will be ignored when creating it. - * @return array|GFWebAPIError - Returns an array with the new entry ids if the operation is completed successfully or an instance of GFWebAPIError if there was an error. - */ - public function create_entry($entry){ + $response = $this->create_entries(array($entry)); - $response = $this->create_entries(array($entry)); + if(!GFWebAPIError::is_error($response)) + $response = $response[0]; - if(!GFWebAPIError::is_error($response)) - $response = $response[0]; + return $response; + } - return $response; - } + /** + * Delete one or more entries + * Deletes a set of entries based on the $entry_ids parameter + * @param array $entry_ids - An array of entry ids to be deleted + * @return bool|GFWebAPIError - Returns true if all entries were deleted successfully. If one or more entries couldn't be deleted, an instance of GFWebAPIError is returned. + */ + public function delete_entries($entry_ids){ + $entry_ids_string = implode(";", $entry_ids); - /** - * Delete one or more entries - * Deletes a set of entries based on the $entry_ids parameter - * @param array $entry_ids - An array of entry ids to be deleted - * @return bool|GFWebAPIError - Returns true if all entries were deleted successfully. If one or more entries couldn't be deleted, an instance of GFWebAPIError is returned. - */ - public function delete_entries($entry_ids){ - $entry_ids_string = implode(";", $entry_ids); + $response = $this->send_request("DELETE", "entries/{$entry_ids_string}"); - $response = $this->send_request("DELETE", "entries/{$entry_ids_string}"); + $result = $this->prepare_response($response); - $result = $this->prepare_response($response); + return GFWebAPIError::is_error($result) ? $result : true; + } - return GFWebAPIError::is_error($result) ? $result : true; - } + /** + * Delete a single entry + * Deletes a entry specified by the $entry_id parameter + * @param array $entry_id - The entry id to be deleted + * @return bool|GFWebAPIError - Returns true if the entry was deleted successfully, or an instance of GFWebAPIError is there was an error. + */ + public function delete_entry($entry_id){ - /** - * Delete a single entry - * Deletes a entry specified by the $entry_id parameter - * @param array $entry_id - The entry id to be deleted - * @return bool|GFWebAPIError - Returns true if the entry was deleted successfully, or an instance of GFWebAPIError is there was an error. - */ - public function delete_entry($entry_id){ + return $this->delete_entries(array($entry_id)); - return $this->delete_entries(array($entry_id)); + } - } + //------------- RESULTS --------------------------// + /** + * Gets results + * Returns the results associated with the specified form id. Results are created by certain Add-Ons such as Quiz, Polls and Surveys. + * @param $form_id - The form id to return the results from. + * @return array|GFWebAPIError - Returns an array with the results if the operation was completed successfully or an instance of GFWebAPIError if there was an error. + */ + public function get_results($form_id){ + $form_id = absint($form_id); + $response = $this->send_request("GET", "forms/{$form_id}/results"); + + return $this->prepare_response($response); + } - //------------- RESULTS --------------------------// - /** - * Gets results - * Returns the results associated with the specified form id. Results are created by certain Add-Ons such as Quiz, Polls and Surveys. - * @param $form_id - The form id to return the results from. - * @return array|GFWebAPIError - Returns an array with the results if the operation was completed successfully or an instance of GFWebAPIError if there was an error. - */ - public function get_results($form_id){ - $form_id = absint($form_id); - $response = $this->send_request("GET", "forms/{$form_id}/results"); - - return $this->prepare_response($response); - } + //------------------- HELPER METHODS --------------------------------------- - //------------------- HELPER METHODS --------------------------------------- + private function prepare_response($raw_response){ - private function prepare_response($raw_response){ + if(is_wp_error($raw_response)) + return new GFWebAPIError($raw_response->get_error_code(), $raw_response->get_error_message(), $raw_response->get_error_data()); - if(is_wp_error($raw_response)) - return new GFWebAPIError($raw_response->get_error_code(), $raw_response->get_error_message(), $raw_response->get_error_data()); + if($raw_response["response"]["code"] != 200) + return new GFWebAPIError("Http: " . $raw_response["response"]["code"], $raw_response["response"]["message"]); - if($raw_response["response"]["code"] != 200) - return new GFWebAPIError("Http: " . $raw_response["response"]["code"], $raw_response["response"]["message"]); + $body = json_decode($raw_response["body"], true); + if(!isset($body)){ + return new GFWebAPIError("InvalidResponse", "An invalid JSON string was returned by the server.", $raw_response["body"]); + } - $body = json_decode($raw_response["body"], true); - if(!isset($body)){ - return new GFWebAPIError("InvalidResponse", "An invalid JSON string was returned by the server.", $raw_response["body"]); - } + $status = $body["status"]; + $response = $body["response"]; - $status = $body["status"]; - $response = $body["response"]; + if(!in_array($status, array(200, 201, 202))){ + if(is_array($response)){ + $data = isset($response["data"]) ? $response["data"] : ""; + return new GFWebAPIError("Status: " . $status, $response["code"] . " - " . $response["message"], $data); + } else { + return new GFWebAPIError("Status: " . $status, $response); + } - if(!in_array($status, array(200, 201, 202))){ - if(is_array($response)){ - $data = isset($response["data"]) ? $response["data"] : ""; - return new GFWebAPIError("Status: " . $status, $response["code"] . " - " . $response["message"], $data); - } else { - return new GFWebAPIError("Status: " . $status, $response); } - } + //TODO: support returning JSON string as well + return $response; + } - //TODO: support returning JSON string as well - return $response; - } + private function send_request($method, $route, $query=null, $body=null){ - private function send_request($method, $route, $query=null, $body=null){ + $url = $this->get_url($method, $route, $query); - $url = $this->get_url($method, $route, $query); + return wp_remote_request($url, array("method" => $method, "body"=>$body, "timeout" => 25)); + } - return wp_remote_request($url, array("method" => $method, "body"=>$body, "timeout" => 25)); - } + private function get_url($method, $route, $query=null) + { + //expiration based from the current time + $expires = !empty($this->_expires_seconds) && is_numeric($this->_expires_seconds) ? time() + $this->_expires_seconds : time() + 600; - private function get_url($method, $route, $query=null) - { - //expiration based from the current time - $expires = !empty($this->_expires_seconds) && is_numeric($this->_expires_seconds) ? time() + $this->_expires_seconds : time() + 600; + //getting signature + $signature = $this->get_signature($method, $route, $expires); - //getting signature - $signature = $this->get_signature($method, $route, $expires); + if(empty($query)) + $query = array(); - if(empty($query)) - $query = array(); + $query["api_key"] = $this->_public_key; + $query["signature"] = $signature; + $query["expires"] = $expires; - $query["api_key"] = $this->_public_key; - $query["signature"] = $signature; - $query["expires"] = $expires; + $query_str = http_build_query($query); + $query_str = urldecode($query_str); - $query_str = http_build_query($query); - $query_str = urldecode($query_str); + //returning request url + return trailingslashit($this->_api_url) . $route . "?" . $query_str; - //returning request url - return trailingslashit($this->_api_url) . $route . "?" . $query_str; + } - } + private function get_signature($method, $route, $expires) { - private function get_signature($method, $route, $expires) { + $string_to_sign = sprintf("%s:%s:%s:%s", $this->_public_key, $method, $route, $expires); - $string_to_sign = sprintf("%s:%s:%s:%s", $this->_public_key, $method, $route, $expires); + $hash = hash_hmac("sha1", $string_to_sign, $this->_private_key, true); + $sig = rawurlencode(base64_encode($hash)); + return $sig; + } - $hash = hash_hmac("sha1", $string_to_sign, $this->_private_key, true); - $sig = rawurlencode(base64_encode($hash)); - return $sig; } - -} \ No newline at end of file +}