Уведомления о заказах minishop в MAX
Здравствуйте. Хочу поделиться плагином, на замену старому плагину уведомлений о заказах Minishop2 в телеграмм. Поиском поискал, кажется такой правки не было, может кому пригодится.
Плагин у меня работает, уведомления приходят в паблик или чат. Можно использовать одного MAX бота для подключения разных магазинов для разных клиентов в разные чаты.
У кого из за msTelegram и блокировки ТГ на хостинге заказ перестал приходить, можно просто обновить код плагина msTelegram и прописать 2 параметра настройки.
1. Заводим кабинет в business.max.ru, там создаем бота, бот проходит модерацию и получаем его токен.
2. В месенджере (лучше в веб интерфейсе) создаем «Приватный канал» и берем его id из строки url -75532329058515461 (вместе с дефисом)
3. Добавляем созданного бота в этот канал и даем ему права админа.
4. В настройки MODХ добавляем два параметра:
Всё, должно работать. Можно одного своего бота для всех клиентов использовать.
Протестировано на MODX Revolution 2.8.6-pl
Сам плагин:
0
Плагин у меня работает, уведомления приходят в паблик или чат. Можно использовать одного MAX бота для подключения разных магазинов для разных клиентов в разные чаты.
1. Заводим кабинет в business.max.ru, там создаем бота, бот проходит модерацию и получаем его токен.
2. В месенджере (лучше в веб интерфейсе) создаем «Приватный канал» и берем его id из строки url -75532329058515461 (вместе с дефисом)
3. Добавляем созданного бота в этот канал и даем ему права админа.
4. В настройки MODХ добавляем два параметра:
max_token = токен бота MAX из ЛК
max_chat_ids = id чата MAX, можно несколько через запятую, который взяли из URL5. Создаем плагин с кодом ниже, само уведомление подкорректируйте для себя. Плагин вешаем на событие msOnCreateOrder (инструкция практически аналогичная msTelegram).Всё, должно работать. Можно одного своего бота для всех клиентов использовать.
Протестировано на MODX Revolution 2.8.6-pl
Сам плагин:
<?php
if ($modx->event->name != 'msOnCreateOrder') {
return;
}
$token = trim($modx->getOption('max_token', null, ''));
$recipients = explode(',', $modx->getOption('max_chat_ids', null, ''));
if (!$token || empty($recipients)) {
$modx->log(modX::LOG_LEVEL_ERROR, 'MAX notify: token or chat ids are empty');
return;
}
$contacts = $modx->getObject('msOrderAddress', array('id' => $msOrder->address));
if (!$contacts) {
$modx->log(modX::LOG_LEVEL_ERROR, 'MAX notify: order address not found for order #' . $msOrder->num);
return;
}
$_products = $msOrder->getMany('Products');
$deli = ($msOrder->delivery == '1') ? 'Самовывоз' : 'Доставка курьером';
$products = '';
$i = 0;
foreach ($_products as $product) {
$i++;
$products .= "{$i}. {$product->name} ({$product->count} шт.)\n";
}
$properties = json_decode($contacts->properties, true);
if (!is_array($properties)) {
$properties = array();
}
$date = !empty($properties['extfld_date']) ? $properties['extfld_date'] : 'Нет даты';
$time = (!empty($properties['extfld_hours']) && !empty($properties['extfld_minutes']))
? $properties['extfld_hours'] . ':' . $properties['extfld_minutes']
: 'Время не указано';
$change = !empty($properties['extfld_change']) ? $properties['extfld_change'] . ' руб.' : 'Без сдачи';
$cutlery = !empty($properties['extfld_count']) ? $properties['extfld_count'] . ' шт.' : 'Не указано';
$recall = (!empty($properties['extfld_recall']) && $properties['extfld_recall'] == 'Да')
? 'ПЕРЕЗВОНИТЬ'
: 'Не перезванивать';
$paymentName = '';
if (isset($msOrder->Payment) && $msOrder->Payment) {
$paymentName = $msOrder->Payment->name;
}
$message = "
Новый заказ #{$msOrder->num}
на сумму {$msOrder->cost} р.
{$deli},
{$paymentName}, {$recall}.
Доставить: {$date} в {$time}
-----
{$products}
-----
Имя: {$contacts->receiver} ({$contacts->phone})
-----
Адрес:
{$contacts->city}, {$contacts->street} {$contacts->building}, кв. {$contacts->room}
Подъезд: {$contacts->entrance}, этаж: {$contacts->floor}.
-----
Подготовить сдачу с: {$change}
Количество приборов: {$cutlery}
Комментарий: {$contacts->comment}
===========================
";
$message = trim($message);
// MAX принимает text до 4000 символов.
if (mb_strlen($message, 'UTF-8') > 3900) {
$message = mb_substr($message, 0, 3900, 'UTF-8') . "\n\nСообщение обрезано.";
}
foreach ($recipients as $chatId) {
$chatId = trim($chatId);
if (!$chatId) {
continue;
}
$url = 'https://platform-api.max.ru/messages?chat_id=' . rawurlencode($chatId);
$payload = json_encode(array(
'text' => $message,
'notify' => true,
), JSON_UNESCAPED_UNICODE);
$ch = curl_init();
curl_setopt_array($ch, array(
CURLOPT_URL => $url,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $payload,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => array(
'Authorization: ' . $token,
'Content-Type: application/json',
),
CURLOPT_CONNECTTIMEOUT => 10,
CURLOPT_TIMEOUT => 20,
));
$result = curl_exec($ch);
$error = curl_error($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($error || $status < 200 || $status >= 300) {
$modx->log(
modX::LOG_LEVEL_ERROR,
'MAX notify error. Chat: ' . $chatId . '; HTTP: ' . $status . '; cURL: ' . $error . '; response: ' . $result
);
}
}