Bitrix

3 шага программирования sms-оповещения о статусе заказа

В последнее время часто возникает одна и та же задача — организовать уведомления по SMS о статусе заказа в интернет-магазине, работающем под управлением 1С-Битрикс и в связи с этим я решил рассказать о том, как можно реализовать подобный функционал.

Первое, что нужно сделать, это выбрать провайдера SMS. Например у меня такой — http://sms16.ru/ . В принципе можно выбрать любого другого.
После это стоит убедиться, что его шлюз работоспособен и отправляет sms-ки. Это можно сделать с помощью стандартного проверочного скрипта, который предоставляет каждый sms-провайдер. Особое внимание стоит обратить на отправку sms на телефоны скайлинк, не всякий sms-провайдер это может.

Затем стоит сделать функцию отправки sms-сообщения и положить ее в файл /bitrix/php_interface/init.php
В случае моего sms-провайдера эта функция будет выглядеть так:


function sendSMS($phone, $text)
{
$sender = «Sender»;
$login = «login»;
$pass = «password»;

$src = ‘<?xml version=»1.0″ encoding=»utf-8″ ?>
<request>
<message>
<sender>’.$sender.'</sender>
<text>’.$text.'</text>
<abonent phone=»‘.$phone.'» number_sms=»1″/>
</message>
<security>
<login value=»‘.$login.'» />
<password value=»‘.$pass.'» />
</security>
</request>’;
$res = »;
$ch = curl_init();
curl_setopt($ch, CURLOPT_HTTPHEADER, array(‘Content-type: text/xml;
charset=utf-8’));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CRLF, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_SSLVERSION,3);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_POSTFIELDS, $src);
curl_setopt($ch, CURLOPT_URL, ‘https://my.sms16.ru/xml/’);
$result = curl_exec($ch);
$res = $result;
curl_close($ch);
return $res;
}

Видно, что функция принимает номер телефона и текст sms.

Затем стоит продумать, как вы хотите хранить тексты sms. Можно их хранить в файлах, но возможно администратору интернет-магазина будет неудобно их так хранить. Лучше всего сделать выделить под хранение текста sms какой-нибудь инфоблок. Только стоит не забыть сделать поле статус — по нему мы будем идентифицировать какой именно текст требуется отправить.

Итак функция для отправки у нас есть, тексты sms мы храним в инфоблоке и по свойству Статус мы можем получить текст посредством API Битрикс. Осталось организовать отправку sms по событию. Событие у нас будет — смена статуса заказа. Подрубиться к нему очень просто:


// файл /bitrix/php_interface/init.php
AddEventHandler(«sale», «OnStatusUpdate», «StatusUpdate»);
function StatusUpdate(&$ID, &$val)
{
// обработка
}

Для отправки sms нам нужно знать: номер телефона клиента, текст sms. В свою очередь, чтобы узнать текст sms нужно знать статус заказа. Статус заказа хранится в элементе массива $val[‘STATUS_ID’] .

Текст sms элементарно можно узнать посредством метода CIBlockElement::GetList:

$arFilter = Array(«IBLOCK_ID»=>$IBLOCK_ID, «ACTIVE_DATE»=>»Y», «ACTIVE»=>»Y»);
$res = CIBlockElement::GetList(Array(), Array(«IBLOCK_ID»=>$IBLOCK_ID, «ACTIVE»=>»Y» , «PROPERTY_STATUS»=>$val[‘STATUS_ID’]), false, Array(«nPageSize»=>1));
while($ob = $res->GetNextElement())
{
$arFields = $ob->GetFields();
}

Если текст sms мы записали в детальном описании элемента инфоблока, то у нас он в коде оказывается в элементе массива $arFields[«DETAIL_TEXT»].
* Не забудьте $IBLOCK_ID заменить на свой ID инфоблока, где хранятся тексты sms!

Теперь узнаем номер телефона. Он у нас хранится в свойстве заказа, т.к. номер телефона покупатель вводит в процессе оформления заказа.

Для того, чтобы было удобно доставать свойства заказа я сделал такую функцию:

function getOrderPropValue($ORDER_ID, $PROPS_ID)
{
CModule::IncludeModule(‘sale’);
$db_order = CSaleOrder::GetList(
array(),
array(«ID» => $ORDER_ID)
);
while ($arOrder = $db_order->Fetch())
{
$db_props = CSaleOrderProps::GetList(
array(«SORT» => «ASC»),
array(
«PERSON_TYPE_ID» => $arOrder[«PERSON_TYPE_ID»],
)
);
while ($arProps = $db_props->Fetch())
{
$db_vals = CSaleOrderPropsValue::GetList(
array(),
array(
«ORDER_ID» => $ORDER_ID,
«ORDER_PROPS_ID» => $PROPS_ID
)
);
if ($arVals = $db_vals->Fetch())
return $arVals[«VALUE»];
}
}
}

Предположим, свойство заказа «Номер телефона» имеет код в системе 3. Тогда мы можем узнать номер телефона, указанный в заказе следующим кодом:
$phone = getOrderPropValue($ID, 3);

Все составляющие известны — отправляем sms!
sendSMS($phone, $arFields[«DETAIL_TEXT»]);

В итоге у нас получился такой код обработчика:


// файл /bitrix/php_interface/init.php
AddEventHandler(«sale», «OnStatusUpdate», «StatusUpdate»);
function StatusUpdate(&$ID, &$val)
{

$arFilter = Array(«IBLOCK_ID»=>$IBLOCK_ID, «ACTIVE_DATE»=>»Y», «ACTIVE»=>»Y»);
$res = CIBlockElement::GetList(Array(), Array(«IBLOCK_ID»=>$IBLOCK_ID, «ACTIVE»=>»Y» , «PROPERTY_STATUS»=>$val[‘STATUS_ID’]), false, Array(«nPageSize»=>1));
while($ob = $res->GetNextElement())
{
$arFields = $ob->GetFields();
}

$phone = getOrderPropValue($ID, 3);
sendSMS($phone, $arFields[«DETAIL_TEXT»]);

}

Что же можно доработать в этом функционале:

  1. Желательно сделать возможность, чтобы покупатель мог не получать sms, если он не хочет
  2. Сделать обработчик исключений в функции отправки SMS. SMS может и не отправится, если скажем у нас закончились деньги не счету.
  3. Добавить валидацию номера телефона, чтобы не тратить деньги на отправку sms на неправильные номера

Отставить комментарий

Ваш электронный адрес не будет опубликован.Обязательные для заполнения поля отмечены *

10 − 1 =