sms уведомление о статусе заказа для minishop2

Победив емейлы для формирования пользователя на сайте, встал вопрос о том как уведомлять клиента о смене статуса заказа.
Я нашел для себя решение, отправлять с рабочего номера телефона, особенно в связке, что за 49 рублей в месяц, безлимитные смс.

мне понадобился вот такой вот плагин, написанный ИИ:

<?php
/** 
 * WeBi SMS Gateway Connector for miniShop2
 */

$secretToken = 'мой-токен'; 
$apiUrlPath = 'моя_ссылка'; 

// --- 1. ОБРАБОТКА ЗАПРОСОВ ОТ ПРИЛОЖЕНИЯ (POST/GET) ---
if ($modx->event->name == 'OnPageNotFound') {
    $q = $_GET['q'] ?? trim(parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH), '/');
    if (strpos($q, $apiUrlPath) === false) return;

    $token = $_POST['token'] ?? $_GET['token'] ?? '';
    $type  = $_POST['type'] ?? $_GET['type'] ?? 'get_sms'; 
    
    if ($token !== $secretToken) {
        header('Content-Type: application/json');
        die(json_encode(['error' => 'Unauthorized Access']));
    }

    // ТИП: Запрос списка СМС
    if ($type == 'get_sms') {
        $output = [];
        $orders = $modx->getCollection('msOrder', ['properties:LIKE' => '%"sent":false%']);

        foreach ($orders as $order) {
            $props = $order->get('properties');
            if (empty($props['sms_queue'])) continue;

            foreach ($props['sms_queue'] as $index => $sms) {
                if (isset($sms['sent']) && $sms['sent'] === false) {
                    $uniqueMsgId = $order->get('id') . $index;
                    $output[$uniqueMsgId] = [
                        'phone'  => (strpos($sms['phone'], '+') === false ? '+' : '') . $sms['phone'],
                        'text'   => $sms['text'],
                        'id_sim' => '1' // Всегда отправляем с первой симки
                    ];
                }
            }
        }

        header('Content-Type: application/json');
        if (empty($output)) exit(''); 
        exit(json_encode($output, JSON_UNESCAPED_UNICODE));
    }

    // ТИП: Подтверждение отправки (просто помечаем как отправлено)
    if ($type == 'sms_send') {
        $msgId = $_POST['id_message'] ?? $_GET['id_message'] ?? '';
        if ($msgId) {
            $orderId = substr($msgId, 0, -1); 
            $order = $modx->getObject('msOrder', $orderId);
            if ($order) {
                $props = $order->get('properties');
                if (!empty($props['sms_queue'])) {
                    foreach ($props['sms_queue'] as &$item) {
                        $item['sent'] = true;
                        $item['sent_at'] = date('Y-m-d H:i:s');
                    }
                    $order->set('properties', $props);
                    $order->save();
                }
            }
        }
        exit('OK');
    }
    if ($type == 'call_in' || $type == 'sms_in') exit('OK');
}

// --- 2. ЗАПИСЬ SMS ПРИ СМЕНЕ СТАТУСА ---
if ($modx->event->name == 'msOnChangeOrderStatus') {
    /** @var msOrder $order */
    $messages = [
        1 => "Вы сделали заказ # [[+id]] на сайте iflower-shop.ru",
        2 => "Вы оплатили заказ # [[+id]]",
        3 => "Ваш заказ # [[+id]] доставлен.",
        4 => "Заказ # [[+id]] отменен"
    ];

    if (!isset($messages[$status])) return;

    $phone = '';
    $address = $order->getOne('Address');
    if ($address) { $phone = $address->get('phone') ?: $address->get('receiver_phone'); }
    if (empty($phone)) {
        $user = $order->getOne('User');
        if ($user && $profile = $user->getOne('Profile')) {
            $phone = $profile->get('phone') ?: $profile->get('mobilephone');
        }
    }

    $phone = preg_replace('/[^0-9]/', '', $phone);
    if (empty($phone)) return;

    $fields = $order->toArray();
    $text = str_replace(
        array_map(fn($k) => "[[+{$k}]]", array_keys($fields)),
        array_values($fields),
        $messages[$status]
    );

    $props = $order->get('properties') ?: [];
    if (!isset($props['sms_queue'])) $props['sms_queue'] = [];
    
    $props['sms_queue'][] = [
        'phone' => $phone,
        'text'  => $text,
        'sent'  => false,
        'created_at' => date('Y-m-d H:i:s')
    ];
    
    $order->set('properties', $props);
    $order->save();
}
события выставил на msOnChangeOrderStatus и OnPageNotFound

настройки всего 2
$secretToken = 'мой-токен'; его я придумал сам, т.е. абсолютно любой
$apiUrlPath = 'моя_ссылка'; по сути, ее тоже можно указать любой, и в дальнейшем она будет доступна по адресу мой-сайт.ру/моя_ссылка

и теперь нужна софтинка, которая ставится на телефон. Я скачал ее с ТГ с канала @smsgateway

она максимально простая, т.е. по сути, нужно всего лишь прописать в настройках свой токен, и ссылку, и токе и ссылка должны совпадать с теми, которые указаны в плагине, запускаю службу, и вуаля, все работает.
Дмитрий
Вчера в 17:39
modx.pro
25
0

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

Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
0