SMS при смене статуса заказа в Bitrix Sale: событие OnSaleStatusOrderChange
Когда включать отправку из кода
Стандартный сценарий магазина часто уже шлёт письма и push по статусам. Отдельные SMS нужны там, где важно дублировать переход клиентом по смс-подтверждению оператора или уведомить о готовности к выдаче. Реализация опирается на модуль «Служба сообщений» и типы SMS-событий — см. общий разбор отправки через \Bitrix\Main\Sms\Event в заметке отправке SMS средствами ядра; здесь описан только узел на смене статуса заказа Sale.
Имена типов SMS-под каждый переход
Удобный шаблон, совместимый с привычкой к почтовым триггерам: суффикс _SMS. Для каждого символьного кода статуса, который вы хотите сопровождать текстом в SMS, в административке должен существовать отдельный тип события вида SALE_STATUS_CHANGED_N_SMS, SALE_STATUS_CHANGED_P_SMS и т.д. Если типа для конкретного статуса нет, отправка завершится ошибкой записи в b_messageservice_message — добавляйте событие заранее или расширяйте код проверками.
Обработчик OnSaleStatusOrderChange
Ниже — каркас: белый список статусов, выбор свойств с кодами PHONE и EMAIL, упаковка полей под макросы шаблонов:
<?php
namespace Ciftix\Integration;
use Bitrix\Main\Event;
use Bitrix\Main\EventManager;
use Bitrix\Main\Sms\Event as SmsEvent;
EventManager::getInstance()->addEventHandler(
'sale',
'OnSaleStatusOrderChange',
[SaleOrderStatusSms::class, 'handleChange']
);
class SaleOrderStatusSms
{
/** @var string[] символьные коды статусов, когда SMS разрешена */
private const ALLOWED = ['N', 'P', 'SZ', 'F'];
public static function handleChange(Event $event): void
{
$order = $event->getParameter('ENTITY');
$statusId = (string)$order->getField('STATUS_ID');
if (!in_array($statusId, self::ALLOWED, true)) {
return;
}
$phone = '';
$email = '';
foreach ($order->getPropertyCollection() as $prop) {
$code = (string)$prop->getField('CODE');
if ($code === 'PHONE') {
$phone = (string)$prop->getField('VALUE');
} elseif ($code === 'EMAIL') {
$email = (string)$prop->getField('VALUE');
}
}
$fields = [
'PHONE' => $phone,
'ORDER_ID' => $order->getField('ACCOUNT_NUMBER'),
'ORDER_REAL_ID' => $order->getField('ID'),
'ORDER_DATE' => $order->getField('DATE_STATUS')->format('Y.m.d'),
'ORDER_STATUS' => $statusId,
'ORDER_PRICE' => \SaleFormatCurrency($order->getPrice(), $order->getCurrency()),
'EMAIL' => $email,
'ORDER_DESCRIPTION' => (string)$order->getField('USER_DESCRIPTION'),
];
$smsType = 'SALE_STATUS_CHANGED_' . $statusId . '_SMS';
$sms = new SmsEvent($smsType, $fields);
$sms->setSite($order->getSiteId());
$sms->setLanguage('ru');
$sms->send();
}
}Список ALLOWED замените на реальные статусы проекта и синхронизируйте с заведёнными типами событий. Код свойств телефона/почты при необходимости подставьте из настроек конкретного типа плательщика.
Поля, доступные шаблону
#PHONE#— номер для доставки SMS.#ORDER_ID#— номер заказа, видимый покупателю.#ORDER_REAL_ID#— внутренний идентификатор.#ORDER_DATE#— дата, отформатированная в коде.#ORDER_PRICE#— сумма черезSaleFormatCurrency.#ORDER_STATUS#— символьный код статуса.#EMAIL#и#ORDER_DESCRIPTION#— контакт и пользовательский комментарий, если они нужны в тексте сообщения.
Практика на проде
- Перед боевым включением прогоните сценарий на копии: смените статус вручную и убедитесь, что в таблице
b_messageservice_messageстатус финальный «успешно», а текст соответствует шаблону. - Нормализуйте телефон к формату провайдера (E.164, без лишних скобок) отдельной функцией, если оператор этого требует.
- При высокочастотных массовых сменах статусов следите за квотой SMS и идемпотентностью: при необходимости добавьте флаг в свойство заказа, чтобы не дублировать одно и то же уведомление.
Не хотите копаться сами?
Починю за 1-3 дня. Без предоплаты — оплата по результату.
15+ лет опыта с 1С-Битрикс · Без предоплаты · 7 дней гарантии