Files
erv-ticket-dev/docs/n8n_sms_workflow.md
Fedor ed4270312e feat: SMS verification через n8n webhook
- Перенесена проверка SMS кода в n8n webhook (N8N_SMS_VERIFY_WEBHOOK)
- Упрощен формат ответа: убран токен, только success/message
- sms-verify.php теперь проксирует запросы на n8n
- Обновлен JS код: убрано использование токена
- Обновлена документация с упрощенным форматом ответа
- Протестировано: верный и неверный коды работают корректно
2026-01-15 18:11:18 +03:00

151 lines
4.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# N8N Workflow для SMS верификации
## Текущая архитектура
```
Frontend (JS) → PHP (sms-verify.php) → Redis + n8n (только отправка SMS)
```
## Предлагаемая архитектура
```
Frontend (JS) → n8n Webhook → Redis + SMS отправка (всё в n8n)
```
## Workflow 1: Отправка SMS кода
**Webhook URL:** `https://n8n.clientright.pro/webhook/sms-send`
### Шаги:
1. **Webhook Trigger** (POST)
- Принимает: `{ "phonenumber": "+79262306381" }`
2. **Нормализация номера телефона**
- Убрать пробелы, скобки, дефисы
- Убрать +7 или 8 в начале
- Результат: `9262306381`
3. **Проверка Rate Limit (Redis)**
- Ключ: `sms:ratelimit:send:9262306381`
- Если значение >= 5 → ошибка "Превышен лимит"
- Иначе → увеличить счетчик (TTL: 1 час)
4. **Генерация кода**
- 6-значный случайный код: `106574`
5. **Сохранение кода в Redis**
- Ключ: `sms:code:9262306381`
- Значение: `106574`
- TTL: 600 секунд (10 минут)
6. **Отправка SMS (HTTP Request)**
- URL: API SMS провайдера (SigmaSMS или другой)
- Метод: POST
- Body: `{ "phone": "9262306381", "text": "Код подтверждения: 106574" }`
7. **Обработка ошибок**
- Если SMS не отправилось → удалить код из Redis
- Вернуть ошибку
8. **Ответ**
```json
{
"success": true,
"message": "Код отправлен на ваш номер телефона"
}
```
---
## Workflow 2: Проверка SMS кода
**Webhook URL:** `https://n8n.clientright.pro/webhook/sms-verify`
### Шаги:
1. **Webhook Trigger** (POST)
- Принимает: `{ "phonenumber": "+79262306381", "code": "106574" }`
2. **Нормализация номера телефона**
- Аналогично workflow 1
3. **Проверка Rate Limit для попыток (Redis)**
- Ключ: `sms:ratelimit:attempts:9262306381`
- Если значение >= 10 → ошибка "Превышено количество попыток"
- Иначе → увеличить счетчик (TTL: 15 минут)
4. **Чтение кода из Redis**
- Ключ: `sms:code:9262306381`
- Если не найден → ошибка "Код не найден или истек"
5. **Сравнение кодов**
- Если `введенный код !== сохраненный код` → ошибка "Неверный код"
6. **Успешная верификация**
- Удалить код из Redis: `sms:code:9262306381`
- Удалить счетчик попыток: `sms:ratelimit:attempts:9262306381`
- Создать токен верификации: `sms:verified:9262306381` = `random_token` (TTL: 1 час)
7. **Ответ**
```json
{
"success": true,
"message": "Код подтвержден",
"token": "abc123def456..."
}
```
---
## Workflow 3: Проверка статуса верификации
**Webhook URL:** `https://n8n.clientright.pro/webhook/sms-check-verified`
### Шаги:
1. **Webhook Trigger** (POST)
- Принимает: `{ "phonenumber": "+79262306381", "token": "abc123..." }`
2. **Нормализация номера**
3. **Проверка токена в Redis**
- Ключ: `sms:verified:9262306381`
- Если токен совпадает → `verified: true`
- Иначе → `verified: false`
4. **Ответ**
```json
{
"success": true,
"verified": true
}
```
---
## Преимущества переноса в n8n
1. ✅ **Визуализация** - видно весь процесс на графике
2. ✅ **Логирование** - все шаги логируются автоматически
3. ✅ **Мониторинг** - видно ошибки и задержки
4. ✅ **Гибкость** - легко добавить новые шаги (например, уведомления в Telegram)
5. ✅ **Тестирование** - можно тестировать каждый шаг отдельно
6. ✅ **Масштабируемость** - легко добавить несколько SMS провайдеров с fallback
---
## Изменения в PHP коде
После переноса в n8n, `sms-verify.php` станет простым прокси:
```php
// sms-verify.php?action=send
// Просто перенаправляет на n8n webhook
// sms-verify.php?action=verify
// Просто перенаправляет на n8n webhook
```
Или можно вообще убрать PHP и вызывать n8n напрямую из JS.