SMS API PHP Class

The TotalSend PHP class for easy deployment and integration (referenced in examples)

   

   
    <?php
     
    class PanaceaApi {
     
        var $url = "http://smsapi.totalsend.com/json";
     
        var $curl = false;
     
        var $debug = true;
     
        var $error = null;
     
        var $username = null;
     
        var $password = null;
     
        var $performActionsImmediately = true;
     
        var $queuedActions = array();
     
        function __construct() {
            $ver = explode(".", phpversion());
            if(($ver[0] >= 5)) {
                $this->debug("Version OK ".implode(".", $ver));
                if(!function_exists('json_decode') || !function_exists('json_encode')) {
                    $this->debug("You need the json_encode and json_decode functions to use this Class, JSON is available in PHP 5.2.0 and up for alternatives please see http://json.org");
                    $this->debug("Your PHP version is ".implode(".", $ver)." ".__FILE__);
                    die();
                }
            } else {
                $this->debug("You need at least PHP 5 to use this Class ".__FILE__);
                die();
            }
        }
     
        function debug($str, $nl = true) {
            if($this->debug) {
                echo $str;
                if($nl) {
                    echo "\n";
                }
            }
        }
     
        function call_api($url) {
            if(function_exists('curl_init')) {
                if($this->curl === FALSE) {
                    $this->curl = curl_init();
                } else {
                    curl_close($this->curl);
                    $this->curl = curl_init();
                }
                curl_setopt($this->curl, CURLOPT_HEADER, 1);
                curl_setopt($this->curl, CURLOPT_URL, $url);
                curl_setopt($this->curl, CURLOPT_RETURNTRANSFER, 1);
                curl_setopt($this->curl, CURLINFO_HEADER_OUT, true);
                curl_setopt($this->curl, CURLOPT_HTTPHEADER, array("Connection: keep-alive"));
                    
                $result = curl_exec($this->curl);
                    
                $size = curl_getinfo($this->curl, CURLINFO_HEADER_SIZE);
                $request_headers = curl_getinfo($this->curl, CURLINFO_HEADER_OUT);
                $response_headers = substr($result, 0, $size);
                $result = substr($result, $size);
                    
                $this->debug("--- HTTP Request trace --- ");
                $this->debug($request_headers, false);
                $this->debug($response_headers, false);
                $this->debug($result);
                    
     
                    
                if($result !== FALSE) {
                    return json_decode($result, true);
                }
                return false;
            } else {
                $this->debug("You need cURL to use this API Library");
            }
     
            return FALSE;
        }
     
        function call_api_action($method, $params, $authenticate = true) {
            if($this->performActionsImmediately) {
                $url = $this->url."?action=".urlencode($method->getName());
                if($authenticate) {
                    if(!is_null($this->password) && !is_null($this->username)) {
                        $url .= "&username=".urlencode($this->username);
                        $url .= "&password=".urlencode($this->password);
                    } else {
                        $this->debug("You need to specify your username and password using setUsername() and setPassword()");
                        return FALSE;
                    }
                }
                $parameters = $method->getParameters();
                for($i=0;$i<count($params);$i++) {
                    if(!is_null($params[$i])) {
                        $url .= "&".urlencode($parameters[$i]->getName())."=".urlencode($params[$i]);
                    }
                }
                    
                return $this->call_api($url);
            } else {
                if(is_null($this->username) || is_null($this->password)) {
                    $this->debug("You need to specify your username and password using setUsername() and setPassword() to perform bulk actions");
                    return FALSE;
                }
                $action = array(
                    'command' => $method->getName(),
                    'params' => array()
                );
                    
                $parameters = $method->getParameters();
                for($i=0;$i<count($params);$i++) {
                    $action['params'][$parameters[$i]->getName()] = $params[$i];
                }
                    
                $this->queuedActions[] = $action;
                    
                return TRUE;
            }
        }
     
        function execute_multiple() {
            if(function_exists('curl_init')) {
                if($this->curl === FALSE) {
                    $this->curl = curl_init();
                } else {
                    curl_close($this->curl);
                    $this->curl = curl_init();
                }
                    
                $url = $this->url . "?action=execute_multiple";
                $url .= "&username=".urlencode($this->username);
                $url .= "&password=".urlencode($this->password);
                    
                curl_setopt($this->curl, CURLOPT_HEADER, 1);
                curl_setopt($this->curl, CURLOPT_URL, $url);
                curl_setopt($this->curl, CURLOPT_RETURNTRANSFER, 1);
                curl_setopt($this->curl, CURLINFO_HEADER_OUT, true);
                curl_setopt($this->curl, CURLOPT_POST, 1);
                curl_setopt($this->curl, CURLOPT_POSTFIELDS, "data=".urlencode(json_encode($this->queuedActions)));
                curl_setopt($this->curl, CURLOPT_HTTPHEADER, array("Connection: keep-alive"));
                    
                $result = curl_exec($this->curl);
                    
                $size = curl_getinfo($this->curl, CURLINFO_HEADER_SIZE);
                $request_headers = curl_getinfo($this->curl, CURLINFO_HEADER_OUT);
                $response_headers = substr($result, 0, $size);
                $result = substr($result, $size);
                    
                $this->debug("--- HTTP Request trace --- ");
                $this->debug($request_headers,false);
                $this->debug("\n");
                $this->debug($response_headers, false);
                $this->debug($result);
     
                    
                if($result !== FALSE) {
                    return json_decode($result, true);
                }
                return false;
            } else {
                $this->debug("You need cURL to use this API Library");
            }
            return FALSE;
        }
     
        function setUsername($username) {
            $this->username = $username;
        }
     
        function setPassword($password) {
            $this->password = $password;
        }
     
        function performActionsImmediately($state) {
            $this->performActionsImmediately = $state;
        }
     
        function message_send($to, $text, $from = null, $report_mask = 19, $report_url = null, $charset = null, $data_coding = null, $message_class = -1, $auto_detect_encoding = null) {
            $args = func_get_args();
            return $this->call_api_action(new ReflectionMethod(__CLASS__, __FUNCTION__), $args);
        }
     
        function message_status($message_id) {
            $args = func_get_args();
            return $this->call_api_action(new ReflectionMethod(__CLASS__, __FUNCTION__), $args);
        }
     
        function user_get_balance() {
            $args = func_get_args();
            return $this->call_api_action(new ReflectionMethod(__CLASS__, __FUNCTION__), $args);
        }
     
        function batches_list() {
            $args = func_get_args();
            return $this->call_api_action(new ReflectionMethod(__CLASS__, __FUNCTION__), $args);
        }
     
        function batch_start($batch_id) {
            $args = func_get_args();
            return $this->call_api_action(new ReflectionMethod(__CLASS__, __FUNCTION__), $args);
        }
     
        function batch_stop($batch_id) {
            $args = func_get_args();
            return $this->call_api_action(new ReflectionMethod(__CLASS__, __FUNCTION__), $args);
        }
     
        function batch_check_status($batch_id) {
            $args = func_get_args();
            return $this->call_api_action(new ReflectionMethod(__CLASS__, __FUNCTION__), $args);
        }
        
        function address_book_groups_get_list() {
            $args = func_get_args();
            return $this->call_api_action(new ReflectionMethod(__CLASS__, __FUNCTION__), $args);
        }
        
        function address_book_group_add($name) {
            $args = func_get_args();
            return $this->call_api_action(new ReflectionMethod(__CLASS__, __FUNCTION__), $args);
        }
        
        function address_book_group_delete($group_id) {
            $args = func_get_args();
            return $this->call_api_action(new ReflectionMethod(__CLASS__, __FUNCTION__), $args);
        }
        
        function address_book_contacts_get_list($group_id) {
            $args = func_get_args();
            return $this->call_api_action(new ReflectionMethod(__CLASS__, __FUNCTION__), $args);
        }
        
        function address_book_contact_add($group_id, $phone_number, $first_name = null, $last_name = null) {
            $args = func_get_args();
            return $this->call_api_action(new ReflectionMethod(__CLASS__, __FUNCTION__), $args);
        }
        
        function address_book_contact_delete($contact_id) {
            $args = func_get_args();
            return $this->call_api_action(new ReflectionMethod(__CLASS__, __FUNCTION__), $args);
        }
        
        function address_book_contact_update($contact_id, $phone_number = null, $first_name = null, $last_name = null) {
            $args = func_get_args();
            return $this->call_api_action(new ReflectionMethod(__CLASS__, __FUNCTION__), $args);
        }
        
        function user_authorize_application($application_name, $icon_url = null, $return_url = null) {
            $args = func_get_args();
            return $this->call_api_action(new ReflectionMethod(__CLASS__, __FUNCTION__), $args, false);
        }
        
        function user_get_api_key($request_key) {
            $args = func_get_args();
            return $this->call_api_action(new ReflectionMethod(__CLASS__, __FUNCTION__), $args, false);
        }
        
        function route_check_price($to) {
            $args = func_get_args();
            return $this->call_api_action(new ReflectionMethod(__CLASS__, __FUNCTION__), $args);
        }
     
        function batch_create($name, $file, $throughput = 0, $filter = false, $file_type = 'csv', $start_time = null) {
            /* This function has special requirements in terms of streaming raw data, hence it calls the API directly */
            if(function_exists('curl_init')) {
                if($this->curl === FALSE) {
                    $this->curl = curl_init();
                } else {
                    curl_close($this->curl);
                    $this->curl = curl_init();
                }
                
                    
                if(!file_exists($file)) {
                    $this->debug("File {$file} does not exist");
                    return FALSE;
                }
                    
                if($file_type != 'zip') {
                    $data = "data=".urlencode(file_get_contents($file));
                } else {
                    $data = "data=".urlencode(base64_encode(file_get_contents($file)));
                }
                    
                $url = $this->url . "?action=batch_create";
                $url .= "&username=".urlencode($this->username);
                $url .= "&password=".urlencode($this->password);
                $url .= "&name=".urlencode($name);
                $url .= "&file_type=".urlencode($file_type);
                $url .= "&filter=".($filter ? 'true' : 'false');
                $url .= "&throughput=".$throughput;
                
                if(!is_null($start_time)) {
                    $url .= "&start_time=".urlencode($start_time);
                }
                    
                curl_setopt($this->curl, CURLOPT_HEADER, 1);
                curl_setopt($this->curl, CURLOPT_URL, $url);
                curl_setopt($this->curl, CURLOPT_RETURNTRANSFER, 1);
                curl_setopt($this->curl, CURLINFO_HEADER_OUT, true);
                curl_setopt($this->curl, CURLOPT_HTTPHEADER, array("Connection: keep-alive"));
                curl_setopt($this->curl, CURLOPT_POST, 1);
                curl_setopt($this->curl, CURLOPT_POSTFIELDS, $data);
                    
                $result = curl_exec($this->curl);
                    
                $size = curl_getinfo($this->curl, CURLINFO_HEADER_SIZE);
                $request_headers = curl_getinfo($this->curl, CURLINFO_HEADER_OUT);
                $response_headers = substr($result, 0, $size);
                $result = substr($result, $size);
                    
                $this->debug("--- HTTP Request trace --- ");
                $this->debug($request_headers, false);
                $this->debug($response_headers, false);
                $this->debug($result);
                    
     
                    
                if($result !== FALSE) {
                    return json_decode($result, true);
                }
                return false;
            } else {
                $this->debug("You need cURL to use this API Library");
            }
            return false;
     
        }
     
        function ok($result) {
            if(is_array($result)) {
                if(array_key_exists('status', $result)) {
                    if($result['status'] >= 0) {
                        return TRUE;
                    }
                    $this->error = $result['message'];
                }
            } else {
                if($result === TRUE) {
                    $this->error = "Command queued";
                    return TRUE;
                }
                $this->error = "Error communicating with API";
            }
            return FALSE;
        }
     
        function getError() {
            return $this->error;
        }
    }