Development

Пошаговая PHP инструкция – Создайте новое SMS веб-приложение, используя SMS API от Infobip

Ознакомьтесь с Infobip инструкцией по созданию вашего SMS веб-приложения.

October 20 2015

Добро пожаловать в Infobip инструкцию по созданию вашего собственного SMS веб-приложения для начинающих. Мы поможем вам шаг за шагом пройти через сложности установки SMS API от Infobip и SMS-сервисов. Инструкция включает 3 примера важнейших опций для отправки SMS-сообщений и проверки их статуса:

Мы начнем с примеров и презентаций, чтобы вы могли выбрать то, что вам наиболее интересно.

Чтобы следовать данной инструкции, писать и тестировать все самостоятельно, вам необходимо подготовиться (и мы не имеем в виду налить чашку кофе и погасить свет). Чтобы отправлять сообщения, получать логи и отчеты по доставке сообщений, вам необходимо установить cURL php расширение для вашего веб-сервера.

Для работы с этой инструкцией вы можете использовать решение из стека AMP (wamp, xampp или др.). Этот стек для ПО по различным ОС состоит из веб-сервера Apache, базы данных MySQL и поддержки языка программирования PHP. В любом случае вы должны установить расширение phpcurl

Примечание: для безопасной отправки SMS сообщений, эти примеры при запуске должны быть размещены на HTTPS (используя TLS). Для упрощения инструкции, мы использовали HTTP.

 Полнофункциональные текстовые сообщения 

Страница текстовых сообщений (advancedSms.php) содержит форму для отправки сообщений. Кнопка подтверждения отправит запрос в атрибут действия формы. В данном примере она отправит его себе.

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

Построение запроса

Прежде чем начать изменять значения, вы должны проверить, правильно ли вы их установили. В этом примере мы проверили только поле “toInput”Вам не нужно проверять их все, потому что метод POST HTTP будет устанавливать все автоматически (если какое-либо из полей ввода пустое, его значение будет пустой строкой). Если вы загружаете страницу в первый раз, имейте в виду, что ни одно из этих полей не будет присутствовать. Мы находимся всего в двух шагах от создания всей страницы. После проверки полей необходимо определить URL для отправки запроса, а также тело запроса которое будет отправлено. Тело запроса POST будет представлено в виде строки JSON. Формирование тела запроса будет выглядеть следующим образом:

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

В примере сообщение отправляется только одному реципиенту. Если вы хотите отправить это сообщение по нескольким адресам, все что вам нужно сделать - это создать другой объект назначения и добавить его в список получателей.

Поскольку "to" является единственным обязательным полем, вам необходимо проверить заполнено ли оно перед отправкой запроса. Если его заполнение будет пропущено, то пользователь получит сообщение о незаполненном поле.

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

Для отправки запроса мы выбираем 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);

В приведенном коде мы использовали много вариантов для создания запроса, которые инициализируются curl_init():

  • CURLOPT_URL - установка URL с помощью метода конечной точки в нем
  • CURLOPT_HTTPHEADER - установка типа контента и заголовка запроса
  • CURLOPT_HTTPAUTH, CURLOPT_USERPWD - тип авторизации, имя пользователя и пароль
  • CURLOPT_POST - используемый HTTP метод - POST
  • CURLOPT_POSTFIELDS - заранее созданная XML или JSON структурированная строкаt
  • Здесь вы можете ознакомиться с другими cURL опциями отправки

Когда вы установите все параметры, необходимо выполнить запрос curl_exec($ch). Этот метод даст вам ответ, который вы можете получить в JSON и который сможете использовать в будущем анализе. После выполнения запроса, вы получите информацию о коде ответа HTTP, которую мы будем использовать позже в этой инструкции -curl_getinfo($ch, CURLINFO_HTTP_CODE).

Анализ ответа

Если все прошло правильно, и вы получили код ответа HTTP (200 ОК 201 CREATED, и т.д.), вы можете извлечь необходимую информацию из тела ответа и представить ее пользователю. В нашем примере мы решили представить: Message ID, To, SMS Count, Status Group, Status Group Name, Status ID, Status Name и Status Description, но вы можете выбрать то, что вам необходимо.

В цикле foreach представленном ниже, будет показан ответ в одну строку для каждого сообщения:

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

Логи отправленных сообщений

При выборе этой опции, открывается страница logs.php с формой ввода для получения логов отправленных сообщений. Кнопка подтверждения опубликует эти поля к себе.

Построение запроса

logs.phpэто страница, где будут представлены логи отправленных сообщений. Вы должны определить URL для отправки запроса with sent message logs endpoint, and send a request to it with GET HTTP method this time (CURLOPT_HTTPGET option set to 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);

После выполнения запроса - culr_exec($curl), и получения кода ответа HTTP, вы можете начать анализ тела в зависимости от необходимого поля кода отклика, аналогично тому, что мы делали в главе о полнофункциональных текстовых сообщениях.

Анализ ответа

Если все прошло правильно, и вы получили код ответа HTTP (200 ОК 201 CREATED, и т.д.), вы можете извлечь необходимую информацию из тела ответа и представить ее пользователю. В нашем примере мы выбрали: Message ID, To, From, Text, Status Group Name, Status Description и Sent At, но вы можете выбрать то, что вам необходимо, точно также, как и до этого:

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

Следующий цикл foreach будет составлен по каждому полю массива логов отправленных сообщений и вписан в одну строку с соответствующими столбцами в ней. В этом случае цикл foreach по каждому полю необходим, потому что мы запросили его для всех логов сообщений.

В исключительных случаях вы можете проанализировать тело запроса точно так же, как мы делали в методе отправки сообщений:

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

Отчеты о доставке в Notify URL

Эта функция немного отличается от предыдущих двух - страница dlrPush.php не используется для запроса данных, она ждет его. Когда данные «выталкивается» на эту страницу, они могут быть проанализированы и показаны пользователю соответствующим образом.

Примечание:отчеты о доставке «проталкиваются» со страницы полнофункциональных текстовых сообщений, вводя URL этой страницы в поле Notify URL. Кроме того, заполняется поле Notify ContentType, с помощью которого страница определяет, какой тип тела необходимо получить.

Получение отчетов по доставке

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

Код выше показывает, что file_get_contents('php://input') используется для получения необработанных данных POST в виде строки. Дальше строки показывают вам как проверить данные, предоставляемые в XML или JSON, и как извлечь отчеты о доставке. Для XML мы анализируем начинается ли строка тела ответа с , и если нет, то попробуйте расшифровать его без ошибок - функция - isJson() Если все условия равны FALSE, переменная $result остается неустановленной. Это означает, что мы должны сказать пользователю, что отчет о доставке не был опубликован на сервере обратного вызова.

Анализ результатов

Анализ отчетов о доставке очень похож на анализ ответа полнофункциональных текстовых сообщений и логов отправленных сообщений, за исключением того, что мы не проверяем код ответа HTTP (потому что ответа нет вовсе). Все, что мы должны сделать - это выбрать, какую информацию из отчета о доставке мы хотим показать, и записать ее на странице.