В последнее время часто возникает одна и та же задача — организовать уведомления по 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»]);
}
Что же можно доработать в этом функционале:
- Желательно сделать возможность, чтобы покупатель мог не получать sms, если он не хочет
- Сделать обработчик исключений в функции отправки SMS. SMS может и не отправится, если скажем у нас закончились деньги не счету.
- Добавить валидацию номера телефона, чтобы не тратить деньги на отправку sms на неправильные номера