Отправка каскадных сообщений
Каскадные сообщения – это последовательность каналов отправки, каждый из которых срабатывает в зависимости от статуса сообщения, полученном на предыдущем этапе.
В большинстве случаев переотправка сообщения по другому каналу происходит, если на предыдущем был получен «отрицательный» статус, такой как undelivered или timeout. Исключением являются каналы hlr и ping, которые инициируют отправку сообщения по очередному каналу в случае «положительного» статуса delivered.
Для отправки каскадного сообщения используйте стандартный метод отправки сообщения POST /api/message с последовательностью каналов, разделённых запятой , в параметре route.
Вы можете изменять параметры отдельного канала, например, текст или время ожидания статуса. Для этого используйте общие параметры с префиксом [route]_, где [route] – название канала.
Примеры использования каскадных сообщений
Предварительная проверка активности абонента перед отправкой SMS
Чтобы не отправлять SMS абоненту не в сети, можно предварительно проверить его активность, используя HLR-запрос, который будет стоить значительно меньше.
В случае, если HLR-запрос будет иметь статус delivered (абонент в сети), автоматически будет отправлено SMS.
Пример отправки SMS с предварительной проверкой HLR:
- 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 '{
"to": "+79993332211",
"route": "hlr,sms",
"hlr_validity": 500,
"sms_from": "<SMS_SENDER_NAME>",
"sms_text": "Ваш заказ А-381 отправлен, отслеживайте статус в приложении"
}'
# В OSX вместо команды md5sum необходимо использовать команду md5
$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([
'to' => '+79993332211',
'route' => 'hlr,sms',
'hlr_validity' => 500,
'sms_from' => '<SMS_SENDER_NAME>',
'sms_text' => 'Ваш заказ А-381 отправлен, отслеживайте статус в приложении'
]));
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({
to: '+79993332211',
route: 'hlr,sms',
hlr_validity: 500,
sms_from: '<SMS_SENDER_NAME>',
sms_text: 'Ваш заказ А-381 отправлен, отслеживайте статус в приложении',
});
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 = {
'to': '+79993332211',
'route': 'hlr,sms',
'hlr_validity': 500,
'sms_from': '<SMS_SENDER_NAME>',
'sms_text': 'Ваш заказ А-381 отправлен, отслеживайте статус в приложении'
}
r = requests.post('https://cp.redsms.ru/api/message', headers=headers, data=json.dumps(data))
# print(r.status_code)
# print(r.text)
Отправка маркетингового сообщения клиенту по одному из доступных каналов
В случае отправки маркетинговых сообщений отсутствует необходимость оперативной доставки, поэтому можно не указывать параметры _validity, используя значение по умолчанию – 24 часа.
В примере ниже мы будем пытаться доставить сообщение клиенту в Viber, а в случае, если приложение не установлено – отправим SMS. Мы также укажем для SMS более короткий текст в целях экономии.
- 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 '{
"to": "+79993332211",
"route": "viber,sms",
"viber_from": "<VIBER_SENDER_NAME>",
"viber_imageUrl": "https://loremflickr.com/400/400",
"viber_text": "Только до конца марта – скидки на все категории товаров. Успейте купить дешевле",
"viber_btnText": "Получить скидку",
"viber_btnUrl": "https://your-site.ru/sales",
"sms_from": "<SMS_SENDER_NAME>",
"sms_text": "Скидки на все категории до 31.03"
}'
# В OSX вместо команды md5sum необходимо использовать команду md5
$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([
'to' => '+79993332211',
'route' => 'viber,sms',
'viber_from' => '<VIBER_SENDER_NAME>',
'viber_imageUrl' => 'https://loremflickr.com/400/400',
'viber_text' => 'Только до конца марта – скидки на все категории товаров. Успейте купить дешевле',
'viber_btnText' => 'Получить скидку',
'viber_btnUrl' => 'https://your-site.ru/sales',
'sms_from' => '<SMS_SENDER_NAME>',
'sms_text' => 'Скидки на все категории до 31.03'
]));
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({
to: '+79993332211',
route: 'viber,sms',
viber_from: '<VIBER_SENDER_NAME>',
viber_imageUrl: 'https://loremflickr.com/400/400',
viber_text: 'Только до конца марта – скидки на все категории товаров. Успейте купить дешевле',
viber_btnText: 'Получить скидку',
viber_btnUrl: 'https://your-site.ru/sales',
sms_from: '<SMS_SENDER_NAME>',
sms_text: 'Скидки на все категории до 31.03',
});
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 = {
'to': '+79993332211',
'route': 'viber,sms',
'viber_from': '<VIBER_SENDER_NAME>',
'viber_imageUrl': 'https://loremflickr.com/400/400',
'viber_text': 'Только до конца марта – скидки на все категории товаров. Успейте купить дешевле',
'viber_btnText': 'Получить скидку',
'viber_btnUrl': 'https://your-site.ru/sales',
'sms_from': '<SMS_SENDER_NAME>',
'sms_text': 'Скидки на все категории до 31.03'
}
r = requests.post('https://cp.redsms.ru/api/message', headers=headers, data=json.dumps(data))
# print(r.status_code)
# print(r.text)
Отправка уведомления через VK, звонок или SMS
В следующем примере рассмотрим отправку с разным временем ожидания статуса на разных каналах.
- 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 '{
"to": "+79993332211",
"route": "vk,voice,sms",
"text": "Напоминаем о предстоящей записи завтра в 16:00",
"vk_from": "<VK_SENDER_NAME>",
"vk_validity": 3600,
"voice_from": "<VOICE_SENDER_NAME>",
"voice_voice": "jane",
"voice_emotion": "good",
"voice_validity": 1200,
"sms_from": "<SMS_SENDER_NAME>",
"sms_text": "Вы записаны завтра в 16:00",
"sms_validity": 1800
}'
# В OSX вместо команды md5sum необходимо использовать команду md5
$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([
'to' => '+79993332211',
'route' => 'vk,voice,sms',
'text' => 'Напоминаем о предс тоящей записи завтра в 16:00',
'vk_from' => '<VK_SENDER_NAME>',
'vk_validity' => 3600,
'voice_from' => '<VOICE_SENDER_NAME>',
'voice_voice' => 'jane',
'voice_emotion' => 'good',
'voice_validity' => 1200,
'sms_from' => '<SMS_SENDER_NAME>',
'sms_text' => 'Вы записаны завтра в 16:00',
'sms_validity' => 1800,
]));
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({
to: '+79993332211',
route: 'vk,voice,sms',
text: 'Напоминаем о предстоящей записи завтра в 16:00',
vk_from: '<VK_SENDER_NAME>',
vk_validity: 3600,
voice_from: '<VOICE_SENDER_NAME>',
voice_voice: 'jane',
voice_emotion: 'good',
voice_validity: 1200,
sms_from: '<SMS_SENDER_NAME>',
sms_text: 'Вы записаны завтра в 16:00',
sms_validity: 1800,
});
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 = {
'to': '+79993332211',
'route': 'vk,voice,sms',
'text': 'Напоминаем о предстоящей записи завтра в 16:00',
'vk_from': '<VK_SENDER_NAME>',
'vk_validity': 3600,
'voice_from': '<VOICE_SENDER_NAME>',
'voice_voice': 'jane',
'voice_emotion': 'good',
'voice_validity': 1200,
'sms_from': '<SMS_SENDER_NAME>',
'sms_text': 'Вы записаны завтра в 16:00',
'sms_validity': 1800,
}
r = requests.post('https://cp.redsms.ru/api/message', headers=headers, data=json.dumps(data))
# print(r.status_code)
# print(r.text)
Авторизация через PushOk (SIM-Push) или SMS
Услугу PushOk (SIM-push) поддерживают только 4 основных оператора. Для авторизации абонентов других операторов можно использовать SMS.
- 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 '{
"to": "+79993332211",
"route": "pushok,sms",
"pushok_validity": 60,
"pushok_text": "enter",
"sms_from": "<SMS_SENDER_NAME>",
"sms_text": "Ваш код авторизации 8085"
}'
# В OSX вместо команды md5sum необходимо использовать команду md5
$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([
'to' => '+79993332211',
'route' => 'pushok,sms',
'pushok_validity' => 60,
'pushok_text' => 'enter',
'sms_from' => '<SMS_SENDER_NAME>',
'sms_text' => 'Ваш код авторизации 8085'
]));
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({
to: '+79993332211',
route: 'pushok,sms',
pushok_validity: 60,
pushok_text: 'enter',
sms_from: '<SMS_SENDER_NAME>',
sms_text: 'Ваш код авторизации 8085',
});
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 = {
'to': '+79993332211',
'route': 'pushok,sms',
'pushok_validity': 60,
'pushok_text': 'enter',
'sms_from': '<SMS_SENDER_NAME>',
'sms_text': 'Ваш код авторизации 8085'
}
r = requests.post('https://cp.redsms.ru/api/message', headers=headers, data=json.dumps(data))
# print(r.status_code)
# print(r.text)
Отслеживание статуса доставки каскадного сообщения
Каскадные сообщения, которые были отправлены более чем по одному каналу (сработала хотя бы одна переотправка) состоят из нескольких «обычных» сообщений, которые связаны как двунаправленный связный список.
В поле сообщения child_uuid хранится UUID сообщения по следующему каналу, в поле parent_uuid – по предыдущему.
Вы можете хранить UUID и информацию только о последнем сообщении в последовательности отправки, либо дополнительно сохранять информацию о промежуточных отправках.
Схема определения статуса доставки каскадного сообщения: