feat: SMS verification через n8n webhook

- Перенесена проверка SMS кода в n8n webhook (N8N_SMS_VERIFY_WEBHOOK)
- Упрощен формат ответа: убран токен, только success/message
- sms-verify.php теперь проксирует запросы на n8n
- Обновлен JS код: убрано использование токена
- Обновлена документация с упрощенным форматом ответа
- Протестировано: верный и неверный коды работают корректно
This commit is contained in:
Fedor
2026-01-15 18:11:18 +03:00
parent 2c516362df
commit ed4270312e
6 changed files with 918 additions and 96 deletions

View File

@@ -0,0 +1,230 @@
# Формат ответа N8N Webhook для проверки SMS кода
## URL Webhook
`https://n8n.clientright.pro/webhook/erv_sms_verify`
## Входящие данные (POST)
```json
{
"phonenumber": "+79262306381",
"code": "106574"
}
```
---
## Формат ответа
### ✅ Успешная проверка (HTTP 200)
```json
{
"success": true,
"message": "Код подтвержден"
}
```
**Поля:**
- `success` (boolean, обязательное) - `true` при успехе
- `message` (string, обязательное) - сообщение для пользователя
---
### ❌ Ошибки (HTTP 400)
#### 1. Неверный код
```json
{
"success": false,
"error": "invalid_code",
"message": "Неверный код"
}
```
**Поля:**
- `success` (boolean) - `false`
- `error` (string) - код ошибки: `"invalid_code"`
- `message` (string) - сообщение для пользователя
---
#### 2. Код не найден или истек
```json
{
"success": false,
"error": "code_not_found",
"message": "Код не найден или истек. Запросите новый код."
}
```
**Поля:**
- `success` (boolean) - `false`
- `error` (string) - код ошибки: `"code_not_found"`
- `message` (string) - сообщение для пользователя
---
#### 3. Превышен лимит попыток
```json
{
"success": false,
"error": "rate_limit_exceeded",
"message": "Превышено количество попыток. Попробуйте позже."
}
```
**Поля:**
- `success` (boolean) - `false`
- `error` (string) - код ошибки: `"rate_limit_exceeded"`
- `message` (string) - сообщение для пользователя
---
#### 4. Номер телефона или код не указаны
```json
{
"success": false,
"error": "missing_data",
"message": "Номер телефона или код не указаны"
}
```
**Поля:**
- `success` (boolean) - `false`
- `error` (string) - код ошибки: `"missing_data"`
- `message` (string) - сообщение для пользователя
---
#### 5. Внутренняя ошибка сервера (HTTP 500)
```json
{
"success": false,
"error": "internal_error",
"message": "Сервис временно недоступен. Попробуйте позже."
}
```
**Поля:**
- `success` (boolean) - `false`
- `error` (string) - код ошибки: `"internal_error"`
- `message` (string) - сообщение для пользователя
---
## Коды ошибок
| Код ошибки | HTTP Status | Описание |
|------------|-------------|----------|
| `invalid_code` | 400 | Введенный код не совпадает с сохраненным |
| `code_not_found` | 400 | Код не найден в Redis или истек (TTL) |
| `rate_limit_exceeded` | 400 | Превышен лимит попыток проверки (10 за 15 минут) |
| `missing_data` | 400 | Не указан номер телефона или код |
| `internal_error` | 500 | Внутренняя ошибка (Redis недоступен и т.д.) |
---
## Примеры использования в n8n
### Успешная проверка
**Workflow шаги:**
1. Webhook Trigger → получает `phonenumber` и `code`
2. Function Node → нормализация номера
3. Redis Node (GET) → чтение кода: `sms:code:9262306381`
4. Function Node → сравнение кодов
5. Redis Node (DEL) → удаление кода и счетчика попыток
6. **Respond to Webhook** → возвращает успешный ответ
**Код для Respond to Webhook:**
```json
{
"success": true,
"message": "Код подтвержден"
}
```
---
### Ошибка: Неверный код
**Workflow шаги:**
1. ... (аналогично успешной проверке)
2. Function Node → сравнение кодов
3. IF Node → если коды не совпадают
4. **Respond to Webhook** → возвращает ошибку
**Код для Respond to Webhook:**
```json
{
"success": false,
"error": "invalid_code",
"message": "Неверный код"
}
```
---
### Ошибка: Код не найден
**Workflow шаги:**
1. ... (аналогично)
2. Redis Node (GET) → чтение кода
3. IF Node → если код = null
4. **Respond to Webhook** → возвращает ошибку
**Код для Respond to Webhook:**
```json
{
"success": false,
"error": "code_not_found",
"message": "Код не найден или истек. Запросите новый код."
}
```
---
## Совместимость с текущим кодом
Текущий JS код (`common.js`) ожидает:
```javascript
success: function(data) {
if (data.success) {
// Успех - сохраняем токен
sms_verify_token = data.token;
// ... показываем форму
} else {
// Ошибка - показываем сообщение
$('.modal .form-item__warning').text(data.message || "Неверный код");
}
}
```
**Предложенный формат полностью совместим!**
---
## Дополнительные рекомендации
1. **HTTP Status Codes:**
- Успех: `200 OK`
- Ошибки клиента: `400 Bad Request`
- Ошибки сервера: `500 Internal Server Error`
2. **Content-Type:**
- Всегда: `application/json; charset=utf-8`
3. **Логирование:**
- Логировать все попытки проверки (успешные и неуспешные)
- Логировать ошибки с деталями
4. **Безопасность:**
- Не возвращать детали внутренних ошибок в production
- Не возвращать реальные коды в ответах