Отправка по 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_class | 0x40, когда текст начинается с 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-bit | 160 символов | 153 символа |
| UCS-2 | 70 символов | 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_class0x40: элемент склейки с 8-битной (0x00) или 16-битной (0x08) ссылкой; - поля SAR
sar_msg_ref_num,sar_total_segmentsиsar_segment_seqnum, когда UDH нет.
Части могут приходить в любом порядке. Они собираются на нашей стороне и заново делятся для оператора; набор, который остаётся неполным два дня, отбрасывается без отчёта.
Вы платите за столько частей, сколько отправили или сколько насчитали мы, — по большему из двух чисел, как и везде в кабинете, поэтому число в отчёте совпадает с числом в счёте.
Отложенная отправка и срок действия
schedule_delivery_time придерживает сообщение до указанной минуты. Значение, которое мы не
смогли прочитать, игнорируется, и сообщение уходит сразу.
validity_period передаётся оператору в пределах от минуты до 72 часов. Сообщение, которое
ещё ждёт на нашей стороне, когда его срок истёк, — или через 72 часа, если срок не задан, — не
отправляется: деньги за него возвращаются, а обратно приходит отчёт EXPIRED.