Уведомления об оплате заказа в msTelegram
Здравствуйте. Хотел в дополнение к информации о заказе, получать в телеграмм и то когда статус самого заказа сменится после оплаты.
По тому же принципу, делаю плагин, вешаю его на событие msOnChangeOrderStatus
Но ничего не происходит, через консоль ошибок тоже нет.
Может быть есть примеры как должно быть?
По тому же принципу, делаю плагин, вешаю его на событие msOnChangeOrderStatus
Но ничего не происходит, через консоль ошибок тоже нет.
Может быть есть примеры как должно быть?
Комментарии: 11
Плагин
<?php
switch ($modx->event->name) {
case 'msOnCreateOrder':
$msOrder->set('comment', 'https://art-sites.ru/smeta?order_id='.$msOrder->get('id'));
$msOrder->save();
$modx->runSnippet('sendOrderToTelegram', array('msOrder' => $msOrder));
break;
}
Сниппет sendOrderToTelegram<?php
if(!isset($msOrder)){
$modx->log(1, 'sendOrderToTelegram: Не передан объект заказа');
return false;
}
$token = "токен";
$chat_id = "идентификатор чата";
$orderNum = $msOrder->get('num');
$total_cost = $msOrder->get('cost');
$pay_id = $msOrder->get('payment');
$sql = '
SELECT name
FROM modx_ms2_payments
WHERE id = '.$pay_id;
$statement = $modx->query($sql);
$name = $statement->fetchAll(PDO::FETCH_COLUMN);
$pay_name = $name[0];
$msAddress = $msOrder->getOne('Address');
$msReceiver = $msAddress->get('receiver');
$linkToEstimate = $msOrder->get('comment');
$msComment = $msAddress->get('comment');
$msPhone = $msAddress->get('phone');
$msProducts = $msOrder->getMany('Products');
$design_cost = 0;
$layout_cost = 0;
$setting_cost = 0;
$marketing_cost = 0;
$other_cost = 0;
$expense = 0;
$index = 1;
foreach ($msProducts as $msProduct) {
$prod_id = $msProduct->get('product_id');
$prod_count = $msProduct->get('count');
$prod_price = $msProduct->get('price');
$prod_cost = $msProduct->get('cost');
$prod_weight = $msProduct->get('weight');
$resource = $modx->getObject('modResource', $prod_id);
$prod_name = $resource->get('longtitle');
$prod_parent = $resource->get('parent');
$expense += $resource->get('add_cost');
switch($prod_parent){
case 24:
$design_cost += $prod_price * $prod_count;
//$modx->log(xPDO::LOG_LEVEL_ERROR, 'EXPENSE_D ' . $expense_d);
break;
case 17:
$layout_cost += $prod_price * $prod_count;
case 35:
case 46:
case 56:
$setting_cost += $prod_price * $prod_count;
break;
case 57:
$marketing_cost += $prod_price * $prod_count;
break;
default:
$other_cost += $prod_price * $prod_count;
break;
}
$products .= "
{$index}. {$prod_name}
({$prod_count}шт. по цене {$prod_price} руб.);
";
$index = $index + 1;
}
if($design_cost > 0){
$design_txt ="
--- на дизайн: {$design_cost} руб.";
}
if($layout_cost > 0){
$layout_txt ="
--- на вёрстку: {$layout_cost} руб.";
}
if($setting_cost > 0){
$setting_txt ="
--- на настройку: {$setting_cost} руб.";
}
if($marketing_cost > 0){
$marketing_txt ="
--- на маркетинг: {$marketing_cost} руб.";
}
if($other_cost > 0){
$other_txt ="
--- на остальное: {$other_cost} руб.";
}
if($expense > 0){
$expense_txt ="
--- на допы: {$expense} руб.";
}
if($msComment){
$comment="
--------------------------------
КОММЕНТАРИЙ ЗАКАЗЧИКА:
{$msComment}";
}
$txt = "
НОВЫЙ ЗАКЗАЗ #{$orderNum}
--------------------------------
ЗАКАЗЧИК: {$msReceiver}
--------------------------------
СПОСОБ ОПЛАТЫ: {$pay_name}
--------------------------------
ИТОГО: {$total_cost} руб.
--------------------------------
В ТОМ ЧИСЛЕ:
{$design_txt}{$layout_txt}{$setting_txt}{$marketing_txt}{$other_txt}{$expense_txt}
--------------------------------
НОМЕР ДЛЯ СВЯЗИ:
{$msPhone}
--------------------------------
ССЫЛКА НА СМЕТУ:
{$linkToEstimate}
--------------------------------
СОСТАВ ЗАКАЗА:
{$products}{$comment}";
$txt = urlencode($txt);
$url = "https://api.telegram.org/bot{$token}/sendMessage?chat_id={$chat_id}&text={$txt}";
$ch = curl_init();
curl_setopt_array($ch, array(CURLOPT_URL => $url, CURLOPT_RETURNTRANSFER => true));
$result = curl_exec($ch);
curl_close($ch);
Как получить токен и идентификатор чата написано в интернете.
Но вы ведь тут не передаете информацию оплачен заказ или нет? Только информацию о заказе, а при ондлайноплате меняется статус заказа, вот отправлять этот статус при изменении, у меня как раз проблема.
Уведомления о новых заказах и так приходят.
Уведомления о новых заказах и так приходят.
Ты просил пример, я тебе скинул пример. В моём примере есть объект заказа $msOrder из него можно получить любую информацию по этому заказу. Если тебе нужно слать уведомления при смене статуса, поменяй событие. список доступных событий есть в документации. А если хочешь, чтобы написали тот код который будет работать так как тебе нужно, составь ТЗ и опубликуй в разделе Работа.
Ага, спасибо за помощь, конечно код за меня писать не надо.
Вопрос был в том, почему при смене события оно не срабатывает, а не как плагин уведомления в телегу написать.
Вопрос был в том, почему при смене события оно не срабатывает, а не как плагин уведомления в телегу написать.
switch ($modx->event->name) {
case 'msOnChangeOrderStatus':
if ($status === 2) {
//тут отправка в телегу
die();
}
break;
}
Спасибо! О я знаю откуда этот кусок :) gist.github.com/TrywaR/93feccb27285d8e1e26c9364390be187
Пробовал так, но почему то не срабатывает отправка тоже.
Может просто опечатался где то, пойду проверять.
Пробовал так, но почему то не срабатывает отправка тоже.
Может просто опечатался где то, пойду проверять.
Сейчас попробую написать. Для теста.
У меня скорее вопрос в том что бы при смене статуса заказа, отправлялось уведомление, плагин вешаем на событие msOnChangeOrderStatus правильно же? Тогда идем вадминку, меняем статус, событие должно срабатывать. так? :)
Тот же самый код, только на msOnCreateOrder срабатывает норм (при создании заказа, конечно), а если повесить на изменение статуса msOnChangeOrderStatus то у меня не срабатывает почему то.
Тот же самый код, только на msOnCreateOrder срабатывает норм (при создании заказа, конечно), а если повесить на изменение статуса msOnChangeOrderStatus то у меня не срабатывает почему то.
Может статус не тот ставите?
Зайдите во вкладку системные события, посмотрите, что там есть на msOnChangeOrderStatus.
Если что-то есть, то возможно приоритет в плагине поставьте, чтобы обрабатывался в первую очередь.
$status == 2
/manager/?a=system/settingsЗайдите во вкладку системные события, посмотрите, что там есть на msOnChangeOrderStatus.
Если что-то есть, то возможно приоритет в плагине поставьте, чтобы обрабатывался в первую очередь.
вот оказывается решение:
$eventName = $modx->event->name;
switch($eventName) {
case 'msOnChangeOrderStatus':
if ($status == '2') {
$token = $modx->getOption('mstelegram_token', null, false);
$recipients = explode(',', $modx->getOption('mstelegram_recipients', null, ''));
Спасибо что поделились!
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.