Уведомления об оплате заказа в msTelegram

Здравствуйте. Хотел в дополнение к информации о заказе, получать в телеграмм и то когда статус самого заказа сменится после оплаты.
По тому же принципу, делаю плагин, вешаю его на событие msOnChangeOrderStatus
Но ничего не происходит, через консоль ошибок тоже нет.
Может быть есть примеры как должно быть?
Михаил
27 апреля 2022, 08:24
modx.pro
886
0

Комментарии: 11

Артур Шевченко
27 апреля 2022, 10:41
0
Плагин
<?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);
Как получить токен и идентификатор чата написано в интернете.
    Михаил
    27 апреля 2022, 13:19
    0
    Но вы ведь тут не передаете информацию оплачен заказ или нет? Только информацию о заказе, а при ондлайноплате меняется статус заказа, вот отправлять этот статус при изменении, у меня как раз проблема.
    Уведомления о новых заказах и так приходят.
      Артур Шевченко
      27 апреля 2022, 15:22
      0
      Ты просил пример, я тебе скинул пример. В моём примере есть объект заказа $msOrder из него можно получить любую информацию по этому заказу. Если тебе нужно слать уведомления при смене статуса, поменяй событие. список доступных событий есть в документации. А если хочешь, чтобы написали тот код который будет работать так как тебе нужно, составь ТЗ и опубликуй в разделе Работа.
        Михаил
        27 апреля 2022, 16:05
        0
        Ага, спасибо за помощь, конечно код за меня писать не надо.
        Вопрос был в том, почему при смене события оно не срабатывает, а не как плагин уведомления в телегу написать.
    Роман
    27 апреля 2022, 16:04
    +1
    switch ($modx->event->name) {
      case 'msOnChangeOrderStatus':
        if ($status === 2) {
          //тут отправка в телегу
          die();
        }
      break;
    }
      Михаил
      27 апреля 2022, 16:09
      0
      Спасибо! О я знаю откуда этот кусок :) gist.github.com/TrywaR/93feccb27285d8e1e26c9364390be187
      Пробовал так, но почему то не срабатывает отправка тоже.
      Может просто опечатался где то, пойду проверять.
        Роман
        27 апреля 2022, 16:17
        0
        Сейчас попробую написать. Для теста.
          Михаил
          27 апреля 2022, 16:23
          0
          У меня скорее вопрос в том что бы при смене статуса заказа, отправлялось уведомление, плагин вешаем на событие msOnChangeOrderStatus правильно же? Тогда идем вадминку, меняем статус, событие должно срабатывать. так? :)

          Тот же самый код, только на msOnCreateOrder срабатывает норм (при создании заказа, конечно), а если повесить на изменение статуса msOnChangeOrderStatus то у меня не срабатывает почему то.
            Роман
            27 апреля 2022, 16:41
            0
            Может статус не тот ставите?
            $status == 2
            /manager/?a=system/settings
            Зайдите во вкладку системные события, посмотрите, что там есть на msOnChangeOrderStatus.
            Если что-то есть, то возможно приоритет в плагине поставьте, чтобы обрабатывался в первую очередь.
      Евгений Дубровин
      18 января 2023, 23:34
      1
      +1
      вот оказывается решение:

      $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, ''));
        Михаил
        19 января 2023, 17:00
        0
        Спасибо что поделились!
        Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
        11