- Перенесена проверка SMS кода в n8n webhook (N8N_SMS_VERIFY_WEBHOOK) - Упрощен формат ответа: убран токен, только success/message - sms-verify.php теперь проксирует запросы на n8n - Обновлен JS код: убрано использование токена - Обновлена документация с упрощенным форматом ответа - Протестировано: верный и неверный коды работают корректно
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
|
||
- Не возвращать реальные коды в ответах
|