*Эта статья разработчика Бруно Надо была первоначально опубликована в блоге Wyld Collective и связана с проектом, исследующим коммуникацию, которая стимулирует публичные дисплеи комментариев, называемый Cityspeak. Бруно — интерактивный дизайнер и разработчик программного обеспечения в Wyldco, создающий все виды невероятных интерактивных систем и продуктов. Следите за Wyldco в Twitter @Wyldco и ознакомьтесь с крутыми проектами от Wyld Collective.*
Мы недавно начали обновлять Cityspeak, проект, который был инициирован в Obx Labs, который будет переиздан с новым лицом и новым задним планом в июне. Переиздан, потому что он существует уже много лет, и до прошлого месяца он полагался на модем SMS для получения сообщений, а затем пересылал их в базу данных для обработки. Каждый раз, когда мы хотели установить этот проект в новом городе, нам приходилось бегать, чтобы найти SIM-карту, регулировать настройки модема, если мы находились в стране с другой инфраструктурой, чем в Канаде, и убедиться, что мы нашли план, который не стоил нам руки. Затем появился Twilio. Это вся предыстория, которую я собираюсь покрыть сейчас, больше об этом проекте позже.
Эта статья НЕ касается использования библиотеки Twilio, потому что мы просто не имели необходимости в ней для этого проекта. Следующие шаги объясняют, как получить и ответить на SMS-сообщения, отправленные на номер Twilio, с Twilio, установленным для отправки запросов в приложение CakePHP.
Этот пример предназначен для CakePHP 2.1, потому что он делает этот процесс очень простым, но несколько изменений сделают его работоспособным с более ранними версиями.
**1. Настройка номера Twilio и приложения TwiML.**
Если вы дошли до этого момента в статье, вы должны знать, что такое Twilio. Вы можете использовать номер, который приходит с пробной версией, но мы решили купить номер, который мы будем использовать для тестирования этого проекта и будущих проектов.
После покупки номера вы будете перенаправлены на страницу, где вы можете ввести URL-адреса запросов, которые Twilio будет вызывать при получении голосовых звонков и SMS-сообщений. Вы можете ввести URL-адреса запросов напрямую здесь, но не беспокойтесь об этом сейчас, мы создадим приложение TwiML вместо этого. Одна из причин, почему мы предпочитаем использовать приложение TwiML, заключается в том, что оно делает более простым быстрое переключение между URL-адресами разработки и производственной среды.
Пока вы находитесь в своей учетной записи, откройте вкладку «Приложения» и создайте новое приложение TwiML. Вы должны увидеть поле для имени и разделы для параметров голоса и SMS. Назовите приложение чем-то забавным, и в разделе SMS найдите поле, где вы можете ввести URL-адрес запроса, который Twilio будет вызывать. Наш URL-адрес запроса выглядит примерно так:
Вот разные части и то, как они относятся к нашему проекту CakePHP:
— fancydomain.com – просто домен, ничего особенного.
— twilio – это необязательно, но мы используем префикс twilio, чтобы сделать наш код более читаемым.
— installations – это наш контроллер, ваш, вероятно, будет другим.
— receive_sms – это наше действие, которое получает SMS-сообщение и отправляет ответ.
— xml – последнее, но не менее важное, расширение файла, которое контролирует представление для вывода XML-ответа.
Следующие несколько шагов будут охватывать изменения (или дополнения), которые вам нужно сделать в вашем приложении CakePHP, чтобы каждая часть URL-адреса запроса обрабатывалась правильно.
**2. Настройка префикса Twilio**
Эта часть необязательна. Если вы удалите «/twilio» из URL-адреса, вы можете пропустить этот шаг. Если вы решите не использовать это, просто помните, что не следует включать префикс «twilio_» в имя вашего действия, когда вы доберетесь до шага 4.
Все, что требуется, — это одна строка в файле «app/Config/core.php». Найдите строку, которая настраивает «Routing.prefixes», и измените ее на следующую, чтобы настроить префикс «twilio». У нас уже был префикс «admin», поэтому наш выглядит так:
[sourcecode language=»php»]Configure::write(‘Routing.prefixes’, array(‘admin’, ‘twilio’));[/sourcecode]
**3. Парсинг расширения файла в маршрутизаторе**
Еще один простой шаг, нам нужно одна строка в «app/Config/routes.php», чтобы обработать расширение «.xml» нашего URL-адреса запроса. Добавление следующей строки – мы добавили ее в начало – скажет CakePHP переключиться на XmlView для вывода ответа в формате XML.
[sourcecode language=»php»]Router::parseExtensions(‘xml’);[/sourcecode]
**4. Добавление действия**
В нашем URL-адресе запроса мы указали сначала префикс «twilio», затем контроллер «installations» и, наконец, действие «receive_sms», поэтому нам нужно создать следующую функцию в «app/Controller/InstallationsController.php»:
[sourcecode language=»php»]public function twilio_receive_sms() {
// Убедитесь, что у нас есть POST-запрос
if (!$this->request->is(‘post’)) {
throw new MethodNotAllowedException();
}
// Найдите правильную установку, используя номер телефона Twilio
$installation = $this->Installation->findByPhone($this->request->data[‘To’]);
if ($installation == null) {
return;
}
$message = array(
‘installation_id’ => $installation[‘Installation’][‘id’],
‘source’ => $this->request->data[‘From’],
‘message’ => $this->request->data[‘Body’],
);
$this->Installation->Message->create();
if (!$this->Installation->Message->save($message)) {
return;
}
// Отправьте ответ
$this->set(‘response’, array(
‘Response’ => array(
‘Sms’ => ‘Спасибо!’,
)
));
$this->set(‘_serialize’, ‘response’);
}
[/sourcecode]
Несколько заметок об этом коде, прежде чем мы перейдем дальше. Вверху мы проверяем, чтобы действие было вызвано из POST-запроса. Если вы указали GET вместо POST в вашем приложении TwiML, то вы должны проверить тот же метод, который вы назначили вашему URL-адресу запроса. Затем, для нашего проекта, каждая установка сопоставляется с номером Twilio, поэтому мы находим установку с помощью метода «findByPhone», передавая ему поле «To», которое Twilio передал в URL-адрес запроса. Мы затем создаем массив сообщения, но в этом случае нам нужно только поля «From» и «Body». Если вы хотите знать, какие данные передает Twilio, вы должны прочитать страницу запроса SMS Twilio в их документации. После этого мы создаем и сохраняем объект сообщения, связанный с правильной установкой.
Наконец, мы создаем массив для объекта ответа и убедимся, что мы установили переменную «_serialize», чтобы XmlView знал, что выводить содержимое переменной «response» в формате XML, следуя инструкциям для JSON и XML-представлений CakePHP.
**5. Попробуйте!**
Попробуйте. Отправьте SMS-сообщение на ваш номер Twilio, и если вы все правильно настроили, вы должны получить ответное SMS-сообщение, которое говорит «Спасибо!».