├── .gitignore ├── README.md ├── composer.json ├── examples ├── cancel.php ├── configs.php ├── getStatus.php ├── listMessagesReceived.php ├── searchMessagesReceived.php ├── send.php └── sendMultiple.php └── src ├── Model ├── JsonConverter.php ├── Sms.php ├── SmsFacade.php ├── SmsReceived.php ├── SmsReceivedResponse.php ├── SmsResponse.php └── SmsStatusResponse.php └── RestClient ├── DefaultHttpClient.php ├── HttpClient.php ├── HttpHeader.php ├── HttpRequest.php ├── HttpRequestParser.php ├── HttpResponse.php ├── HttpResponseParser.php ├── RestClient.php └── URL.php /.gitignore: -------------------------------------------------------------------------------- 1 | /vendor 2 | /composer.lock 3 | /composer.phar 4 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # zenvia-php 2 | Biblioteca PHP produzida pela Zenvia para integração com sua API 2.0. Colocamos no GitHub para fazer controle de versionamento e adicionar suporte PSR-4. 3 | 4 | # Instalação 5 | `composer require vitorccsiqueira/zenvia-php` 6 | 7 | # Documentação API 8 | https://zenviasms.docs.apiary.io/ 9 | 10 | # Serviços da API 11 | * Envio de um único SMS 12 | * Envio de vários SMSs simultaneamente 13 | * Consulta Status de um SMS 14 | * Listar Novos SMS recebidos 15 | * Consultar SMS recebidos por Período 16 | * Cancelamento de SMS agendado 17 | 18 | # Callbacks da API (Webhook) 19 | * Status de Entrega 20 | * SMS Recebido 21 | 22 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vitorccsiqueira/zenvia-php", 3 | "type": "project", 4 | "homepage": "http://zenvia.com", 5 | "keywords": ["zenvia", "sms"], 6 | "description": "PHP SDK Zenvia API 2.0", 7 | "authors": [ 8 | { 9 | "name": "Zenvia", 10 | "email": "contato@zenvia.com" 11 | } 12 | ], 13 | "require": { 14 | "php": ">=5.3.0" 15 | }, 16 | "require-dev": { 17 | "php": ">=5.3.0" 18 | }, 19 | "autoload": { 20 | "psr-4": { 21 | "Zenvia\\": "src/" 22 | } 23 | }, 24 | "minimum-stability": "dev", 25 | "prefer-stable": true 26 | } 27 | -------------------------------------------------------------------------------- /examples/cancel.php: -------------------------------------------------------------------------------- 1 | cancel($id); 13 | //09 - Blocked 14 | echo "Status: " . $response->getStatusCode() . " - " . $response->getStatusDescription(); 15 | //002 - Message successfully canceled 16 | echo "\nDetalhe: " . $response->getDetailCode() . " - " . $response->getDetailDescription(); 17 | if ($response->getStatusCode() != "00") { 18 | echo "\nMensagem não pôde ser cancelada."; 19 | } 20 | } catch (\Exception $ex) { 21 | echo "Falha ao fazer o cancelamento da mensagem. Exceção: " . $ex->getMessage() . "\n" . $ex->getTraceAsString(); 22 | } 23 | -------------------------------------------------------------------------------- /examples/configs.php: -------------------------------------------------------------------------------- 1 | 'conta', 5 | 'password'=>'senha', 6 | 'webServiceUrl'=>'https://api-rest.zenvia.com' 7 | ); 8 | -------------------------------------------------------------------------------- /examples/getStatus.php: -------------------------------------------------------------------------------- 1 | getStatus($id); 14 | //Código e descrição do status atual da mensagem 15 | echo "Status: " . $response->getStatusCode() . " - " . $response->getStatusDescription(); 16 | //Código e descrição do detalhe do status atual da mensagem 17 | echo "\nDetalhe: " . $response->getDetailCode() . " - " . $response->getDetailDescription(); 18 | if ($response->getStatusCode() == "00") { 19 | //Id da mensagem 20 | echo "\nId: " . $response->getId(); 21 | //Data de recebimento da mensagem no celular 22 | echo "\nRecebido em: " . $response->getReceived(); 23 | } else { 24 | echo "\nStatus da mensagem não pôde ser consultado."; 25 | } 26 | } catch (\Exception $ex) { 27 | echo "Falha ao fazer consulta de status da mensagem. Exceção: " . $ex->getMessage() . "\n" . $ex->getTraceAsString(); 28 | } 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /examples/listMessagesReceived.php: -------------------------------------------------------------------------------- 1 | listMessagesReceived(); 12 | 13 | echo "Status: " . $response->getStatusCode() . " - " . $response->getStatusDescription(); 14 | echo "\nDetalhe: " . $response->getDetailCode() . " - " . $response->getDetailDescription(); 15 | 16 | if ($response->hasMessages()) { 17 | $messages = $response->getReceivedMessages(); 18 | foreach ($messages as $smsReceived) { 19 | echo "\nCelular: " . $smsReceived->getMobile(); 20 | echo "\nData de recebimento: " . $smsReceived->getDateReceived(); 21 | echo "\nMensagem: " . $smsReceived->getBody(); 22 | //Id da mensagem que originou a mensagem de resposta 23 | echo "\nId da mensagem de origem: " . $smsReceived->getSmsOriginId(); 24 | } 25 | } else { 26 | echo "\nNão foram encontradas mensagens recebidas."; 27 | } 28 | } catch (\Exception $ex) { 29 | echo "Falha ao listar as mensagens recebidas. Exceção: " . $ex->getMessage() . "\n" . $ex->getTraceAsString(); 30 | } 31 | -------------------------------------------------------------------------------- /examples/searchMessagesReceived.php: -------------------------------------------------------------------------------- 1 | setDate(2014, 5, 1); 10 | $date->setTime(0, 0, 0); 11 | 12 | //Formato da data deve obedecer ao padrão descrito na ISO-8601. Exemplo "2015-12-31T09:00:00". 13 | $startPeriod = $date->format("Y-m-d\TH:i:s"); 14 | 15 | $date2 = new \DateTime(); 16 | $date2->setDate(2014, 7, 1); 17 | $date2->setTime(23, 29, 29); 18 | //Formato da data deve obedecer ao padrão descrito na ISO-8601. Exemplo "2015-12-31T09:00:00". 19 | $endPeriod = $date2->format("Y-m-d\TH:i:s"); 20 | 21 | //Id da mensagem de origem que deverá ser usado como filtro na consulta. 22 | $smsId = "53d67682504c8"; 23 | //Celular da mensagem que deverá ser usado como filtro na consulta. 24 | $mobile = "550099999999"; 25 | 26 | try { 27 | 28 | //Pesquisa por mensagens recebidas que obedeçam ao filtro passado. Retorna um objeto do tipo SmsReceivedResponse 29 | //que conterá as mensagens recebidas. 30 | //Os parametros startPeriod e endPeriod são obrigatórios. 31 | //Os parametros mobile e smsId são opcionais. 32 | $response = $smsFacade->searchMessagesReceived($startPeriod, $endPeriod, $mobile, $smsId); 33 | 34 | echo "Status: " . $response->getStatusCode() . " - " . $response->getStatusDescription(); 35 | echo "\nDetalhe: " . $response->getDetailCode() . " - " . $response->getDetailDescription(); 36 | if ($response->hasMessages()) { 37 | $messages = $response->getReceivedMessages(); 38 | foreach ($messages as $smsReceived) { 39 | echo "\nCelular: " . $smsReceived->getMobile(); 40 | echo "\nData de recebimento: " . $smsReceived->getDateReceived(); 41 | echo "\nMensagem: " . $smsReceived->getBody(); 42 | //Id da mensagem que originou a mensagem de resposta 43 | echo "\nId da mensagem de origem: " . $smsReceived->getSmsOriginId(); 44 | } 45 | } else { 46 | echo "\nNão foram encontradas mensagens recebidas."; 47 | } 48 | } catch (\Exception $ex) { 49 | echo "Falha ao pesquisar pelas mensagens recebidas. Exceção: " . $ex->getMessage() . "\n" . $ex->getTraceAsString(); 50 | } 51 | -------------------------------------------------------------------------------- /examples/send.php: -------------------------------------------------------------------------------- 1 | setTo("550099999999"); 11 | $sms->setMsg("Este e um teste de envio de mensagem simples utilizando a api php."); 12 | $sms->setId(uniqid()); 13 | $sms->setCallbackOption(Sms::CALLBACK_NONE); 14 | 15 | $date = new \DateTime(); 16 | $date->setTimeZone(new DateTimeZone('America/Sao_Paulo')); 17 | $date->setDate(2014, 7, 28); 18 | $date->setTime(13, 50, 00); 19 | $schedule = $date->format("Y-m-d\TH:i:s"); 20 | 21 | //Formato da data deve obedecer ao padrão descrito na ISO-8601. Exemplo "2015-12-31T09:00:00" 22 | $sms->setSchedule($schedule); 23 | 24 | try{ 25 | //Envia a mensagem para o webservice e retorna um objeto do tipo SmsResponse com o status da mensagem enviada 26 | $response = $smsFacade->send($sms); 27 | 28 | echo "Status: ".$response->getStatusCode() . " - " . $response->getStatusDescription(); 29 | echo "\nDetalhe: ".$response->getDetailCode() . " - " . $response->getDetailDescription(); 30 | 31 | if($response->getStatusCode()!="00"){ 32 | echo "\nMensagem não pôde ser enviada."; 33 | } 34 | 35 | } 36 | catch(\Exception $ex){ 37 | echo "Falha ao fazer o envio da mensagem. Exceção: ".$ex->getMessage()."\n".$ex->getTraceAsString(); 38 | } 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /examples/sendMultiple.php: -------------------------------------------------------------------------------- 1 | setTo("550099999991"); 13 | $sms->setMsg("Este é um teste de envio de mensagem multiplo utilizando a api php."); 14 | $sms->setId(uniqid()); 15 | $sms->setCallbackOption(Sms::CALLBACK_NONE); 16 | 17 | $date = new \DateTime(); 18 | $date->setTimeZone(new DateTimeZone('America/Sao_Paulo')); 19 | $date->setDate(2014, 7, 28); 20 | $date->setTime(13, 50, 0); 21 | $schedule = $date->format("Y-m-d\TH:i:s"); 22 | 23 | //Formato da data deve obedecer ao padrão descrito na ISO-8601. Exemplo "2015-12-31T09:00:00" 24 | $sms->setSchedule($schedule); 25 | 26 | array_push($smsList, $sms); 27 | 28 | $sms2 = new Sms(); 29 | $sms2->setTo("550099999992"); 30 | $sms2->setMsg("Este é um teste de envio de mensagem multiplo utilizando a api php."); 31 | $sms2->setId(uniqid()); 32 | $sms2->setCallbackOption(Sms::CALLBACK_NONE); 33 | 34 | $date2 = new \DateTime(); 35 | $date2->setTimeZone(new DateTimeZone('America/Sao_Paulo')); 36 | $date2->setDate(2014, 7, 28); 37 | $date2->setTime(13, 50, 00); 38 | $schedule2 = $date2->format("Y-m-d\TH:i:s"); 39 | 40 | //Formato da data deve obedecer ao padrão descrito na ISO-8601. Exemplo "2015-12-31T09:00:00" 41 | $sms2->setSchedule($schedule2); 42 | 43 | array_push($smsList, $sms2); 44 | 45 | try { 46 | //Envia a lista de mensagens para o webservice e retorna uma lista de objetos do tipo SmsResponse com os staus das mensagens enviadas 47 | $responseList = $smsFacade->sendMultiple($smsList); 48 | 49 | foreach ($responseList as $response) { 50 | echo "Status: " . $response->getStatusCode() . " - " . $response->getStatusDescription(); 51 | echo "\nDetalhe: " . $response->getDetailCode() . " - " . $response->getDetailDescription() . "\n"; 52 | } 53 | } catch (\Exception $ex) { 54 | echo "Falha ao fazer o envio das mensagens. Exceção: " . $ex->getMessage() . "\n" . $ex->getTraceAsString(); 55 | } 56 | -------------------------------------------------------------------------------- /src/Model/JsonConverter.php: -------------------------------------------------------------------------------- 1 | getId()!=null){ 55 | $obj->id=$sms->getId(); 56 | } 57 | if($sms->getMsg()!=null){ 58 | $obj->msg=$sms->getMsg(); 59 | } 60 | if($sms->getTo()!=null){ 61 | $obj->to=$sms->getTo(); 62 | } 63 | if($sms->getCallbackOption()!=null){ 64 | $obj->callbackOption=$sms->getCallbackOption(); 65 | } 66 | if($sms->getSchedule()!=null){ 67 | $obj->schedule=$sms->getSchedule(); 68 | } 69 | if($sms->getFrom()!=null){ 70 | $obj->from=$sms->getFrom(); 71 | } 72 | if($sms->getExpiryDate()!=null){ 73 | $obj->expiryDate=$sms->getExpiryDate(); 74 | } 75 | if($sms->getTimeToLive()!=null){ 76 | $obj->timetoLive=$sms->getTimeToLive(); 77 | } 78 | if($aggregateId!=null){ 79 | $obj->aggregateId=$aggregateId; 80 | } 81 | 82 | return json_encode($obj); 83 | 84 | } 85 | 86 | } 87 | -------------------------------------------------------------------------------- /src/Model/Sms.php: -------------------------------------------------------------------------------- 1 | id; 50 | } 51 | 52 | /** 53 | * Método modificador de acesso do id da mensagem. 54 | * @param string $id Id da mensagem. 55 | */ 56 | public function setId($id) { 57 | $this->id = $id; 58 | } 59 | 60 | /** 61 | * Método de acesso ao remetente da mensagem. 62 | * @return string Remetente da mensagem. 63 | */ 64 | public function getFrom() { 65 | return $this->from; 66 | } 67 | 68 | /** 69 | * Método modificador de acesso do remetente da mensagem. 70 | * @param string $from Remetente da mensagem. 71 | */ 72 | public function setFrom($from) { 73 | $this->from = $from; 74 | } 75 | 76 | /** 77 | * Método de acesso ao celular de destino da mensagem. 78 | * @return string Destino da mensagem 79 | */ 80 | public function getTo() { 81 | return $this->to; 82 | } 83 | 84 | /** 85 | * Método modificador de acesso do celular de destino da mensagem. 86 | * @param string $to Destino da mensagem 87 | */ 88 | public function setTo($to) { 89 | $this->to = $to; 90 | } 91 | 92 | /** 93 | * Método de acesso ao conteúdo da mensagem. 94 | * @return string Conteúdo da mensagem. 95 | */ 96 | public function getMsg() { 97 | return $this->msg; 98 | } 99 | 100 | /** 101 | * Método modificador de acesso do conteúdo da mensagem. 102 | * @param string $msg Conteúdo da mensagem. 103 | */ 104 | public function setMsg($msg) { 105 | $this->msg = $msg; 106 | } 107 | 108 | /** 109 | * Método de acesso para a data de agendamento da mensagem. 110 | * @return string Data de agendamento da mensagem no formato ISO 8601(yyyy-MM-dd'T'HH:mm:ss) 111 | */ 112 | public function getSchedule() { 113 | return $this->schedule; 114 | } 115 | 116 | /** 117 | * @param string $schedule método modificador de acesso para a data de agendamento da mensagem. 118 | * O formato informado deverá ser o mesmo descrito na ISO 8601(yyyy-MM-dd'T'HH:mm:ss) 119 | */ 120 | public function setSchedule($schedule) { 121 | $this->schedule = $schedule; 122 | } 123 | 124 | /** 125 | * Método de acesso para o tipo de callback da mensagem. 126 | * @return string Tipo do callback da mensagem. 127 | */ 128 | public function getCallbackOption() { 129 | return $this->callbackOption; 130 | } 131 | 132 | /** 133 | * Método modificador de acesso do tipo de callback da mensagem. 134 | * @param string $callbackOption Tipo de do callback da mensagem. 135 | * Poderá ser NONE, FINAL, ou ALL. 136 | */ 137 | public function setCallbackOption($callbackOption) { 138 | $this->callbackOption = $callbackOption; 139 | } 140 | 141 | public function getTimeToLive() { 142 | return $this->timeToLive; 143 | } 144 | 145 | public function setTimeToLive($timeToLive) { 146 | $this->timeToLive = $timeToLive; 147 | } 148 | 149 | public function getExpiryDate() { 150 | return $this->expiryDate; 151 | } 152 | 153 | public function setExpiryDate($expiryDate) { 154 | $this->expiryDate = $expiryDate; 155 | } 156 | 157 | } 158 | -------------------------------------------------------------------------------- /src/Model/SmsFacade.php: -------------------------------------------------------------------------------- 1 | accountAlias = $accountAlias; 42 | $this->accountPassword = $accountPassword; 43 | if($webServiceUrl==null){ 44 | $this->webServiceUrl=self::DEFAULT_WEBSERVICE_URL; 45 | } 46 | else{ 47 | $this->webServiceUrl=$webServiceUrl; 48 | } 49 | $this->client=new RestClient(); 50 | 51 | } 52 | 53 | /** 54 | * Faz um envio de mensagem simples. 55 | * @param Sms $sms O SMS que deverá ser enviado. Este parâmetro é obrigatório 56 | * @param int $aggregateId O id do agrupador que deverá ser relacionado ao envio. 57 | * Este parâmetro será obrigatório apenas se a conta possuir a configuração de agrupador habilitada. 58 | * @return SmsResponse Resposta com o status e o detalhe da mensagem enviada 59 | * @throws RuntimeException 60 | */ 61 | public function send($sms, $aggregateId=null){ 62 | $headers = $this->getBaseHeaders(); 63 | $json = JsonConverter::smsToJson($sms, $aggregateId); 64 | $client = $this->client; 65 | $url=$this->webServiceUrl."/services/send-sms"; 66 | $response = $client->post($url, $json, $headers); 67 | $this->checkResponse($response); 68 | $obj = json_decode($response->getBody()); 69 | $sendSmsResponse=$obj->sendSmsResponse; 70 | $smsResponse = new SmsResponse($sendSmsResponse->statusCode, $sendSmsResponse->statusDescription, $sendSmsResponse->detailCode, $sendSmsResponse->detailDescription); 71 | return $smsResponse; 72 | } 73 | 74 | /** 75 | * Faz um envio de mensagem múltiplo. 76 | * @param array $smsList Array contendo uma lista de SMS para serem enviados.Este parâmetro é obrigatório 77 | * @param int $aggregateId O id do agrupador que deverá ser relacionado ao envio. 78 | * Este parâmetro será obrigatório apenas se a conta possuir a configuração de agrupador habilitada. 79 | * @return array Lista de objetos do tipo SmsResponse. 80 | * @throws RuntimeException 81 | */ 82 | public function sendMultiple($smsList, $aggregateId=null){ 83 | $headers = $this->getBaseHeaders(); 84 | $json = JsonConverter::smsListToJson($smsList, $aggregateId); 85 | $client = $this->client; 86 | $url=$this->webServiceUrl."/services/send-sms-multiple"; 87 | $response = $client->post($url, $json, $headers); 88 | $this->checkResponse($response); 89 | $obj = json_decode($response->getBody()); 90 | $responses = array(); 91 | if(is_object($obj)){ 92 | foreach($obj->sendSmsMultiResponse->sendSmsResponseList as $sendSmsResponse){ 93 | $smsResponse = new SmsResponse($sendSmsResponse->statusCode, $sendSmsResponse->statusDescription, $sendSmsResponse->detailCode, $sendSmsResponse->detailDescription); 94 | array_push($responses, $smsResponse); 95 | } 96 | } 97 | return $responses; 98 | } 99 | 100 | /** 101 | * Faz o cancelamento de uma mensagem. 102 | * @param string $id Id da mensagem que deverá ser cancelada. Este parâmetro é obrigatório. 103 | * @return SmsResponse Resposta com o status e o detalhe da operação de cancelamento. 104 | * @throws RuntimeException 105 | */ 106 | public function cancel($id){ 107 | $headers = $this->getBaseHeaders(); 108 | $client = $this->client; 109 | $url=$this->webServiceUrl."/services/cancel-sms/".$id; 110 | $response = $client->post($url, null, $headers); 111 | $this->checkResponse($response); 112 | $obj = json_decode($response->getBody()); 113 | $cancelSmsResp=$obj->cancelSmsResp; 114 | $smsResponse = new SmsResponse($cancelSmsResp->statusCode, $cancelSmsResp->statusDescription, $cancelSmsResp->detailCode, $cancelSmsResp->detailDescription); 115 | return $smsResponse; 116 | } 117 | 118 | /** 119 | * Faz a consulta do status atual de uma mensagem enviada. 120 | * @param string $id Id da mensagem a ser consultada. Este parâmetro é obrigatório. 121 | * @return SmsStatusResponse Resposta com o status e o detalhe da mensagem a ser consultada. 122 | * @throws RuntimeException 123 | */ 124 | public function getStatus($id){ 125 | $headers = $this->getBaseHeaders(); 126 | $headers['Content-Type']=null; 127 | $client = $this->client; 128 | $url=$this->webServiceUrl."/services/get-sms-status/".$id; 129 | $response = $client->get($url, $headers); 130 | $this->checkResponse($response); 131 | $obj = json_decode($response->getBody()); 132 | $statusSms=$obj->getSmsStatusResp; 133 | $statusResponse = new SmsStatusResponse(); 134 | $statusResponse->setStatusCode($statusSms->statusCode); 135 | $statusResponse->setStatusDescription($statusSms->statusDescription); 136 | $statusResponse->setDetailCode($statusSms->detailCode); 137 | $statusResponse->setDetailDescription($statusSms->detailDescription); 138 | $statusResponse->setId($statusSms->id); 139 | $statusResponse->setReceived($statusSms->received); 140 | $statusResponse->setShortCode($statusSms->shortcode); 141 | $statusResponse->setMobileOperatorName($statusSms->mobileOperatorName); 142 | return $statusResponse; 143 | } 144 | 145 | /** 146 | * Faz a listagem de mensagens recebidas que ainda não foram consultadas. 147 | * Os SMS recebidos retornados por esta consulta só poderão ser consultados apenas uma única vez 148 | * de forma que se um SMS é retornado nesta consulta o mesmo não será listado novamente em uma consulta posterior. 149 | * Caso seja necessário consultar as mesmas mensagens recebidas múltiplas vezes, deverá ser usado o método @see SmsFacade::searchMessagesReceived 150 | * @return SmsReceivedResponse Resposta com as mensagens recebidas. 151 | * @throws RuntimeException 152 | */ 153 | public function listMessagesReceived(){ 154 | $headers = $this->getBaseHeaders(); 155 | $client = $this->client; 156 | $url=$this->webServiceUrl."/services/received/list"; 157 | $response = $client->post($url, null, $headers); 158 | $this->checkResponse($response); 159 | $smsResponse = $this->parseMoList($response->getBody()); 160 | return $smsResponse; 161 | } 162 | 163 | /** 164 | * Faz a consulta de todas as mensagens recebidas no período informado. Este método deverá 165 | * retornar todas as mensagens recebidas que coincidirem com o filtro passado 166 | * independentemente se as mesmas já terem sido consultadas anteriormente. 167 | * @param string $startPeriod Data inicial no formato descrito na ISO 8601(yyyy-MM-dd'T'HH:mm:ss). Este parâmetro é obrigatório. 168 | * @param string $endPeriod Data final no formato descrito na ISO 8601(yyyy-MM-dd'T'HH:mm:ss). Este parâmetro é obrigatório. 169 | * @param string $mobile Celular a ser utilizado na pesquisa de mensagens recebidas. 170 | * @param $smsId $smsId Id da mensagem de origem a ser utilizado na pesquisa de mensagens recebidas. 171 | * @return SmsReceivedResponse Resposta com as mensagens recebidas. 172 | * @throws RuntimeException 173 | */ 174 | public function searchMessagesReceived($startPeriod, $endPeriod, $mobile=null, $smsId=null ){ 175 | $headers = $this->getBaseHeaders(); 176 | $headers['Content-Type']=null; 177 | $client = $this->client; 178 | $url=$this->webServiceUrl."/services/received/search/".rawurlencode($startPeriod).'/'.rawurlencode($endPeriod).'?'; 179 | if($mobile!=null){ 180 | $url .='mobile='.rawurlencode($mobile).'&'; 181 | } 182 | if($smsId!=null){ 183 | $url .='mtId='.rawurlencode($smsId); 184 | } 185 | $url = rtrim($url, '&'); 186 | $response = $client->get($url, $headers); 187 | $this->checkResponse($response); 188 | $smsResponse = $this->parseMoList($response->getBody()); 189 | return $smsResponse; 190 | } 191 | 192 | /** 193 | * Faz o parse do json de resposta com a representação da lista de mensagens recebidas do webservice para um objeto @see SmsReceivedResponse. 194 | * @param string $jsonResponse Json retornado pelo webservice. 195 | * @return SmsReceivedResponse Resposta com as mensagens recebidas. 196 | */ 197 | private function parseMoList($jsonResponse){ 198 | $obj = json_decode($jsonResponse); 199 | $smsResponse = new SmsReceivedResponse($obj->receivedResponse->statusCode, $obj->receivedResponse->statusDescription, $obj->receivedResponse->detailCode, $obj->receivedResponse->detailDescription); 200 | if( is_array($obj->receivedResponse->receivedMessages) && count($obj->receivedResponse->receivedMessages) > 0 ){ 201 | foreach($obj->receivedResponse->receivedMessages as $message){ 202 | $receivedMessage = new SmsReceived(); 203 | $receivedMessage->setBody($message->body); 204 | $receivedMessage->setDateReceived($message->dateReceived); 205 | $receivedMessage->setId($message->id); 206 | $receivedMessage->setMobile($message->mobile); 207 | $receivedMessage->setMobileOperatorName($message->mobileOperatorName); 208 | $receivedMessage->setShortCode($message->shortcode); 209 | $receivedMessage->setSmsOriginId($message->mtId); 210 | $smsResponse->addReceivedMessage($receivedMessage); 211 | } 212 | } 213 | return $smsResponse; 214 | } 215 | 216 | /** 217 | * Verifica se o serviço retornou uma resposta válida. 218 | * @param HttpResponse $response 219 | * @throws RuntimeException Se o servidor restornou uma resposta inválida. 220 | */ 221 | private function checkResponse($response){ 222 | if($response->getHttpCode()>= 400){ 223 | $exceptionMessage=$response->getHttpCode().' - '.$response->getHttpDescription()." \nServer Response\n".$response->getBody()."."."\nApi Request\n[".$response->getRequestOrigin(); 224 | throw new \RuntimeException($exceptionMessage); 225 | } 226 | } 227 | 228 | /** 229 | * Headers base para as requisições. 230 | * @return array Array associativo com os headers comuns das requisições. 231 | */ 232 | private function getBaseHeaders(){ 233 | $accountAlias=$this->accountAlias; 234 | $accountPassword=$this->accountPassword; 235 | $headers = array( 236 | 'Accept'=>'application/json', 237 | 'Content-Type'=>'application/json; charset=UTF-8', 238 | 'Authorization'=> 'Basic '. base64_encode($accountAlias.':'.$accountPassword) 239 | ); 240 | return $headers; 241 | } 242 | } 243 | -------------------------------------------------------------------------------- /src/Model/SmsReceived.php: -------------------------------------------------------------------------------- 1 | id; 45 | } 46 | 47 | /** 48 | * Método acessor para a data de recebimento da mensagem. 49 | * @return string Data de recebimento da mensagem no formato ISO 8601(yyyy-MM-dd'T'HH:mm:ss). 50 | */ 51 | public function getDateReceived() { 52 | return $this->dateReceived; 53 | } 54 | 55 | /** 56 | * Método acessor ao celular da mensagem recebida. 57 | * @return string Celular da mensagem recebida 58 | */ 59 | public function getMobile() { 60 | return $this->mobile; 61 | } 62 | 63 | /** 64 | * Método acessor ao conteúdo da mensagem recebida. 65 | * @return string Conteúdo da mensagem recebida 66 | */ 67 | public function getBody() { 68 | return $this->body; 69 | } 70 | 71 | /** 72 | * Método acessor ao Shortcode da mensagem recebida. 73 | * @return string Shortcode da mensagem recebida 74 | */ 75 | public function getShortCode() { 76 | return $this->shortCode; 77 | } 78 | 79 | /** 80 | * Método acessor para a operadora do celular da mensagem recebida. 81 | * @return string Operadora celular da mensagem recebida 82 | */ 83 | public function getMobileOperatorName() { 84 | return $this->mobileOperatorName; 85 | } 86 | 87 | /** 88 | * Método acessor ao id do SMS de origem da mensagem recebida. 89 | * @return string Id do SMS de origem da mensagem recebida. 90 | */ 91 | public function getSmsOriginId() { 92 | return $this->smsOriginId; 93 | } 94 | 95 | public function setId($id) { 96 | $this->id = $id; 97 | } 98 | 99 | public function setDateReceived($dateReceived) { 100 | $this->dateReceived = $dateReceived; 101 | } 102 | 103 | public function setMobile($mobile) { 104 | $this->mobile = $mobile; 105 | } 106 | 107 | public function setBody($body) { 108 | $this->body = $body; 109 | } 110 | 111 | public function setShortCode($shortCode) { 112 | $this->shortCode = $shortCode; 113 | } 114 | 115 | public function setMobileOperatorName($mobileOperatorName) { 116 | $this->mobileOperatorName = $mobileOperatorName; 117 | } 118 | 119 | public function setSmsOriginId($smsOriginId) { 120 | $this->smsOriginId = $smsOriginId; 121 | } 122 | 123 | 124 | 125 | 126 | } 127 | -------------------------------------------------------------------------------- /src/Model/SmsReceivedResponse.php: -------------------------------------------------------------------------------- 1 | receivedMessages); 21 | } 22 | 23 | /** 24 | * Adiciona uma mensagem recebida à lista de mensagens recebidas. 25 | * @param SmsReceived $receivedMessage 26 | */ 27 | public function addReceivedMessage($receivedMessage){ 28 | array_push($this->receivedMessages, $receivedMessage); 29 | } 30 | 31 | /** 32 | * Retorna a lista de mensagens recebidas da resposta. 33 | * @return array Lista com as mensagens recebidas. 34 | */ 35 | public function getReceivedMessages(){ 36 | return $this->receivedMessages; 37 | } 38 | 39 | 40 | } 41 | -------------------------------------------------------------------------------- /src/Model/SmsResponse.php: -------------------------------------------------------------------------------- 1 | statusCode=$statusCode; 35 | $this->statusDescription=$statusDescription; 36 | $this->detailCode=$detailCode; 37 | $this->detailDescription=$detailDescription; 38 | } 39 | 40 | /** 41 | * Método acessor ao código do status retornado na resposta. 42 | * @return string Código do status 43 | */ 44 | public function getStatusCode() { 45 | return $this->statusCode; 46 | } 47 | 48 | /** 49 | * Método acessor para a descrição do status retornado na resposta. 50 | * @return string Descrição do status 51 | */ 52 | public function getStatusDescription() { 53 | return $this->statusDescription; 54 | } 55 | 56 | /** 57 | * Método acessor ao código do detalhe do status retornado na resposta. 58 | * @return string Código do detalhe do status 59 | */ 60 | public function getDetailCode() { 61 | return $this->detailCode; 62 | } 63 | 64 | /** 65 | * Método acessor para a descrição do do detalhe do status retornado na resposta. 66 | * @return string Descrição do detalhe do status 67 | */ 68 | public function getDetailDescription() { 69 | return $this->detailDescription; 70 | } 71 | 72 | public function setStatusCode($statusCode) { 73 | $this->statusCode = $statusCode; 74 | } 75 | 76 | public function setStatusDescription($statusDescription) { 77 | $this->statusDescription = $statusDescription; 78 | } 79 | 80 | public function setDetailCode($detailCode) { 81 | $this->detailCode = $detailCode; 82 | } 83 | 84 | public function setDetailDescription($detailDescription) { 85 | $this->detailDescription = $detailDescription; 86 | } 87 | 88 | 89 | } 90 | -------------------------------------------------------------------------------- /src/Model/SmsStatusResponse.php: -------------------------------------------------------------------------------- 1 | id; 36 | } 37 | 38 | /** 39 | * Método acessor para a data de recebimento da mensagem consultada. 40 | * @return string Data de recebimento da mensagem consultada. 41 | */ 42 | public function getReceived() { 43 | return $this->received; 44 | } 45 | 46 | /** 47 | * Método acessor ao shortcode da mensagem consultada. 48 | * @return string Shortcode da mensagem consultada. 49 | */ 50 | public function getShortCode() { 51 | return $this->shortCode; 52 | } 53 | 54 | /** 55 | * Método acessor para a operadora da mensagem consultada. 56 | * @return string Operadora da mensagem consultada. 57 | */ 58 | public function getMobileOperatorName() { 59 | return $this->mobileOperatorName; 60 | } 61 | 62 | public function setId($id) { 63 | $this->id = $id; 64 | } 65 | 66 | public function setReceived($received) { 67 | $this->received = $received; 68 | } 69 | 70 | public function setShortCode($shortCode) { 71 | $this->shortCode = $shortCode; 72 | } 73 | 74 | public function setMobileOperatorName($mobileOperatorName) { 75 | $this->mobileOperatorName = $mobileOperatorName; 76 | } 77 | 78 | 79 | 80 | 81 | } 82 | -------------------------------------------------------------------------------- /src/RestClient/DefaultHttpClient.php: -------------------------------------------------------------------------------- 1 | parseRequest($request); 18 | $httpSocket = $this->createSocket($request->getURL(), $timeout); 19 | $this->makeHttpRequest($httpSocket, $httpString); 20 | $responseString = $this->retrieveHttpResponse($httpSocket); 21 | $response = $this->parseResponse($responseString, $request); 22 | $this->closeSocket($httpSocket); 23 | }catch(Exception $ex){ 24 | $this->closeSocket($httpSocket); 25 | $exceptionMessage='Http Request Failed. Request['.$request.'], Response['.$response.'].'; 26 | throw new \Exception($exceptionMessage, null, $ex); 27 | } 28 | return $response; 29 | } 30 | 31 | 32 | /** 33 | * 34 | * @param URL $url 35 | * @param int $timeout 36 | * @return resource 37 | * @throws RuntimeException 38 | */ 39 | private function createSocket($url, $timeout=null){ 40 | $host=$url->getHost(); 41 | $port = $url->getPort() == null ? 80 : $url->getPort(); 42 | if($url->getScheme() == 'https'){ 43 | $host='ssl://'.$url->getHost(); 44 | $port = $url->getPort() == null ? 443 : $url->getPort(); 45 | } 46 | $errorCode = null; 47 | $errorDescription = null; 48 | $socket = null; 49 | if (is_null($timeout)){ 50 | $socket = fsockopen($host, $port, $errorCode, $errorDescription); 51 | } 52 | else{ 53 | $socket = fsockopen($host, $port, $errorCode, $errorDescription, $timeout); 54 | } 55 | if (!is_resource($socket)) { 56 | throw new \RuntimeException($errorCode . " (" . $errorDescription . ")"); 57 | } 58 | return $socket; 59 | } 60 | 61 | private function closeSocket($socket){ 62 | if(is_resource($socket)){ 63 | fclose($socket); 64 | } 65 | } 66 | 67 | private function makeHttpRequest($socket, $httpString){ 68 | $this->checkSocket($socket); 69 | fwrite($socket, $httpString); 70 | } 71 | 72 | private function checkSocket($socket){ 73 | if(!is_resource($socket)){ 74 | throw new \RuntimeException("Invalid socket resource."); 75 | } 76 | } 77 | 78 | /** 79 | * 80 | * @param string $responseString 81 | * @param HttpRequest $request 82 | * @return HttpResponse 83 | */ 84 | private function parseResponse($responseString, $request){ 85 | $responseParser = new HttpResponseParser(); 86 | $response = $responseParser->parse($responseString); 87 | $response->setRequestOrigin($request); 88 | return $response; 89 | } 90 | 91 | /** 92 | * @param HttpRequest $request 93 | * @return string 94 | */ 95 | private function parseRequest($request){ 96 | $requestParser = new HttpRequestParser(); 97 | $httpString = $requestParser->parse($request); 98 | return $httpString; 99 | } 100 | 101 | /** 102 | * 103 | * @param resource $socket 104 | * @return string 105 | * @throws RuntimeException Caso não seja possível ler o recurso do caminho de origem 106 | */ 107 | private function retrieveHttpResponse($socket){ 108 | $this->checkSocket($socket); 109 | $responseContent = ""; 110 | $line=""; 111 | while (!feof($socket)) { 112 | $line=fgets($socket, 128); 113 | $responseContent .= $line; 114 | } 115 | if($responseContent==null || trim($responseContent) == "" ){ 116 | throw new \RuntimeException("Resource requested not found. Try change the request path."); 117 | } 118 | return $responseContent; 119 | } 120 | 121 | 122 | 123 | } 124 | -------------------------------------------------------------------------------- /src/RestClient/HttpClient.php: -------------------------------------------------------------------------------- 1 | name = $name; 18 | $this->value = $value; 19 | } 20 | 21 | public function getName() { 22 | return $this->name; 23 | } 24 | 25 | public function getValue() { 26 | return $this->value; 27 | } 28 | 29 | public function __toString() { 30 | return "[name=".$this->name.', value='.$this->value.']'; 31 | } 32 | 33 | 34 | 35 | } 36 | -------------------------------------------------------------------------------- /src/RestClient/HttpRequest.php: -------------------------------------------------------------------------------- 1 | method; 33 | } 34 | 35 | public function setMethod($method) { 36 | $this->method = $method; 37 | } 38 | 39 | public function getHeaders(){ 40 | return $this->headers; 41 | } 42 | 43 | /** 44 | * @param HttpHeader $header 45 | */ 46 | public function addHeader($header){ 47 | array_push($this->headers, $header); 48 | } 49 | 50 | public function hasHeader($name){ 51 | $hasHeader = false; 52 | foreach($this->headers as $header){ 53 | if($header->getName() == $name){ 54 | $hasHeader=true; 55 | } 56 | } 57 | return $hasHeader; 58 | 59 | } 60 | 61 | /** 62 | * @return URL 63 | */ 64 | public function getUrl() { 65 | return $this->url; 66 | } 67 | 68 | public function setUrl($url) { 69 | $this->url = $url; 70 | } 71 | 72 | 73 | public function getBody() { 74 | return $this->body; 75 | } 76 | 77 | public function setBody($body) { 78 | $this->body = $body; 79 | } 80 | 81 | 82 | public function __toString() { 83 | $requestString = get_class($this).'[url='.$this->url.', method='.$this->method.', body='.$this->body; 84 | return $requestString; 85 | } 86 | 87 | 88 | 89 | 90 | 91 | } 92 | -------------------------------------------------------------------------------- /src/RestClient/HttpRequestParser.php: -------------------------------------------------------------------------------- 1 | getBody(); 15 | $url = $request->getMethod() . " " . $request->getURL()->getUri().'?'.$request->getURL()->getQueryString(); 16 | $output = $url . " HTTP/1.1\r\n"; 17 | $output .= "Host: " . $request->getURL()->getHost() . "\r\n"; 18 | $output .= "User-Agent: Zenvia PHP API\r\n"; 19 | $output .= $this->parseCustomHeaders($request); 20 | $output .= "Content-Length: " . strlen($postData) . "\r\n"; 21 | $output .= "Connection: close\r\n\r\n"; 22 | $output .= $postData; 23 | return $output; 24 | } 25 | 26 | /** 27 | * @param HttpRequest $request 28 | * @return string 29 | */ 30 | private function parseCustomHeaders($request){ 31 | $headers = $request->getHeaders(); 32 | $output = ""; 33 | foreach($headers as $header){ 34 | $output .= sprintf("%s:%s \r\n", $header->getName(), $header->getValue()); 35 | } 36 | $output .= "User-Agent: Zenvia PHP API\r\n"; 37 | return $output; 38 | } 39 | 40 | 41 | } 42 | -------------------------------------------------------------------------------- /src/RestClient/HttpResponse.php: -------------------------------------------------------------------------------- 1 | httpCode; 30 | } 31 | 32 | public function getHttpDescription() { 33 | return $this->httpDescription; 34 | } 35 | 36 | public function setHttpCode($httpCode) { 37 | $this->httpCode = $httpCode; 38 | } 39 | 40 | public function setHttpDescription($httpDescription) { 41 | $this->httpDescription = $httpDescription; 42 | } 43 | 44 | 45 | public function getHeaders() { 46 | return $this->headers; 47 | } 48 | 49 | public function getBody() { 50 | return $this->body; 51 | } 52 | 53 | public function getRequestOrigin() { 54 | return $this->requestOrigin; 55 | } 56 | 57 | public function setBody($body) { 58 | $this->body = $body; 59 | } 60 | 61 | /** 62 | * @param HttpHeader $header 63 | */ 64 | public function addHeader($header){ 65 | array_push($this->headers, $header); 66 | 67 | } 68 | 69 | public function setRequestOrigin(HttpRequest $requestOrigin) { 70 | $this->requestOrigin = $requestOrigin; 71 | } 72 | 73 | public function __toString() { 74 | $headers=null; 75 | if(is_array($this->headers)){ 76 | $headers = implode(", ", $this->headers); 77 | } 78 | $responseString = get_class($this)."[Http Code=".$this->httpCode.'-'.$this->httpDescription.", \nHeaders=".$headers.", \nBody=".$this->body.", Request Origin=".$this->requestOrigin."]"; 79 | return $responseString; 80 | } 81 | 82 | 83 | 84 | 85 | } 86 | -------------------------------------------------------------------------------- /src/RestClient/HttpResponseParser.php: -------------------------------------------------------------------------------- 1 | setHttpCode(intval(trim($httpCode))); 24 | $httpResponse->setHttpDescription(trim($httpDescription)); 25 | } else { 26 | $httpResponse->addHeader($this->parseHeader($headersArray[$i])); 27 | } 28 | } 29 | $bodyData = $this->getRequestBody($headersData, $responseArray[1]); 30 | $httpResponse->setBody($bodyData); 31 | return $httpResponse; 32 | } 33 | 34 | /** 35 | * 36 | * @param string $headerText 37 | * @return HttpHeader 38 | */ 39 | private function parseHeader($headerText) { 40 | $indexVal = strpos($headerText, ":"); 41 | $header=null; 42 | if ($indexVal !== false) { 43 | $headerName = substr($headerText, 0, $indexVal); 44 | $headerValue = substr($headerText, $indexVal + 1); 45 | $header = new HttpHeader($headerName, trim($headerValue)); 46 | } else { 47 | $header = new HttpHeader("$i", trim($headerText)); 48 | } 49 | return $header; 50 | } 51 | 52 | /** 53 | * 54 | * @param string $headersData 55 | * @param string $bodyData 56 | * @return string 57 | */ 58 | private function getRequestBody($headersData, $bodyData) { 59 | $content = $bodyData; 60 | if (!(strpos($headersData, "Transfer-Encoding: chunked") === false)) { 61 | $aux = explode("\r\n", $bodyData); 62 | $countAux = count($aux); 63 | for ($i = 0; $i < $countAux; $i++) { 64 | if ($i == 0 || ($i % 2) == 0) { 65 | $aux[$i] = ""; 66 | } 67 | } 68 | $content = implode("", $aux); 69 | } 70 | return $content; 71 | } 72 | 73 | } 74 | -------------------------------------------------------------------------------- /src/RestClient/RestClient.php: -------------------------------------------------------------------------------- 1 | httpClient = new DefaultHttpClient(); 20 | } 21 | else{ 22 | $this->httpClient = $httpClient; 23 | } 24 | } 25 | 26 | /** 27 | * 28 | * @param string $url 29 | * @param array $additionalHeaders 30 | * @return HttpResponse 31 | * @throws RuntimeException 32 | */ 33 | public function get($url, $additionalHeaders=array()){ 34 | $response = $this->request($url, HttpRequest::HTTP_GET, null, $additionalHeaders); 35 | return $response; 36 | } 37 | 38 | /** 39 | * 40 | * @param string $url 41 | * @param string|array $data 42 | * @param array $additionalHeaders 43 | * @return HttpResponse 44 | * @throws RuntimeException 45 | */ 46 | public function post($url, $data=null, $additionalHeaders=array()){ 47 | $response = $this->request($url, HttpRequest::HTTP_POST, $data, $additionalHeaders); 48 | return $response; 49 | } 50 | 51 | /** 52 | * 53 | * @param string $url 54 | * @param string $method 55 | * @param string|array $data 56 | * @param string $additionalHeaders 57 | * @return HttpResponse 58 | * @throws RuntimeException 59 | */ 60 | private function request($url, $method, $data=null, $additionalHeaders=array()){ 61 | $request = $this->createRequest($url, $method, $this->serializeRequestBody($data), $additionalHeaders); 62 | try{ 63 | $response = $this->httpClient->makeRequest($request); 64 | }catch(Exception $ex){ 65 | throw new \RuntimeException($ex); 66 | } 67 | return $response; 68 | } 69 | 70 | /** 71 | * 72 | * @param string $data 73 | * return string 74 | */ 75 | private function serializeRequestBody($data){ 76 | $serializedData = null; 77 | if($data!= null && is_array($data) ){ 78 | $serializedData = http_build_query($data); 79 | }elseif ($data!= null && is_string($data)) { 80 | $serializedData = $data; 81 | } 82 | return $serializedData; 83 | 84 | } 85 | 86 | /** 87 | * 88 | * @param string $url 89 | * @param string $method 90 | * @param string|array $data 91 | * @param array $additionalHeaders 92 | * @return HttpRequest 93 | */ 94 | private function createRequest($url, $method, $data=null, $additionalHeaders=array()){ 95 | $httpRequest = new HttpRequest(); 96 | $httpRequest->setUrl(new URL($url)); 97 | $httpRequest->setMethod($method); 98 | if(is_array($additionalHeaders) && count($additionalHeaders) > 0){ 99 | foreach($additionalHeaders as $headerName=>$headerValue){ 100 | $httpRequest->addHeader(new HttpHeader($headerName, $headerValue)); 101 | } 102 | } 103 | if(!$httpRequest->hasHeader('Content-Type')){ 104 | $httpRequest->addHeader(new HttpHeader('Content-Type', self::DEFAULT_CONTENT_TYPE)); 105 | } 106 | $httpRequest->setBody($data); 107 | return $httpRequest; 108 | 109 | } 110 | 111 | 112 | 113 | 114 | } 115 | -------------------------------------------------------------------------------- /src/RestClient/URL.php: -------------------------------------------------------------------------------- 1 | fill($url); 37 | } 38 | 39 | private function fill($url){ 40 | $parsedUrl = parse_url($url); 41 | $this->host=$parsedUrl['host']; 42 | $this->uri=$parsedUrl['path']; 43 | $this->scheme=$parsedUrl['scheme']; 44 | if(key_exists('port', $parsedUrl)){ 45 | $this->port=$parsedUrl['port']; 46 | } 47 | if(key_exists('query', $parsedUrl)){ 48 | $this->queryString=$parsedUrl['query']; 49 | } 50 | } 51 | 52 | public function getHost() { 53 | return $this->host; 54 | } 55 | 56 | public function getUri() { 57 | return $this->uri; 58 | } 59 | 60 | public function getPort() { 61 | return $this->port; 62 | } 63 | 64 | public function getQueryString() { 65 | return $this->queryString; 66 | } 67 | 68 | public function getScheme() { 69 | return $this->scheme; 70 | } 71 | 72 | public function __toString() { 73 | $urlString=$this->host; 74 | if($this->port!=null && $this->port!=80){ 75 | $urlString.=':'.$this->port; 76 | } 77 | if($this->uri!=null && $this->uri!=""){ 78 | $urlString.=$this->uri; 79 | } 80 | if($this->queryString!=null && $this->queryString!=""){ 81 | $urlString.='?'.$this->queryString; 82 | } 83 | return $urlString; 84 | } 85 | 86 | 87 | } 88 | --------------------------------------------------------------------------------