Wait Call
Wait Call – это способ подтверждения номера телефона с помощью исходящего звонка, который совершает сам пользователь. Услуга предназначена для авторизации, верификации или подтверждения действий, аналогично SMS-коду или Telegram Gateway, но реализуется через телефонный звонок.
Отправка осуществляется через общий метод отправки сообщений POST /api/message.
Как это работает
- Клиент вводит свой номер телефона на сайте или в мобильном приложении.
- Система предлагает пользователю сделать звонок на авторизационный номер телефона.
- Происходит дозвон и сброс. Если введённый номер совпал с номером, с которого осуществлялся звонок, система его авторизует.
В этом режиме пользователю необходимо просто позвонить на указанный номер. Звонок будет сброшен, а вы получите информацию о том, был ли звонок совершен. Подходит для максимально быстрой авторизации без участия пользователя в интерфейсе.
Пример запроса:
- cURL
- PHP
- Node.js
- Python
curl -X POST "https://cp.redsms.ru/api/message" \
-H "login: <USERNAME>" \
-H "ts: ts-value-42" \
-H "secret: $(echo -n 'ts-value-42<API_KEY>' | md5sum | awk '{print $1}')" \
-H "Content-type: application/json" \
-d '{
"route": "wcall",
"to": "+79993332211",
}'
$login = '<USERNAME>';
$ts = 'ts-value-' . time();
$api_key = '<API_KEY>';
$secret = md5($ts . $api_key);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://cp.redsms.ru/api/message');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'login: ' . $login,
'ts: ' . $ts,
'secret: ' . $secret,
'Content-type: application/json'
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([
'route' => 'wcall',
'to' => '+79993332211',
]));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
$info = curl_getinfo($ch);
curl_close($ch);
$response_data = json_decode($response);
// print_r($info['http_code']);
// print_r($response_data);
const https = require('https');
const crypto = require('crypto');
const login = '<USERNAME>';
const ts = `ts-value-${Date.now()}`;
const apiKey = '<API_KEY>';
const secret = crypto.createHash('md5').update(ts + apiKey).digest('hex');
(new Promise((resolve, reject) => {
const body = JSON.stringify({
route: 'wcall',
to: '+79993332211',
});
const request = https.request(
{
method: 'POST',
host: 'cp.redsms.ru',
path: '/api/message',
headers: {
login,
ts,
secret,
'Content-Length': Buffer.byteLength(body),
'Content-Type': 'application/json',
},
},
(response) => {
const buffers = [];
response.on('error', reject);
response.on('data', (buffer) => buffers.push(buffer));
response.on('end', () => {
const responseBody = Buffer.concat(buffers).toString();
const responseData = JSON.parse(responseBody);
if (response.statusCode !== 200) {
return reject(responseData);
}
resolve(responseData);
});
},
);
request.write(body);
request.end();
}))
.then(console.log)
.catch(console.error);
import hashlib
import json
import requests
import time
login = '<USERNAME>'
ts = unicode(time.time())
api_key = '<API_KEY>'
secret = hashlib.md5((ts + api_key).encode()).hexdigest()
headers = {
'login': login,
'ts': ts,
'secret': secret,
'Content-type': 'application/json',
}
data = {
'route': 'wcall',
'to': '+79993332211',
}
r = requests.post('https://cp.redsms.ru/api/message', headers=headers, data=json.dumps(data))
# print(r.status_code)
# print(r.text)
Пример тела ответа:
{
"items": [
{
"uuid": "af19b73c-0c01-11ef-8136-0242ac120002",
"status": "created",
"status_time": 1715763320,
"to": "+79993332211",
"replacedFrom": "+79160001122"
}
],
"errors": [],
"count": 1,
"success": true
}
В ответе поле replacedFrom содержит но мер, на который должен позвонить пользователь.
Статус доставки
Статус можно получить через метод GET /api/message/{uuid} или Webhook:
| Статус | Значение |
|---|---|
wcall_delivered | Пользователь успешно совершил звонок на указанный номер |
timeout | Пользователь не совершил звонок в течение заданного времени жизни сообщения |
Примечания
- Тарифицируются все отправленные запросы.
- Если параметр
textне указан, то для отправки выбирается режим без озвучивания кода. - Номер, на который необходимо совершить звонок, всегда указывается в ответе в поле
replacedFrom. - Можно задать время жизни сообщения — если в течение этого времени пользователь не совершит звонок, сообщение получит статус
timeout. - Логика подтверждения зависит от режима:
- В режиме без кода: подтвердить авторизацию по факту звонка (
delivered). - В режиме с кодом: пользователь должен ввести полученный по звонку код.
- В режиме без кода: подтвердить авторизацию по факту звонка (