Перейти к основному содержимому

Отправка по SMPP

Сообщения отправляются в submit_sm: один PDU на сообщение или по одному на каждую часть длинного сообщения.

Поля​

ПолеЧто указать
source_addrИмя отправителя: до 11 символов, если в нём есть что-то кроме цифр, иначе — до 15 цифр
destination_addrНомер получателя в международном формате, только цифры: 380671234567. Остальные символы отбрасываются
data_codingКак читать байты short_message: 0 — GSM 7-bit, 1 — ASCII, 3 — Latin-1, 8 — UCS-2
esm_class0x40, когда текст начинается с UDH (часть длинного сообщения), иначе 0
short_messageТекст, до 255 октетов в одном PDU
registered_deliveryЛюбое значение: отчёт отправляется на каждое сообщение в любом случае
schedule_delivery_timeОтправить позже, а не сейчас. Абсолютное или относительное время, с точностью до минуты
validity_periodСколько сообщение имеет смысл доставлять: от минуты до 72 часов, 72 часа, если пусто. Абсолютное или относительное время

TON и NPI обоих адресов, service_type, protocol_id, priority_flag, replace_if_present_flag и sm_default_msg_id не используются: оставьте то, что библиотека отправляет по умолчанию. Поле message_payload тоже не читается — текст идёт только в short_message.

Имя отправителя должно быть разрешено для вашей учётной записи. Имя, зарезервированное другим клиентом, заблокированное или защищённое имя, или — пока учётная запись на модерации — имя, ещё не подтверждённое операторами, отклоняется отчётом, а не в ответе на submit_sm: см. код err:003 в разделе Отчёты о доставке.

Флеш-сообщение — то, что сразу открывается на экране, — отправляется с data_coding 0x10 (GSM 7-bit) или 0x18 (UCS-2). Оно должно помещаться в одну часть.

Ответ​

submit_sm_resp возвращает message_id — десятичное число, своё для каждого submit_sm, то есть для каждой части. Сохраните его: отчёт о доставке несёт то же значение.

Нулевой command_status значит, что сообщение принято. Проверки баланса, оператора получателя и имени отправителя идут уже после этого, и сообщение, которое их не прошло, получает отчёт REJECTD вместо ошибки в ответе. Что приходит в самом ответе — в разделе Ошибки и ограничения.

Кодировка и длина​

КодировкаОдно сообщениеОдна часть длинного
GSM 7-bit160 символов153 символа
UCS-270 символов67 символов

В GSM 7-bit символы ^ { } \ [ ~ ] | и € занимают по два места. В UCS-2 эмодзи занимает два.

data_coding говорит нам, как читать ваши байты; кодировка к оператору выбирается по самому тексту, поэтому сообщение латиницей, отправленное в UCS-2, уйдёт как GSM 7-bit. С data_coding 0 байты читаются как символы GSM 7-bit, по одному на октет: обычные ASCII @, $ и _ превращаются там в другие символы. Для текста, который ваша система выдаёт как ASCII или Latin-1, ставьте 1 или 3.

Перед подсчётом переводы строк \r\n становятся \n, неразрывный пробел — обычным, тире – — дефисом -, а типографские кавычки — ".

Длинные сообщения​

Текст длиннее одного сообщения отправляется частями, и оба способа их пометить понимаются:

  • UDH в теле каждой части с esm_class 0x40: элемент склейки с 8-битной (0x00) или 16-битной (0x08) ссылкой;
  • поля SAR sar_msg_ref_num, sar_total_segments и sar_segment_seqnum, когда UDH нет.

Части могут приходить в любом порядке. Они собираются на нашей стороне и заново делятся для оператора; набор, который остаётся неполным два дня, отбрасывается без отчёта.

Вы платите за столько частей, сколько отправили или сколько насчитали мы, — по большему из двух чисел, как и везде в кабинете, поэтому число в отчёте совпадает с числом в счёте.

Отложенная отправка и срок действия​

schedule_delivery_time придерживает сообщение до указанной минуты. Значение, которое мы не смогли прочитать, игнорируется, и сообщение уходит сразу.

validity_period передаётся оператору в пределах от минуты до 72 часов. Сообщение, которое ещё ждёт на нашей стороне, когда его срок истёк, — или через 72 часа, если срок не задан, — не отправляется: деньги за него возвращаются, а обратно приходит отчёт EXPIRED.