Ico_big_custom Техническое описание системы SMS-взаимодействия Fortumo

SMS-оплата - это самое гибкое решение в Fortumo. Оно позволяет создавать практически любые приложения и сервисы с использованием оплаты посредством sms сообщений. Для использования SMS-Оплаты нужны определённые навыки в программировании и веб-сервер для обеспечения работы твоего приложения (например php или ruby скрипт). Взаимодействие между нашим сервером и твоим скриптом будет производиться путем HTTP GET запросов. Существуют три типа HTTP запросов, которые описаны ниже. Параметры в этих запросах всегда те же. Самый важный и обязательный в обработке сообщений первый тип.

Доставка сообщения

При получении входящего сообщения для оплаты твоей услуги Fortumo сделает HTTP GET запрос на URL адрес, указанный в настройках (например http://yourdomain.ru/sms.php). Информация, которую Fortumo получит с запрошенного URL (а если точнее, первые 120 символов), будет отправлена обратно покупателю в виде ответного сообщения. Параметрами этого HTTP GET запроса будут номер телефона отправителя, текст сообщения и другая полезная информация, что позволяет использовать её при составлении ответного сообщения.

Отчёты об оплате

В странах с MT тарификацией перед попыткой доставить ответное сообщение операторы дают знать, была ли успешной оплата или нет (в этом случае ответное сообщение не доставляется). Если ты хочешь использовать эту информацию, необходимо включить отчёты об оплате в настройках твоего сервиса SMS-Оплаты. Мы будем отправлять отчёты об оплате на указанный URL после отправки ответного сообщения. Любой ответ на запрос будет считаться успешным приемом отчета. При этом ответ не будет отправляться абоненту, отчёты об оплате нельзя использовать для составления ответного сообщения, для этого используется первый запрос.

Тестирование работы системы

Твой аккаунт имеет встроенную функцию для тестирования работы SMS-сервисов. После указания URL обработчика запросов перейди на вкладку "Тест" и отправь тестовый запрос с сервера Fortumo на обработчик. При этом параметр test будет иметь значение true.

Big_bullet Параметры

message
Текст отправленного сообщения за исключением ключевых префиксов и кодов. Например, если было отправлено сообщение с текстом ДАР КЛЮЧ 123, то значением параметра будет 123. Если в сообщении были только ключевые данные и отсутствовал дополнительный текст, то значения параметра будет пустым.
sender
Номер телефона отправителя сообщения в международном формате без знака плюс. Например 89634812815 для сообщения из России или 37256455115 для Эстонии.
country
Код страны оператора сотовой сети, к которой принадлежит мобильный телефон отправителя сообщения. Код состоит из двух символов согласно стандарту ISO 3166-1 (RU для России, UA для Украины, LT для Литвы, LV для Латвии, EE для Эстонии и так далее). Имей ввиду, что код не всегда соответствует текущему местоположению отправителя. Например человек с российским телефоном может отправлять сообщениях, находясь на роуминге в Германии, и значением параметра будет по-прежнему RU.
price
Конечная цена отправленного сообщения в местной валюте, включая налог на добавленную стоимость (НДС).
currency
Код местной валюты в соответствии со стандартом ISO 4217 (RUB, UAH, EUR, SEK, NOK, DKK, LTL, LVL, EEK, USD, GBP и так далее).
service_id
Строковый идентификатор текущего сервиса Fortumo, например f7fa12b381d290e268f99e382578d64a. Если ты используешь несколько различных сервисов для одного сайта, то эта строка поможет определить, для какого из сервисов был произведён платёж.
message_id
Строка, которая будет уникальной для каждого принятого платежа.
keyword
Ключевая часть отправленного сообщения. Например, если было отправлено сообщение с текстом ДАР КЛЮЧ 123, то значением этого параметра будет ДАР КЛЮЧ.
shortcode
Номер телефона, на который было отправлено сообщение.
operator
Название сотового оператора отправителя сообщения.
billing_type
Может быть MO или MT. Подробнее про виды тарификации читай в Fortumo FAQ.
status
Статус оплаты, который может принимать следующие значения: pending (используется в запросах на отправку ответного сообщения), ok или failed (используются в отчётах об оплате).
test
Параметр используется только тогда, когда сообщение было отправлено через тестовую среду Fortumo, и значением параметра будет 'true'.
sig
Защитная подпись, с помощью которой можно убедится, что запрос пришёл именно от Fortumo. Подробнее можешь прочитать в разделе Безопасность.

Наиболее часто используются параметры message и sender, но для более требовательных пользователей мы добавили остальные параметры.

Безопасность

Очень важно убедиться, что запрос пришёл именно от Fortumo, а не от кого-то другого. Для это есть несколько способов, которые подойдут для большинства пользователей.:

  1. Убедись, что IP адрес, с которого пришёл запрос, соответствует одному из используемых в Fortumo. В данный момент для выполнения запросов мы используем IP адреса 81.20.151.38, 81.20.148.122, 79.125.125.1 и 209.20.83.207. Если они изменятся, соответствующее уведомление будет отправлено по электронной почте. В PHP для такой проверки можно использовать переменную $_SERVER["REMOTE_ADDR"], в perl это $ENV{REMOTE_ADDR}, а для ASP.NET это Request.ServerVariables["REMOTE_ADDR"].
  2. Выбери бессмысленное имя для директории и скрипта. Например http://yourdomain.com/sms.php хуже чем http://yourdomain.com/go850g3oigjrtog/sms.php.
  3. Проверь защитную подпись. Все запросы подписываются с помощью секретной фразы, известной только тебе и Fortumo. Текущую секретную фразу можно увидеть на странице настройки сервиса. Защитная подпись добавляется к запросу с помощью параметра sig и представляет собой контрольную сумму MD5 от строки, состоящей из всех параметров запроса и секретной фразы. Ты можешь составить такую строку, узнать её контрольную сумму и убедиться, что значение совпадает с защитной подписью. Ниже приведён пример подобной проверки на языке PHP.

Big_bullet Пример sms.php

<?php

  //set true if you want to use script for billing reports
  //first you need to enable them in your account
  $billing_reports_enabled = false;

  // check that the request comes from Fortumo server
  if(!in_array($_SERVER['REMOTE_ADDR'],
      array('81.20.151.38', '81.20.148.122', '79.125.125.1', '209.20.83.207'))) {
    header("HTTP/1.0 403 Forbidden");
    die("Error: Unknown IP");
  }

  // check the signature
  $secret = ''; // insert your secret between ''
  if(empty($secret) || !check_signature($_GET, $secret)) {
    header("HTTP/1.0 404 Not Found");
    die("Error: Invalid signature");
  }

  $sender = $_GET['sender'];
  $message = $_GET['message'];
  $message_id = $_GET['message_id'];//unique id
  //hint:use message_id to log your messages
  //additional parameters: country, price, currency, operator, keyword, shortcode 
  // do something with $sender and $message
  $reply = "Thank you $sender for sending $message";

  // print out the reply
  echo($reply);
 
 //customize this according to your needs
  if($billing_reports_enabled 
    && preg_match("/Failed/i", $_GET['status']) 
    && preg_match("/MT/i", $_GET['billing_type'])) {
   // find message by $_GET['message_id'] and suspend it
  }


  function check_signature($params_array, $secret) {
    ksort($params_array);

    $str = '';
    foreach ($params_array as $k=>$v) {
      if($k != 'sig') {
        $str .= "$k=$v";
      }
    }
    $str .= $secret;
    $signature = md5($str);

    return ($params_array['sig'] == $signature);
  }
?>
Копировать в буфер обмена