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