231 lines
5.9 KiB
Markdown
231 lines
5.9 KiB
Markdown
|
|
# Формат ответа 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
|
|||
|
|
- Не возвращать реальные коды в ответах
|