* Requires "XML-RPC for PHP" (http://phpxmlrpc.sourceforge.net) * * This is a private project. * It uses the API provided by sipgate, but sipgate can not and will not support any problems with this software. * You can find the API (including documentation) here: http://www.sipgate.de/api * * @package sipgateAPI * * @version 0.1 * @author Christian Schmidt */ class sipgateAPI { const ClientVersion = 0.1; const ClientName = 'sipgateAPI with PHP'; const ClientVendor = 'Christian Schmidt'; const SIP_URI_prefix = 'sip:'; const SIP_URI_host = '@sipgate.de'; private $client = null; private $url; private $debug; /** * Checks if XML-RPC for PHP is included * * @throws sipgateAPI_Exception when XML-RPC for PHP is not available */ public function __construct($username, $password, $debug = FALSE) { // Check if xmlrpc is included if (!class_exists("xmlrpc_client")) { throw new sipgateAPI_Exception ('You need "xmlrpc for PHP" - Please download at http://phpxmlrpc.sourceforge.net'); }; $this->debug = $debug; if ( !empty($username) AND !empty($password) ) { $this->getClient($username, $password); } else { throw new sipgateAPI_Exception('Provide valid credentials'); }; return $this->client; } /** * configures a client to connect to XML-RPC server * * @param string $username Your sipgate username - the one you use on the website, NOT your SIP-ID * @param string $password * * @return object xmlrpc-client */ private function getClient($username, $password) { if (null === $this->client) { // Build URL $this->url = "https://" . urlencode($username) . ":" . urlencode($password); if (self::isTeam($username)) { $this->url .= "@api.sipgate.net:443/RPC2"; } else { $this->url .= "@samurai.sipgate.net:443/RPC2"; } // create client $this->client = new xmlrpc_client($this->url); if ($this->debug) { $this->client->setDebug(2); } $this->client->setSSLVerifyPeer(FALSE); } return $this->client; } // function setClient private function isTeam($username) { return !FALSE == strpos($username, '@'); } /** * implements samurai.BalanceGet * * @param void * * @return array * * @throws sipgateAPI_Server_Exception on Server responses != 200 OK * */ public function getBalance() { // // checks if method is supported // if ( ! $this->methodSupported(__FUNCTION__) ) { // throw new sipgateAPI_Exception("Method not supported", 400); // } // create message $m = new xmlrpcmsg('samurai.BalanceGet'); // send message $r = $this->client->send($m); if (!$r->faultCode()) { $php_r = php_xmlrpc_decode($r->value()); unset($php_r["StatusCode"]); unset($php_r["StatusString"]); return $php_r; } else { throw new sipgateAPI_Server_Exception($r->faultString(), $r->faultCode()); } } /** * sending SMS * * Sending a text message to a (mobile) phone. Message will be cut off after 160 characters * * @param string $to mobile number, example: 491701234567 * @param string $message cut off after 160 chars * @param string $time unix timestamp in UTC * * @return */ public function sendSMS($to, $message, $time = NULL, $from = NULL) { $remote = self::SIP_URI_prefix . $to . self::SIP_URI_host; $local = (isset($from)) ? (self::SIP_URI_prefix . $from . self::SIP_URI_host) : NULL; $message = substr($message, 0, 160); $this->samurai_SessionInitiate($local, $remote, "text", $message, $time); } /** * sending a PDF file as fax * * @param string $to fax number, example: 492111234567 * @param string $file * @param string $time unix timestamp in UTC * * @return string Returns SessionID */ public function sendFAX($faxnumber, $file, $time = NULL) { $number = self::SIP_URI_prefix . $faxnumber . self::SIP_URI_host; $file = realpath($file); if ( !file_exists($file) ) { throw new Exception("PDF file does not exist"); } elseif ( strtolower(pathinfo($file, PATHINFO_EXTENSION)) != 'pdf' ) { throw new Exception("No PDF file"); }; $pdf_base64 = base64_encode(file_get_contents($file)); $r = $this->samurai_SessionInitiate(NULL, $number, "fax", $pdf_base64, $time); return $r; } /** * implements samurai.SessionInitiate * *@param string $LocalUri as SIP-URI *@param string $RemoteUri as SIP-URI *@param string $TOS Type of service as defined in $availableTOS *@param string $Content depends on TOS *@param dateTime $schedule as unix timestamp * * @return string SessionID, if available * * @throws sipgateAPI_Server_Exception on Server responses != 200 OK */ protected function samurai_SessionInitiate($LocalUri, $RemoteUri, $TOS, $Content, $Schedule = NULL) { if ( isset($LocalUri) ) { $val_a["LocalUri"] = new xmlrpcval($LocalUri); }; if ( isset($RemoteUri) ) { $val_a["RemoteUri"] = new xmlrpcval($RemoteUri); } else { throw new sipgateAPI_Exception("No RemoteUri"); }; if ( isset($TOS) ) { $val_a["TOS"] = new xmlrpcval($TOS); } else { throw new sipgateAPI_Exception("No valid TOS"); }; if ( isset($Content) ) { $val_a["Content"] = new xmlrpcval($Content); }; if ( isset($Schedule) ) { $val_a["Schedule"] = new xmlrpcval(iso8601_encode($Schedule), "dateTime.iso8601"); }; $val_s = new xmlrpcval(); $val_s->addStruct($val_a); $v = array(); $v[] = $val_s; // create message $m = new xmlrpcmsg('samurai.SessionInitiate', $v); // send message $r = $this->client->send($m); if (!$r->faultCode()) { $php_r = php_xmlrpc_decode($r->value()); return $php_r["SessionID"]; } else { throw new sipgateAPI_Server_Exception($r->faultString(), $r->faultCode()); } } }