Jump to content


Photo
* * * * * 3 votes

Отправляем СМС при успешном оформлении заказа

рецепт смс jbzoo 2.0+ api

53 replies to this topic

#1 Cheren-dow

Cheren-dow
  • JBZoo User (rus)
  • User rate: 95.7
  • posts: 5060
  • topics: 31

Posted 24 June 2014 - 15:32

*
POPULAR

В общем суть рецепта описана в названии темы. Поехали...

 

1. Для отправки сообщений я использовал сервис СМС-Услуги. Вам нужно на нем зарегистрироваться, после чего скачать php класс из раздела интеграция.

 

2. Далее переходим в папку

сайт\libraries

Создаем в ней например папку sms и перемещаем из скаченного архива 2 файла.

g5s_200x0.png

 

3. Далее перейдите в личный кабинет сервиса в раздел Настройки->Безопасность и API, и добавьте логин с паролем

emj_200x0.png

 

4. Открываем файл конфигурации 

сайт\libraries\sms\config.php

Вводим ваш логин и пароль который вы установили в 3 шаге.

1ce_200x0.png

 

5. Добавляем параметры для JBZoo

Открываем файл настроек приложения

сайт\media\zoo\applications\jbuniversal\config\basket.xml

В удобное для вас место вставляем код

        <!-- SMS Notification system -->
        <param name="@spacer" type="jbspacer" default="-= Настройка СМС уведомлений =-"/>

        <param name="notificaction-sms" type="jbbool" default="1" label="Оповестить при создании заказа"
               description=""/>

        <param name="admin-phones" type="textarea" default="" label="Телефоны администраторов"
               description="Вводите номера телефонов с новой строки"/>

        <param name="element-userphone" type="jbelementlist" default="" label="Телефон пользователя"
               description="" types="text"/>

        <param name="element-username" type="jbelementlist" default="" label="Имя пользователя"
               description="" types="text"/>

У меня он стоит после данной строки

<param name="email-user-layout-payment" type="jbemaillayoutlist" default="item.order.paymentemail"
               label="JBZOO_CART_USER_EMAIL_LAYOUT_PAYMENT" description="JBZOO_CART_USER_EMAIL_LAYOUT_PAYMENT_DESC"/>

Теперь если мы в настройках приложения откроем вкладку корзина - то увидим наши, только что созданные параметры для СМС информирования.

fxb_200x0.png

 

У нас появились 4 параметра, с первым я думаю все понятно. Второй параметр - телефоны администраторов использует текстовое поле, т.к бывают случаи что смс должно приходить нескольким людям, поэтому с каждой новой строчки вы можете вписывать номер телефона - по аналогии с элементом jbcolor. В третьем параметре выбирайте поле из формы где пользователь вводит свой номер. Четвертый параметр - это имя пользователя, оно нужно для передачи в смс.

 

6. Делаем отправку сообщений.

Открываем файл

сайт\media\zoo\applications\jbuniversal\framework\events\jbevent.basket.php

После этого условия

if ((int)$appParams->get('notificaction-create', 1)) {
.....
}

Добавляем следующий код:

$totalPrice = $item->getElement('1af7e792-bcff-4a6c-9bdb-dd5023b0251a')->getTotalPrice();

        if ((int)$appParams->get('global.jbzoo_cart_config.notificaction-sms', 1)) {
            jimport('sms.transport');
            $smsApi = new Transport();

            $adminPhones        = $app->jbstring->parseLines($appParams->get('global.jbzoo_cart_config.admin-phones'));
            $userNameElementId  = $appParams->get('global.jbzoo_cart_config.element-username');
            $userPhoneElementId = $appParams->get('global.jbzoo_cart_config.element-userphone');

            if ($adminPhones && $usernameElement = $item->getElement($userNameElementId)) {
                $userNameData = $usernameElement->data();

                if (isset($userNameData[0]['value']) && !empty($userNameData[0]['value'])) {
                    $adminMessage = 'Поступил новый заказ от ' . $userNameData[0]['value'] .
                        '. На сумму ' . $app->jbmoney->toFormat($totalPrice, $appParams->get('currency', 'RUB'));

                    $adminSend = $smsApi->send(array(
                        'text'   => $adminMessage,
                        'source' => 'SellFlowers',
                        'use_alfasource' => 1
                    ), $adminPhones);

                    $userPhoneData = $item->getElement($userPhoneElementId)->data();

                    if (isset($userPhoneData[0]['value']) && !empty($userPhoneData[0]['value'])) {
                        $userMessage = $userNameData[0]['value'] . ', заказ на сумму ' .
                            $app->jbmoney->toFormat($totalPrice, $appParams->get('currency', 'RUB')) . ' успешно оформлен.';

                        $userSend = $smsApi->send(array(
                            'text'   => $userMessage,
                            'source' => 'SellFlowers',
                            'use_alfasource' => 1
                        ), $userPhoneData[0]['value']);
                    }
                }

            }
        }

Обратите внимание на строку

$totalPrice = $item->getElement('1af7e792-bcff-4a6c-9bdb-dd5023b0251a')->getTotalPrice();

Вам нужно заменить мой id элемента корзины на свой. т.е в типе материала Order смотрите какой id у этого элемента

mjc_200x0.png

 

Ну вот вроде и все, можете пробовать.

 

ВНИМАНИЕ!!!

  • Будьте внимательны при замене файлов.
  • Проверьте с начало на тестовом сайте а уже потом загружайте на рабочий сайт.
  • Это решение(модификация) тестировалось на 
    Joomla: 3.3.1
    JBZoo: 2.1.4 Pro
    Zoo: 3.1.6,
  • Не забывайте - это решение(модификация) и при следующих обновлениях эти изменения могут пострадать.
  • При появлении проблем Тех.Поддержка ответственности не несет. 

Добавлено: 24.06.2014


Edited by Cheren-dow, 24 June 2014 - 15:34.

  • 6
Изображение
 

#2 Cheren-dow

Cheren-dow
  • Topic Starter
  • JBZoo User (rus)
  • User rate: 95.7
  • posts: 5060
  • topics: 31

Posted 24 June 2014 - 15:38

СМС отправляется как "администраторам" с примерным содержимом:

Поступил новый заказ от Вася Пупкин. На сумму 1 000 руб.

 

И пользователям

Вася Пупкин, заказ на 1 000 руб успешно оформлен


Дальше у кого какие фантазии)


Edited by Cheren-dow, 24 June 2014 - 15:38.

  • 0
Изображение
 

#3 solohub

solohub
  • JBZoo User (rus)
  • User rate: 0.5
  • posts: 218
  • topics: 44

Posted 08 September 2014 - 19:41

Делаю все по инструкции выше но смс не отправляет, в чем может быть проблема?

на всякий случай мой jbevent.basket.php

<?php
/**
 * JBZoo App is universal Joomla CCK, application for YooTheme Zoo component
 *
 * @package     jbzoo
 * @version     2.x Pro
 * @author      JBZoo App http://jbzoo.com
 * @copyright   Copyright (C) JBZoo.com,  All rights reserved.
 * @license     http://jbzoo.com/license-pro.php JBZoo Licence
 * @coder       Denis Smetannikov <denis@jbzoo.com>
 */

// no direct access
defined('_JEXEC') or die('Restricted access');


/**
 * Class JBEventBasket
 */
class JBEventBasket extends JBEvent
{

    /**
     * On after order saved
     * @param AppEvent $event
     */
    public static function saved($event)
    {
        $app    = self::app();
        $params = $event->getParameters();

        $appParams = $params['appParams'];
        $item      = $params['item'];
        $subject   = JText::_('JBZOO_CART_NEW_ORDER_CREATE');

        if ((int)$appParams->get('notificaction-create', 1)) {
            
            // to admin
            $adminEmail = $appParams->get('global.jbzoo_cart_config.admin-email');
            if ($adminEmail) {
                $adminLayout = $appParams->get('global.jbzoo_cart_config.email-admin-layout');
                $app->jbemail->sendByItem($adminEmail, $subject, $item, $adminLayout);
            }

            // to user email from profile
            $userEmail = JFactory::getUser()->email;
            if ($userEmail) {
                $userLayout = $appParams->get('global.jbzoo_cart_config.email-user-layout');
                $app->jbemail->sendByItem($userEmail, $subject, $item, $userLayout);
            }

            // to email from order field
            $emailElement = $appParams->get('global.jbzoo_cart_config.element-useremail');
            if ($element = $item->getElement($emailElement)) {
                $data = $element->data();
                if (isset($data[0]['value']) && !empty($data[0]['value'])) {
                    $userLayout = $appParams->get('global.jbzoo_cart_config.email-user-layout');
                    $app->jbemail->sendByItem($data[0]['value'], $subject, $item, $userLayout);
                }
			}
		 $totalPrice = $item->getElement('1af7e792-bcff-4a6c-9bdb-dd5023b0251a')->getTotalPrice();
          if ((int)$appParams->get('global.jbzoo_cart_config.notificaction-sms', 1)) {
            jimport('sms.transport');
            $smsApi = new Transport();
 
            $adminPhones        = $app->jbstring->parseLines($appParams->get('global.jbzoo_cart_config.admin-phones'));
            $userNameElementId  = $appParams->get('global.jbzoo_cart_config.element-username');
            $userPhoneElementId = $appParams->get('global.jbzoo_cart_config.element-userphone');
 
            if ($adminPhones && $usernameElement = $item->getElement($userNameElementId)) {
                $userNameData = $usernameElement->data();
 
                if (isset($userNameData[0]['value']) && !empty($userNameData[0]['value'])) {
                    $adminMessage = 'Поступил новый заказ от ' . $userNameData[0]['value'] .
                        '. На сумму ' . $app->jbmoney->toFormat($totalPrice, $appParams->get('currency', 'RUB'));
 
                    $adminSend = $smsApi->send(array(
                        'text'   => $adminMessage,
                        'source' => 'SellFlowers',
                        'use_alfasource' => 1
                    ), $adminPhones);
 
                    $userPhoneData = $item->getElement($userPhoneElementId)->data();
 
                    if (isset($userPhoneData[0]['value']) && !empty($userPhoneData[0]['value'])) {
                        $userMessage = $userNameData[0]['value'] . ', заказ на сумму ' .
                            $app->jbmoney->toFormat($totalPrice, $appParams->get('currency', 'RUB')) . ' успешно оформлен.';
 
                        $userSend = $smsApi->send(array(
                            'text'   => $userMessage,
                            'source' => 'SellFlowers',
                            'use_alfasource' => 1
                        ), $userPhoneData[0]['value']);
                    }
                }
 
            }
        }
		}



        if ((int)$appParams->get('global.jbzoo_cart_config.is_advance')) {

            // reduce the balance in the item
            $basketElements = $item->getElementsByType('jbbasketitems');
            if (!empty($basketElements)) {
                reset($basketElements);
                $jbbasket = current($basketElements);
                $items    = $jbbasket->getOrderItems();

                foreach ($items as $item) {
                    $good = $app->table->item->get($item['itemId']);
                    if (!$good) {
                        continue;
                    }

                    $jbPrices = $good->getElementsByType('jbpriceadvance');
                    foreach ($jbPrices as $jbPrice) {
                        if (isset($item['hash'])) {
                            $jbPrice->balanceReduce($item['hash'], $item['quantity']);
                        }
                    }
                }
            }
        }
    }

    /**
     * On before order save
     * @param AppEvent $event
     */
    public static function beforeSave($event)
    {
    }

}

id скопирован верно


  • 0

#4 Cheren-dow

Cheren-dow
  • Topic Starter
  • JBZoo User (rus)
  • User rate: 95.7
  • posts: 5060
  • topics: 31

Posted 08 September 2014 - 20:22

solohub, ни каких ошибок не выводится? В личном кабинете сервиса статистику отправок смотрели?

Думаю дело все в подписи, вы добавили в личном кабинете подписи, их одобрили? В вашем файле стоит моя подпись

$adminSend = $smsApi->send(array(
                        'text'   => $adminMessage,
                        'source' => 'SellFlowers', // Укажите свою подпись, предварительно добавив ее на сервисе.
                        'use_alfasource' => 1
                    ), $adminPhones);

Если СМС не отправляются смотрите что возвращает переменная $adminSend и $userSend


Edited by Cheren-dow, 08 September 2014 - 20:23.

  • 0
Изображение
 

#5 solohub

solohub
  • JBZoo User (rus)
  • User rate: 0.5
  • posts: 218
  • topics: 44

Posted 09 September 2014 - 05:35

Да действительно все дело было в подписи, спасибо.


  • 0

#6 webstudia

webstudia
  • JBZoo User (rus)
  • User rate: 0.2
  • posts: 104
  • topics: 21

Posted 24 September 2014 - 18:10

solohub, ни каких ошибок не выводится? В личном кабинете сервиса статистику отправок смотрели?

Думаю дело все в подписи, вы добавили в личном кабинете подписи, их одобрили? В вашем файле стоит моя подпись

$adminSend = $smsApi->send(array(
                        'text'   => $adminMessage,
                        'source' => 'SellFlowers', // Укажите свою подпись, предварительно добавив ее на сервисе.
                        'use_alfasource' => 1
                    ), $adminPhones);

Если СМС не отправляются смотрите что возвращает переменная $adminSend и $userSend

А что за подпись? Где её получить или подтвердить?

А то у меня тоже не отправляет и ошибки не знаю где смотреть. Всё сделал по инструкции.

Заказ на почту приходит, а смс так нигде и не получил. А ещё интересует в каком формате тел.номера записывать. я писал 790000000 и 8900000, ноль эмоций.

Joomla 3.3.4, ZOO 3.2.2, JBZoo 2.1.5


  • 0

#7 solohub

solohub
  • JBZoo User (rus)
  • User rate: 0.5
  • posts: 218
  • topics: 44

Posted 24 September 2014 - 18:14

SellFlowers - это подпись, она берется в личном кабинете sms сервиса, попробуйте вообще без нее, будет использоваться бесплатный канал


на счет формата +7, 7 , 8 одинаково работают


  • 0

#8 webstudia

webstudia
  • JBZoo User (rus)
  • User rate: 0.2
  • posts: 104
  • topics: 21

Posted 24 September 2014 - 18:14

SellFlowers - это подпись, она берется в личном кабинете sms сервиса, попробуйте вообще без нее, будет использоваться бесплатный канал

Без подписи попробовал. Тишина...


  • 0

#9 solohub

solohub
  • JBZoo User (rus)
  • User rate: 0.5
  • posts: 218
  • topics: 44

Posted 24 September 2014 - 18:15

весь код покажите jbevent.basket.php


  • 0

#10 webstudia

webstudia
  • JBZoo User (rus)
  • User rate: 0.2
  • posts: 104
  • topics: 21

Posted 24 September 2014 - 18:23

весь код покажите jbevent.basket.php

<?php
/**
 * JBZoo App is universal Joomla CCK, application for YooTheme Zoo component
 *
 * @package     jbzoo
 * @version     2.x Pro
 * @author      JBZoo App http://jbzoo.com
 * @copyright   Copyright (C) JBZoo.com,  All rights reserved.
 * @license     http://jbzoo.com/license-pro.php JBZoo Licence
 * @coder       Denis Smetannikov <denis@jbzoo.com>
 */

// no direct access
defined('_JEXEC') or die('Restricted access');


/**
 * Class JBEventBasket
 */
class JBEventBasket extends JBEvent
{

    /**
     * On after order saved
     * @param AppEvent $event
     */
    public static function saved($event)
    {
        $app    = self::app();
        $params = $event->getParameters();

        $appParams = $params['appParams'];
        $item      = $params['item'];
        $subject   = JText::_('JBZOO_CART_NEW_ORDER_CREATE');

        if ((int)$appParams->get('notificaction-create', 1)) {

            // to admin
            $adminEmail = $appParams->get('global.jbzoo_cart_config.admin-email');
            if ($adminEmail) {
                $adminLayout = $appParams->get('global.jbzoo_cart_config.email-admin-layout');
                $app->jbemail->sendByItem($adminEmail, $subject, $item, $adminLayout);
            }

            // to user email from profile
            $userEmail = JFactory::getUser()->email;
            if ($userEmail) {
                $userLayout = $appParams->get('global.jbzoo_cart_config.email-user-layout');
                $app->jbemail->sendByItem($userEmail, $subject, $item, $userLayout);
            }

            // to email from order field
            $emailElement = $appParams->get('global.jbzoo_cart_config.element-useremail');
            if ($element = $item->getElement($emailElement)) {
                $data = $element->data();
                if (isset($data[0]['value']) && !empty($data[0]['value'])) {
                    $userLayout = $appParams->get('global.jbzoo_cart_config.email-user-layout');
                    $app->jbemail->sendByItem($data[0]['value'], $subject, $item, $userLayout);
                }
            }

        }
        
/*****************SMS*****************************************************/
$totalPrice = $item->getElement('1af7e792-bcff-4a6c-9bdb-dd5023b0251a')->getTotalPrice();

        if ((int)$appParams->get('global.jbzoo_cart_config.notificaction-sms', 1)) {
            jimport('sms.transport');
            $smsApi = new Transport();

            $adminPhones        = $app->jbstring->parseLines($appParams->get('global.jbzoo_cart_config.admin-phones'));
            $userNameElementId  = $appParams->get('global.jbzoo_cart_config.element-username');
            $userPhoneElementId = $appParams->get('global.jbzoo_cart_config.element-userphone');

            if ($adminPhones && $usernameElement = $item->getElement($userNameElementId)) {
                $userNameData = $usernameElement->data();

                if (isset($userNameData[0]['value']) && !empty($userNameData[0]['value'])) {
                    $adminMessage = 'Поступил новый заказ от ' . $userNameData[0]['value'] .
                        '. На сумму ' . $app->jbmoney->toFormat($totalPrice, $appParams->get('currency', 'RUB'));

                    $adminSend = $smsApi->send(array(
                        'text'   => $adminMessage,
                        'source' => '',
                        'use_alfasource' => 1
                    ), $adminPhones);

                    $userPhoneData = $item->getElement($userPhoneElementId)->data();

                    if (isset($userPhoneData[0]['value']) && !empty($userPhoneData[0]['value'])) {
                        $userMessage = $userNameData[0]['value'] . ', заказ на сумму ' .
                            $app->jbmoney->toFormat($totalPrice, $appParams->get('currency', 'RUB')) . ' успешно оформлен.';

                        $userSend = $smsApi->send(array(
                            'text'   => $userMessage,
                            'source' => 'SellFlowers',
                            'use_alfasource' => 1
                        ), $userPhoneData[0]['value']);
                    }
                }

            }
        }

/**********************************************************************/


        if ((int)$appParams->get('global.jbzoo_cart_config.is_advance')) {

            // reduce the balance in the item
            $basketElements = $item->getElementsByType('jbbasketitems');
            if (!empty($basketElements)) {
                reset($basketElements);
                $jbbasket = current($basketElements);
                $items    = $jbbasket->getOrderItems();

                foreach ($items as $item) {
                    $good = $app->table->item->get($item['itemId']);
                    if (!$good) {
                        continue;
                    }

                    $jbPrices = $good->getElementsByType('jbpriceadvance');
                    foreach ($jbPrices as $jbPrice) {
                        if (isset($item['hash'])) {
                            $jbPrice->balanceReduce($item['hash'], $item['quantity']);
                        }
                    }
                }
            }
        }
    }

    /**
     * On before order save
     * @param AppEvent $event
     */
    public static function beforeSave($event)
    {
    }

}

Скриншот элемента в корзине

YEn4nlk.png


Нашёл в сервисе как подать запрос на подпись. подал. ожидаю.

но без подписи не шлёт...


  • 0





Also tagged with one or more of these keywords: рецепт, смс, jbzoo 2.0+, api

Click to return to top of page in style!