Development

Passo-a-passo tutorial PHP - Crie o seu novo aplicativo web de SMS, por meio da SMS API da Infobip

Aqui nós o ajudaremos a criar seu próprio app web de SMS e, para isso, iremos orientá-lo em todos os passos, através da implementação da API de SMS e dos serviços de SMS da Infobip

October 20 2015

Seja bem-vindo ao tutorial para iniciantes da Infobip. Aqui nós o ajudaremos a criar seu próprio app web de SMS e, para isso, iremos orientá-lo em todos os passos, através da implementação da API de SMS e dos serviços de SMS da Infobip. O tutorial inclui três exemplos das principais características para envio de mensagens de SMS e verificação de status:

Vamos começar com alguns exemplos e apresentações para que você escolha qual ação deseja realizar..

Para acompanhar esse tutorial, escrever e testar por conta própria, você precisa definir o ambiente (e não estamos falando de diminuir as luzes e fazer café smiley). Para enviar mensagens, obter logs, e receber os relatórios de entrega, você precisa habilitar a extensão cURL php no seu servidor web.

Para este tutorial, você pode usar uma solução do conjunto AMP (wamp, xampp, or other). (wamp, xampp, entre outros), que é um conjunto de software para vários OS, como o servidor web Apache, banco de dados MySQL e suporte de linguagem de programação PHP. Em qualquer um que você escolher, é necessário habilitar a extensão phpcurl.

Nota: Para enviar mensagens de SMS com segurança, quando forem ao ar, esses exemplos devem estar hospedados em HTTPS (usando TLS). Para simplificar este tutorial, nós usamos o HTTP.

 Mensagem de texto com todas as funcionalidades  

A página de mensagem de texto com todas as funcionalidades (advancedSms.php) contém um formulário para envio de mensagem. O botão de envio mandará a solicitação para uma página específica a fim de mputar o formulário. No exemplo abaixo, a própria solicitação será publicada.

  <form action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]); ?>" method="POST" ... >

Criando a solicitação

Antes de começar a manipular valores, você precisa checar se os configurou da maneira correta. Neste exemplo, nós só verificamos o campo “toInput” . ocê não precisa verificar todos os campos, pois o modo POST HTTP verificará tudo automaticamente (se qualquer um dos campos estiver sem preenchimento, seu valor será uma cadeia vazia). Se você carregar a página pela primeira vez, lembre-se de que nenhum destes campos estará preenchido. Estamos a apenas a dois passos de finalizer a configuração. Após verificar os campos, você precisa definir a URL para envio da solicitação, e o corpo da solicitação que será enviada. O corpo da solicitação POST será mostrado como uma cadeia JSON. Após esses procedimentos, o corpo da solicitação será da seguinte forma:

 // URL for sending request
$postUrl = "https://api.infobip.com/sms/1/text/advanced";

// creating an object for sending SMS
$destination = array("messageId" => $messageId, 
            "to" => $to);
$message = array("from" => $from,
        "destinations" => array($destination),
        "text" => $text,
        "notifyUrl" => $notifyUrl,
        "notifyContentType" => $notifyContentType,
        "callbackData" => $callbackData);
$postData = array("messages" => array($message));
// encoding object
$postDataJson = json_encode($postData)

INeste exemplo, o SMS é enviado para um destinatário. Mas se você quiser enviar a mensagem para vários destinatários, basta criar outro destinatário e adicioná-lo à matriz destinatários.

Como "to"é o único campo obrigatório, você deve verificar se ele está preenchido antes de enviar uma solicitação. Caso você não faça essa verificação, o usuário será notificado sobre o campo sem preenchimento.

if (isset($_POST['toInput'])) { 
// all the logic goes here 
}

Para enviar a solicitação, nós escolhemos a cURL.

 $ch = curl_init();
$header = array("Content-Type:application/json", "Accept:application/json");

curl_setopt($ch, CURLOPT_URL, $postUrl);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_USERPWD, $username . ":" . $password);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 2);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
curl_setopt($ch, CURLOPT_MAXREDIRS, 2);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postDataJson);

// response of the POST request
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$responseBody = json_decode($response);
curl_close($ch);

No código citado, nós usamos diversas opções de configuração de uma solicitação, que podem ser iniciadas com curl_init():

  • CURLOPT_URL - definição de URL com método endpoint
  • CURLOPT_HTTPHEADER - Content-Type e possibilidade de inserir títulos na solicitação
  • CURLOPT_HTTPAUTH, CURLOPT_USERPWD - Autenticação por tipo, nome de usuário e senha
  • CURLOPT_POST - Método HTTP usado - POST
  • CURLOPT_POSTFIELDS - Sequência estruturada XML ou JSON previamente construída
  • Aqui você pode encontrar outras opções de cURL para envio.

o definir todas as opções que precisa para executar o pedido via curl_exec($ch), este método te enviará uma resposta, pode ser apresentada como JSON, além de ser adequada para análises futuras. Após a solicitação, as informações sobre o código de reposta HTTP estarão disponíveis e serão usados depois neste mesmo tutorial -curl_getinfo($ch, CURLINFO_HTTP_CODE).

Análise da Resposta

Se tudo correr bem e o código de resposta HTTP da família 2xx for recebido (200 OK, 201 CREATED etc.), você pode extrair as informações necessárias do corpo da resposta e apresentá-las ao seu usuário. No nosso exemplo, escolhemos apresentar: Message ID (ID da Mensagem), To (Para), SMS Count (Conta SMS), Status Group (Status do Grupo), Status Group Name (Status do Nome do Grupo), Status ID (Status da ID), Status Name (Status do Nome) e Status Description (Status da Descrição), mas você pode escolher o que quiser.

Oforeach loop apresentado abaixo irá reiterar, por meio da matriz de envio das respostas das mensagens, e escreverá uma linha única para cada mensagem enviada:

if ($httpCode >= 200 && $httpCode < 300) {
        $messages = $responseBody->messages;        

        ...

        foreach ($messages as $message) {
            echo "";
            echo "" . $message->messageId . "";
            echo "" . $message->to . "";
            echo "" . $message->status->groupId . "";
            echo "" . $message->status->groupName . "";
            echo "" . $message->status->id . "";
            echo "" . $message->status->name . "";
            echo "" . $message->status->description . "";
            echo "" . $message->smsCount . "";
            echo "";
        }
}

Nota:Neste exemplo, enviaremos somente uma mensagem para um destinatário. Por isso, a matriz da resposta enviada da mensagem conterá somente um elemento e não é necessário deixá-la em looping. De qualquer forma, se decidir mandar a mensagem para mais de um destinatário, você deverá reiterar por meio da matriz das respostas.

Caso haja uma excessão, você pode mostrar a mensagem para o usuário da seguinte forma:

<div class="alert alert-danger" role="alert">
    <b>An error occurred!</b> Reason:
    <?php
    echo $responseBody->requestError->serviceException->text;
    ?>
</div>

Envio de logs de mensagens

Ao escolher essa opção, a página logs.php abrirá com o seguinte formulário de entrada: envio de logs de mensagens. O botão de envio irá POST os seus próprios campos.

Criando a solicitação

logs.php é a página na qual as mensagens de log enviadas serão apresentadas. Você deve definir a URL para envio de solicitação com o endpoint das mensagens de log, e mandar uma solicitação para ela, mas, desta vez, com o método GET HTTP (Conjunto de Opções CURLOPT_HTTPGET para TRUE):

$getUrl = 'https://api.infobip.com/sms/1/logs?limit=20';

$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $getUrl);
curl_setopt($curl, CURLOPT_HTTPHEADER, array('Accept: application/json'));
curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($curl, CURLOPT_USERPWD, $username . ":" . $password);
curl_setopt($curl, CURLOPT_HTTPGET, TRUE);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);

$response = curl_exec($curl);
$httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
$responseBody = json_decode($response);
curl_close($curl);

Após a solicitação - - culr_exec($curl), e do recebimento do código de resposta HTTP, você pode começar a analisar o corpo da solicitação, que dependendo do valor do código de resposta, é semelhante a que fizemos no capítulo mensagem de texto com todas as funcionalidades.

Criando a resposta

Se tudo corer bem e o código de resposta HTTP da família 2xx for recebido (200 OK, 201 CREATED etc.), você pode extrair as informações necessárias do corpo da mensagem de resposta e apresentá-la ao usuário. No nosso exemplo, escolhemos: Message ID (ID da Mensagem), To (Para), From (De), Text (Texto), Status Group Name (Status do Nome do Grupo), Status Description (Status da Descrição) e Sent At (Enviado às),mas você pode escolher o que quiser, como fizemos anteriormente:

if ($httpCode >= 200 && $httpCode < 300) {
    $logs = $responseBody->results;

    ...

    foreach ($logs as $log) {
        echo "";
        echo "" . $log->messageId . "";
        echo "" . $log->to . "";
        echo "" . $log->from . "";
        echo "" . $log->text . "";
        echo "" . $log->status->groupName . "";
        echo "" . $log->status->description . "";

        $formattedSentAt = date("M d, Y - H:i:s P T", strtotime($log->sentAt));    
        echo "" . $formattedSentAt . "";
        echo "";         
    }
}

O próximo foreach loop irá reiterar, através de uma matriz de envio de mensagens de log, e escreverá uma única linha com as colunas apropriadas. Neste caso, o foreach loop é necessário, pois nós solicitamos a recuperação de todas as mensagens de logs.

Ao final, você pode analisar o corpo da solicitação, caso haja uma exceção, como fizemos no método de envio de mensagem:

<div class="alert alert-danger" role="alert">
    <b>An error occurred!</b> Reason:
    <?php
        echo $responseBody->requestError->serviceException->text;
    ?>
</div>

Relatórios de entrega em uma URL de notificação

Essa funcionalidade é um pouco diferente dos dois recursos anteriores – a página dlrPush.php não é utilizada para a solicitação de alguns dados. Ela somente espera os dados. Quando os dados são inseridos nesta página, eles podem ser analisados e apresentados ao usuário de forma apropriada.

Nota:Os relatórios de entrega são enviados de uma página de mensagens de texto com todas as funcionalidades, - basta inserir esta página URL no campo URL de Notificação. Além disso, o campo TypeContent de Notificaçãonesta página define qual tipo de corpo está prestes a chegar.

Recebendo relatório de entrega enviado

$responseBody = file_get_contents('php://input');

if ($responseBody <> "") {
    if (isJson($responseBody)) {
        $responseJson = json_decode($responseBody);
        $results = $responseJson->results;
    } else if (strpos(trim($responseBody), '<reportResponse>') == 0) {
        $responseXml = simplexml_load_string($responseBody);
        $results = $responseBody->results->result;
    }
}

O código acima mostra que o método file_get_contents('php://input') é usado para obter os dados brutos de POST, como uma fila. As linhas finais mostram como inspecionar os dados analisados, sendo eles XML ou JSON, e como extrair os relatórios de entrega enviados. Para XML, nós verificamos se a seqüência de corpo da resposta começa com . Caso não seja, tente decodificá-los sem erros - função- isJson().Se todas as condições forem FALSAS, a variável $result permanece indefinida, o que significa que devemos dizer ao usuário que nenhum relatório de entrega foi enviado pelo servidor callback.

Criando o resultado

A criação de um relatório de entrega enviado é bem semelhante à criação da resposta dos métodos de mensagem de texto comtodas as funcionalidades e de logs de mensagens enviadas, exceto quando o código de resposta HTTP não é verificado (porque não há nenhuma resposta). Tudo o que precisamos fazer é escolher qual informação dos relatórios de entrega enviados nós queremos mostrar e escrevê-la na página..