Commit Graph

2 Commits

Author SHA1 Message Date
Дмитрий 0d0978a656 fix(смс): Теле2 не принимал имя отправителя в чужом написании
Первая клиентская рассылка на Теле2 упала: invalid_source_address.

Причина не опечатка, а устройство: имена регистрируются У КАЖДОГО ОПЕРАТОРА
ОТДЕЛЬНО, и написание разное — у МТС согласовано `liderra.ru`, у t2
`Liderra.ru`. Клиентская рассылка несёт ОДНО имя на всех получателей
(campaign.sender_name): имя выбирается на кампанию, а не на канал. Для МТС
оно верное, для t2 — нет.

Проверено опытом на живом t2, а не рассуждением:
  имя [liderra.ru] → ОТКАЗ: invalid_source_address
  имя [Liderra.ru] → ПРИНЯТО, message-id-kDQU1vVzEMbT

Лечение: канал приводит написание к согласованному с t2 — но ТОЛЬКО когда это
то же самое имя, отличающееся регистром. Чужое имя не трогаем: подменить его
значило бы соврать про отправителя, а честный отказ t2 лучше тихой подмены.
Пустое имя, как и раньше, заменяется именем канала.

🪤 Лечение половинчатое и так и подписано в коде: правильное — реестр имён по
каналам и в клиентском модуле (в модуле отдела продаж он уже есть,
SalesSmsSender::activeByProviderKey). Тогда эта склейка станет не нужна.

Четыре теста на разбор имени: тот же в другом регистре, точное совпадение,
чужое имя, пустое. Всего 82 теста зелёные, Pint чист, статанализ по всему
проекту 0 ошибок.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-04 18:15:31 +03:00
Дмитрий 458f206ce9 feat(смс): канал Теле2 — отправка, судьба сообщений и приёмник отчётов
Канал «SMS-Таргет» (target.t2.ru, HTTP API v2, Basic Auth) обеими половинами:

- отправка через POST /send_message (msisdn числом, shortcode, text);
- опрос судьбы GET /send_message/message-id-{id} — по одному сообщению,
  пакетного запроса у t2 нет;
- приёмник обратных звонков GET|POST /api/webhook/t2-delivery/{secret}
  со строками ?id=&status=&parts= — форма другая, чем у МТС.

Ловушки, закрытые тестами:

- слово status в ответе встречается дважды: снаружи «запрос удался»,
  внутри судьба сообщения. Спутать = объявить доставленным всё подряд;
- отказ приезжает с HTTP 200 — судим по телу, не по коду;
- незнакомое слово статуса судьбу НЕ меняет, сохраняется в delivery_raw.
  За «не доставлено» клиенту возвращаются деньги (В-198) — выдумка двигала
  бы рубли;
- t2 наш ответ не проверяет и повторов не делает: пропущенный звонок потерян,
  поэтому опрос client-sms:poll-delivery остаётся обязательным.

Деньги приёмник не двигает — возврат живёт в команде опроса (В-146).
Защита приёмника как у МТС: секрет не короче 32 знаков (пустой = закрыт
наглухо), список адресов отправителя, счётчик обращений; чужому 404, не 403.

Канал ВЫКЛЮЧЕН и живьём не пробован: имя отправителя Liderra.ru (заявка
№ 31121) на согласовании, без него t2 не выдаёт логин с паролём.
Порядок включения — docs/superpowers/runbooks/2026-08-04-vklyuchenie-kanala-t2.md

Миграций нет: графы судьбы появились ещё при МТС. Теле2 уже был в списке
разрешённых операторов и в тарифах админки — новых экранов не нужно.

Проверено: 78 тестов зелёные, Pint чист, статанализ по ВСЕМУ проекту 0 ошибок,
маршрут зарегистрирован. Против main — только вставки, удалений нет.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-04 15:06:01 +03:00