Development

Esercitazione guidata PHP – Crea la tua nuova web app SMS utilizzando l’API SMS di Infobip

Benvenuto nell’esercitazione per principianti di Infobip per la creazione della propria web app SMS.

July 05 2017

Benvenuto nell’esercitazione per principianti di Infobip per la creazione della propria web app SMS. Ti guideremo passo dopo passo attraverso l’implementazione dell’API SMS e i servizi SMS di Infobip. L‘esercitazione comprende tre esempi di alcune delle funzionalità principali per l’invio di messaggi SMS e la verifica del loro stato:

Inizieremo con esempi e presentazioni per consentirti di scegliere quale azione eseguire.

Per poter seguire questa esercitazione, scrivere ed effettuare test autonomamente, dovrai preparare l’ambiente giusto (e non ci riferiamo alle luci soffuse e a un buon caffè smiley ). Per inviare messaggi, ottenere registri e ricevere rapporti sulla consegna, devi consentire l’estensione cURL php nel tuo web server.

Per lo scopo di questa esercitazione, puoi usare una soluzione tra quelle offerte da AMP  (wamp, xampp o altro tipo). Si tratta di software stack per diversi sistemi operativi costituiti da web server Apache, database MySQL e supporto della lingua di programmazione PHP. Devi abilitare l’estensione phpcurl per quella che sceglierai.

Nota: per inviare messaggi SMS in modo sicuro, questi esempi devono essere ospitati su HTTPS (utilizzando TLS) al momento della pubblicazione. Per semplicità, in questa esercitazione abbiamo utilizzato HTTP semplice.

Un messaggio di testo completo

La pagina del messaggio di testo completo (advancedSms.php) contiene il modulo per l’inviodi un messaggio. Il pulsante “Invia” invierà la richiesta a una pagina specificata nell’attributo action sul modulo. In questo esempio lo invierà a se stesso.

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

Costruzione della richiesta

Prima di iniziare a manipolare i valori, è necessario verificare se sono stati impostati nel modo corretto. In questo esempio abbiamo selezionato solo il campo “toInput”. Non è necessario selezionarli tutti perché il metodo POST HTTP imposterà tutto automaticamente (se uno dei campi di immissione è vuoto, il suo valore sarà una stringa vuota). Se si sta caricando la pagina per la prima volta, bisogna aver chiaro che nessuno di questi campi sarà presente. Restano solo due passaggi per completare l’impostazione. Dopo aver selezionato i campi, è necessario definire l’URL per l’invio della richiesta e il corpo della richiesta che verrà inviato. Il corpo della richiesta POST verrà presentato come una stringa JSON. La formazione del corpo della richiesta apparirà come questa:

 // 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)

Nell’esempio l’SMS viene inviato a una destinazione. Se si desidera inviare il messaggio a più destinazioni, sarà sufficiente creare un altro oggetto destination e aggiungerlo alla matrice destinations.

Poiché "to" è l’unico campo richiesto, è necessario verificare se è vuoto prima di inviare una richiesta. In caso affermativo, abbandonate la programmazione e informate l’utente del campo mancante.

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

Per l’invio della richiesta noi scegliamo 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);

Nel codice citato abbiamo utilizzato molte opzioni per l’impostazione della richiesta che sono inizializzate con curl_init():

  • CURLOPT_URL - impostazione dell’URL con metodo endpoint all’interno di esso
  • CURLOPT_HTTPHEADER - header della richiesta Tipo di contenuto e Accettazione
  • CURLOPT_HTTPAUTH, CURLOPT_USERPWD - Tipo di autenticazione, nome utente e password
  • CURLOPT_POST - metodo HTTP utilizzato - POST
  • CURLOPT_POSTFIELDS - stringa XML o JSON strutturata costruita in precedenza
  • Qui è possibile vedere altre opzioni cURL per l’invio.

Quando vengono impostate tutte le opzioni, è necessario eseguire la richiesta con curl_exec($ch). Questo metodo fornirà una risposta che sarà possibile presentare come JSON, adatta all’analisi futura. Una volta eseguita la richiesta, le informazioni sul codice di risposta HTTP saranno disponibili e verranno utilizzate più avanti in questa esercitazione -curl_getinfo($ch, CURLINFO_HTTP_CODE).

Analisi della risposta

Se tutto è andato bene ed è stato ricevuto il codice della risposta HTTP da  2xx family (200 OK, 201 CREATED, ecc.), è possibile estrarre le informazioni necessarie dal corpo della risposta e presentarle all’utente. Nel nostro esempio abbiamo scelto di presentare: Message ID (ID messaggio), To (A), SMS Count (Conteggio SMS), Status Group (Gruppo stato), Status Group Name (nome gruppo stato), Status ID (ID stato), Status Name (nome stato) e Status Description (descrizione stato), ma è possibile scegliere in base alle proprie preferenze.

Il loop foreach mostrato di seguito si ripeterà attraverso la matrice delle risposte del messaggio inviato e scriverà una risposta singola per ciascuno dei messaggi inviati:

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: in questo esempio invieremo solo un messaggio a un destinatario perciò la matrice di risposta del messaggio inviato conterrà solo un elemento e non sarà necessario inserirlo in un loop. Tuttavia, se si decide di inviare un messaggio a più di un destinatario, sarà necessario ripeterlo attraverso la matrice delle risposte.

Se si verifica un’eccezione, il messaggio può essere presentato all’utente nel modo seguente:

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

Registri dei messaggi inviati

Quando si sceglie questa opzione si apre la pagina logs.php con il modulo di immissione per ottenere i registri dei messaggi inviati. Il pulsante Invia INVIERÀ tali campi a se stesso.

Costruzione della richiesta

logs.php è la pagina in cui vengono presentati i registri dei messaggi inviati. È necessario definire l’URL per l’invio della richiesta con l’endpoint dei registri dei messaggi inviati, e inviare una richiesta ad esso, questa volta con il metodo GET HTTP (opzione CURLOPT_HTTPGET impostata su 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);

Dopo l’esecuzione della richiesta - culr_exec($curl), e aver ottenuto il codice della risposta HTTP, è possibile avviare l’analisi del corpo a seconda del valore del codice della risposta, in modo simile a quanto abbiamo fatto nel capito relativo al messaggio di testo completo.

Analisi della risposta

Se tutto è andato bene ed è stato ricevuto il codice della risposta HTTP da  2xx family (200 OK, 201 CREATED, ecc.), è possibile estrarre le informazioni necessarie dal corpo della risposta e presentarle all’utente. Nel nostro esempio abbiamo scelto: Message ID (ID messaggio), To (A), From (Da), Text (Testo), Status Group Name (Nome gruppo stato), Status Description (Descrizione stato) e Sent At (Inviato a), ma è possibile scegliere in base alle proprie preferenze, come prima:

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 "";         
    }
}

Il successivo loop foreachloop si ripeterà attraverso una matrice di registri di messaggi inviati e scriverà una singola riga con le colonne appropriate all’interno di essi. In questo caso il loop foreach è necessario perché abbiamo chiesto di recuperare i registri di tutti messaggi.

Alla fine, se si è verificata un’eccezione, è possibile analizzare il corpo della richiesta, come abbiamo fatto per il metodo di invio del messaggio:

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

Questa funzionalità è leggermente differente dalle due precedenti – la pagina dlrPush.php non è utilizzata per richiedere alcuni dati, ma è in attesa di riceverli. Quando i dati vengono inviati a questa pagina, possono essere analizzati e mostrati all’utente nel modo appropriato.

Nota: i rapporti di consegna vengono inviati dalla pagina del messaggio di testo completo inserendo l’URL di questa pagina nel campo Notify URL. Inoltre il campo Notify ContentType in tale pagina definisce quale tipo di corpo è in arrivo.

 

Ricezione del rapporto di consegna pushed

$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;
    }
}

Il codice sopra mostra che il metodo file_get_contents('php://input') è utilizzato per ottenere dati POST non elaborati sotto forma di stringa. Il paragrafo successivo mostra come verificare se i dati sono analizzati come XML o JSON, e come estrarre rapporti di consegna pushed.

Per l’XML verificare se la stringa del corpo della risposta inizia con <reportResponse> e, se non è così, provare a decodificarla senza errori – funzione isJson(). Se tutte le condizioni sono FALSE, la variabile $result resta non impostata, il che significa che sarà necessario dire all’utente che nessun rapporto di consegna è stato pushed al callback server.

Analisi del risultato

L’analisi dei rapporti di consegna pushed è molto simile all’analisi della risposta del messaggio di testo completo e dei metodi dei registri dei messaggi inviati, salvo per il fatto che non viene verificato il codice di risposta HTTP (perché non vi è alcuna risposta). Bisogna solo scegliere quali informazioni dai rapporti di consegna pushed si desidera mostrare, e scriverli alla pagina.



Start building today

Get started