Development

Tutorial pas à pas PHP – Créez votre nouvelle application web SMS en utilisant l’API SMS Infobip

Bienvenue sur le tutoriel débutant pour la création de votre propre application Web SMS.

October 20 2015

Bienvenue sur le tutoriel débutant pour la création de votre propre application web SMS. Nous allons vous guider dans chaque étape de la mise en œuvre de l'API SMS et des services SMS Infobip. Le tutoriel comprend trois exemples des principales caractéristiques pour l'envoi de SMS et la vérification de leur statut :

Commençons avec des exemples et des présentations de sorte que vous pouvez choisir l'action que vous souhaitez effectuer.

Pour suivre ce tutoriel, écrire et tester par vous-même, vous avez besoin de définir l’environnement. Pour envoyer des messages, obtenir les journaux et recevoir vos rapports d’envoi, vous devez activer l’extensioncURL php dans votre serveur web.

Pour les besoins de ce tutoriel, vous devez utiliser une solution dans les piles de solutions AMP (wamp, xampp, or other). Ce sont des piles de logiciels pour différents OS consisté en un serveur web Apache, une base de données MySQL et un support de langue de programmation PHP. Vous devez activer l'extension phpcurl pour ce que vous choisissez.

Remarque: Pour envoyer des SMS en toute sécurité, ces exemples devraient être hébergés sur HTTPS (avec TLS) lors du passage direct. Pour la simplicité de ce tutoriel, nous avons utilisé un protocole HTTP standard.

 Message texte entièrement équipé 

La page du message texte entièrement équipé (advancedSms.php) contient le formulaire envoyer un message. Le bouton d'envoi enverra la demande à une page spécifiée dans l’attribut action de la forme. Dans cet exemple, elle s’affichera d’elle-même.

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

Construire la demande

Avant de commencer à manipuler des valeurs, vous devez vérifier si vous les définissez de la bonne façon. Dans cet exemple, nous avons seulement vérifié le champ "toInput". Vous n’avez pas besoin de tous les vérifier car la méthode HTTP POST le fera automatiquement (si l'un des champs de saisie est vide, sa valeur sera une chaînevide). Si vous chargez la page pour la première fois, gardez à l'esprit qu'aucun de ces champs ne sera présent. Nous sommes seulement à deux étapes de tout mettre en place. Après la vérification des champs vous devez définir l’URL pour la demande d’envoi et l’objet de la demande qui va être envoyé. L’objet de la demande POST sera présenté comme une chaîneJSON. L’objet de la demande va ressembler à ceci:

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

Dans l’exemple, le SMS est envoyé à une seule destination. Si vous voulez envoyer ce message à des destinations multiples, tout ce que vous avez à faire est de créer un autre objet destination et de le rajouter au tableau des destinations.

Comme "to" est le seul champ obligatoire, vous devez vérifier s’il est vide avant d'envoyer une demande, le cas échéant ignorez toute la logique, et informez votre utilisateur du champ manquant.

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

Pour l'envoi de la demande, nous avons choisi 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);

Dans le code cité, nous avons utilisé de nombreuses options pour régler la demande, initialisées avec curl_init():

  • CURLOPT_URL - Réglage de l’URL avec la méthode point d’entrée
  • CURLOPT_HTTPHEADER - Les en-têtes de la demande Content-Typeet Accept
  • CURLOPT_HTTPAUTH, CURLOPT_USERPWD - Type d'authentification, Nom d'utilisateur et Mot de passe
  • CURLOPT_POST - Méthode HTTP utilisée - POST
  • CURLOPT_POSTFIELDS - XML ou JSON a structuré la chaînepréalablement construite
  • D'ici vous pouvez voir d'autres options pour l'envoi de cURL

Lorsque vous définissez toutes les options, vous avez besoin d’exécuter la demande avec curl_exec ($ ch). Cette méthode vous donne une réponse que vous présentez comme JSON et convient pour une future analyse. Après l'exécution de la demande, des informations sur le code de réponse HTTP sera disponible et nous l'utiliserons plus tard dans ce tutorial -curl_getinfo($ch, CURLINFO_HTTP_CODE).

L'analyse de la réponse

Si tout s’est bien passé et que le code de réponse HTTP de 2xx familles a été reçu (200 OK, 201 CREATED, etc.), vous pouvez extraire les informations nécessaires à partir du corps de la réponse et le présenter à votre utilisateur. Dans notre exemple, nous avons choisi de présenter : Message ID, To, SMS Count, Status Group, Status Group Name, Status ID, Status Name et Status Description, mais choisissez celui que vous voulez.

La boucle foreach illustrée ci-dessous va réitérer le tableau des réponses des messages envoyés et écrire une seule ligne pour chacun des messages envoyés :

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

Remarque:Dans cet exemple, nous allons envoyer un seul message à une seule destination. Le tableau de réponse du message envoyé contiendra donc un seul élément et il n'y aura pas besoin de le mettre en boucle. Quoi qu'il en soit, si vous décidez d'envoyer un message à plus d'une destination, vous devez parcourir le tableau de réponses.

Si l'exception se produit, voici comment vous pouvez présenter le message à l'utilisateur:

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

Journal des messages envoyés

Lorsque vous choisissez cette option, il ouvre la page logs.php avec le formulaire d'entrée pour obtenir les journaux de messages envoyés. Cliquez sur le bouton pour POSTER ces champs pour lui-même.

Construire la demande

logs.php est la page où les journaux des messages envoyés seront présentés. Vous devez définir l'URL pour l'envoi de la demandeavec le point final des journaux des messages envoyés, et envoyer une demande avec la méthode GET HTTP cette fois (option CURLOPT_HTTPGET réglé sur 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);

Après l'exécution de la demande - culr_exec($curl) et l’obtention du code de réponse HTTP, commencez à analyser l’objet en fonction de la valeur du code de réponse, semblable à ce que nous avons fait dans le chapitre message textuel entièrement équipé.

Analyser la réponse

Si tout s’est bien passé et le code de réponse HTTP de la famille 2xx a été reçu (200 OK, 201 CRÉE, etc.), vous pouvez extraire l'information nécessaire à partir de l’objet de la réponse et le présenter à votre utilisateur. Dans notre exemple, nous avons choisi : Message ID, To, From, Text, Status Group Name, Status Description et Sent At, mais vous pouvez choisir ce que vous voulez, tout comme avant :

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

La prochaine boucle foreach va réitérer le tableau des journaux de messages envoyés et écrire une seule rangée de colonnes appropriées. Dans ce cas, la boucle foreach est nécessaire parce que nous avons demandé à récupérer tous les journaux de messages.

Au final, vous pouvez analyser l’objet de la demande si l'exception est survenue, comme nous l'avons fait pour la méthode d'envoi de message:

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

Accusés de réception sur Notify URL

Cette fonction est légèrement différente des deux caractéristiques précédentes - la page dlrPush.phpn’est pas utilisée pour demander des données, elle est en attente. Lorsque les données sont transférées vers cette page, elles peuvent être analysées et montrées à l'utilisateur de manière appropriée.

Remarque: Les rapports d’envoi sont poussés à partir de la page de message texte entièrement équipé en entrant this page URLdans le champ Notify URLEn outre, le champNotify ContentTypede cette page définit quel type d’objet est sur le point d'être reçu.

Recevoir rapport d’envoi poussé

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

Le code ci-dessus montre que file_get_contents('php://input') est utilisé pour obtenir des données brutes POST comme une chaîne. Les lignes après vous montrent la façon d'inspecter si les données sont analysées comme XML ou JSON, et comment extraire des rapports poussés d’envoi.Pour XML nous inspectons si la chaîne de l’objet de la réponse commence par , et sinon, nous essayons de la décoder sans erreurs – fonction isJson(). Si toutes les conditions sont FALSE, la variable $result reste fixe ce qui signifie que nous devrons indiquer à l'utilisateur qu'aucun rapport de livraison n’a été poussé au serveur de rappel.

Analyse du résultat

L'analyse des rapports d’envoi est très similaire à l'analyse de la réponse du message textuel entièrement équipéet des méthodes des journaux du message envoyé.Mais nous ne vérifions pas le code de la réponse HTTP (parce qu'il n'y a pas de réponse du tout). Nous choisissons seulement les informations à partir des rapports d’envoi que nous voulons montrer, et l'écrivons dans la page.