BILLmanager стал более открытым



    Мы возвращаемся на Хабр после долгого отсутствия. И сегодня хотим рассказать как быстро и просто создать свой дополнительный модуль для BILLmanager'a. Эта задача существенно упростилась, потому что теперь доступен исходный код уже реализованных нами плагинов.

    Возможность получения дополнительного модуля для BILLmanager существовала и ранее, причём несколькими способами.

    Первый вариант — заказать модуль у нас, в ISPsystem. Получившийся продукт будет поддерживаться во всех последующих версиях BILLmanager, а также будет доступен для подключения другим пользователям. Однако порой наш плотный roadmap может надолго отсрочить релиз желаемого плагина.

    Второй вариант — обратиться к нашим технологическим партнёрам, но в этом случае вопрос с поддержкой продукта нужно будет решать с партнёрами дополнительно.

    И, наконец, третий вариант — написать модуль самостоятельно. Начиная с версии 5.58 вам больше не потребуется внушительный опыт программирования, т.к. теперь набор разработчика BILLmanager включает в себя примеры исходного кода 8 существующих плагинов, а именно:

    1. cpanel – обеспечивает интеграцию с одноимённой панелью управления;
    2. epp – универсальный обработчик для взаимодействия с поддерживающими протокол EPP регистраторами доменных имён;
    3. webnames – взаимодействует с этим доменным регистратором;
    4. thesslstore – модуль для покупки SSL-сертификатов;
    5. paypal – плагин для приёма платежей через данную платёжную систему;
    6. privatbank – для взаимодействия с биллингом банка;
    7. remotemail – почтовый шлюз;
    8. smsc – СМС-шлюз для компании СМС-центр;

    Для получения пакета с примерами требуется установить BILLmanager (инструкция как это сделать находится здесь). В процессе инсталляции выберите желаемую версию продукта (Standard, Advanced или Corporate), а затем установите пакет billmanager-[выбранный_вариант]-devel (например, yum install billmanager-corporate-devel).
    После установки пакета devel примеры будут находиться здесь:
    /usr/local/mgr5/src/examples

    Вооружившись образцами и имеющейся документацией, можно разработать модуль практически для любой платёжной системы, доменного регистратора, СМС-шлюза и т.д.
    Рассмотрим процесс написания СМС-шлюза для взаимодействия с сотовым оператором Q-telecom; исходники — под катами чуть ниже.

    При переделке модуля использовалось описание API Q-telecom; оно лежит здесь.

    Из документации к API видно, что взаимодействие выполняется по протоколу http, так же как и в СМС-шлюзе из примеров. Воспользуемся этим.
    Создадим копию директории /usr/local/mgr5/src/examples/smsc и назовём её gwqtc.
    Внутри лежит 3 файла: xml отвечает за то, как плагин выглядит в BILLmanager; cpp описывает backend; в makefile лежат инструкции для компилятора как собрать всю эту прелесть в бинарник.

    Начнём с самого сложного, — с переделки gwsmsc.cpp. Переименуем его в gwqtc.cpp, затем откроем файл в текстовом редакторе. Меняем в отвечающем за создание post-запроса куске кода названия переменных на описанные ребятами из Q-telecom. Добавляем параметр gzip=none, чтобы в случае сбоев текст ошибки приходил читаемым. Те строки, которые QTC не поймёт — удаляем.

    Где и что поменяли


    Затем в файле ищем и меняем “smsc” на “qtc” (в итоге изменения будут в двух строках). Всё, файл gwqtc.cpp готов. Самое сложное мы сделали.

    Займёмся xml: меняем его имя на billmgr_mod_gwqtc; внутри “SMS-center” перепиcываем на “Q-telecom”, а “smsc” на “qtc”. С внешним видом закончили.
    В makefile всё совсем просто: всюду меняем “smsc” на “qtc”.

    Теперь скомпилируем и установим модуль командой make install, не забыв перед этим установить пакет gcc-c++, если его в системе нет.
    После всех этих действий в BILLmanager, в меню “Интеграция” → “Модули сообщений” → “Создать” вы увидите новый модуль, Q-telecom.

    Как это выглядит в BILLmanager


    Осталось внести полученные при заключении договора с Q-telecom настройки — и можно пользоваться!

    Вот обещанные исходники в конечном их виде.

    gwqtc.cpp
    #include <gate/gatemodule.h>
    #include <defines.h>
    #include <mgr/mgrlog.h>
    #include <mgr/mgrrpc.h>
    #include <sstream>
    
    #define BINARY_NAME "gwqtc"
    MODULE("notify");
    
    namespace gate {
    
    class QTC : public Module {
    public:
    
    	QTC()
    		: Module(BINARY_NAME)
    	{
    
    
    	}
    
    
    	virtual mgr_xml::Xml Features() const
    	{
    		mgr_xml::Xml out;
    		mgr_xml::XmlNode features = out.GetRoot().AppendChild("features");
    		features.AppendChild("feature").SetProp("name", GATE_CMD_OUTGOING);
    		out.GetRoot().AppendChild("notify_module", "ntsms");
    
    
    		return out;
    	}
    
    
    	virtual mgr_xml::Xml Ingoing(mgr_xml::Xml& msg) const
    	{
    		mgr_xml::Xml out;
    		return out;
    	}
    
    
    	virtual void Outgoing(mgr_xml::Xml& msg) const
    	{
    		string message = msg.GetRoot().FindNode("message");
    		string project_id = msg.GetRoot().FindNode("project").FindNode("id");
    		string phone = msg.GetRoot().FindNode("user").FindNode("phone");
    		str::inpl::RemoveNonDigit(phone);
    		string sender = GateParam("originator_" + project_id);
    		if (sender.empty())
    			sender = GateParam("originator");
    
    		mgr_rpc::HttpQuery http;
    		http.EnableCookie();
    		http.AcceptAnyResponse();
    
    
    		std::stringstream out;
    		http.Post("http://service.qtelecom.ru/public/http/", "user=" + 
    								str::url::Encode(GateParam("login")) + 
    								"&pass=" + str::url::Encode(GateParam("psw")) + 
    								"&target=" + str::url::Encode(phone) + 
    								"&message=" + str::url::Encode(message) + 
    								"&gzip=none"
    								"&sender=" + str::url::Encode(sender) + 
    								"&action=post_sms", out);
    
    		Debug("response: %s", out.str().c_str());
    
    
    		mgr_xml::XmlString result(out.str());
    		string result_str = result.GetNode("//result/error");
    		if (!result_str.empty())
    			throw mgr_err::Error(result_str);
    	}
    };
    
    } // END NAMESPACE GATE
    
    RUN_MODULE(gate::QTC)
    


    billmgr_mod_gwqtc.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <mgrdata>
      <plugin name="gwqtc">
        <group>gateway</group>
        <author>BILLmanager team</author>
      </plugin>
      <metadata name="gateway.gwqtc">
        <form>
          <field name="login">
            <input type="text" name="login" required="yes" identifier="yes"/>
          </field>
          <field name="psw">
            <input type="password" name="psw" required="yes"/>
          </field>
          <field name="originator" project="yes">
            <input type="text" name="originator"/>
          </field>
        </form>
      </metadata>
      <lang name="ru">
        <messages name="plugin">
          <msg name="desc_short_gwqtc">Q-telecom</msg>
          <msg name="desc_full_gwqtc">Сервер Q-telecom</msg>
          <msg name="price_gwqtc">Бесплатно</msg>
        </messages>
        <messages name="gateway.gwqtc">
          <msg name="login">Логин</msg>
          <msg name="psw">Пароль</msg>
          <msg name="translit">Транслитерация</msg>
          <msg name="originator">Отправитель</msg>
          <msg name="hint_login">Логин в личный кабинет Q-telecomа</msg>
          <msg name="hint_psw">Пароль от личного кабинета</msg>
          <msg name="hint_translit">Транслитерация СМС сообщений при отправке</msg>
          <msg name="hint_originator">Подпись отправителя в СМС</msg>
        </messages>
        <messages name="gateway_include">
          <msg name="module_gwqtc">Сервер Q-telecom</msg>
          <msg name="gwqtc">Q-telecom</msg>
          <msg name="desc_gwqtc">СМС шлюз</msg>
        </messages>
      </lang>
      <lang name="en">
        <messages name="plugin">
          <msg name="desc_short_gwqtc">SMS-center</msg>
          <msg name="desc_full_gwqtc">Server SMS-center</msg>
          <msg name="price_gwqtc">Free</msg>
        </messages>
      </lang>
    </mgrdata>
    


    Makefile
    MGR = billmgr
    PLUGIN = gwqtc
    
    CFLAGS += -I/usr/local/mgr5/include/billmgr
    CXXFLAGS += -I/usr/local/mgr5/include/billmgr
    
    WRAPPER += gwqtc
    
    gwqtc_SOURCES = gwqtc.cpp
    gwqtc_FOLDER = gate
    gwqtc_LDADD = -lmgr -lmgrdb
    gwqtc_DLIBS = gatemodule
    
    BASE ?= /usr/local/mgr5
    include $(BASE)/src/isp.mk
    


    Как мы с вами только что выяснили, относительно примеров изменены всего несколько строк. То есть теперь для написания плагинов хватит и небольшого опыта программирования, а партнёры смогут повысить качество выпускаемых продуктов на основе образцов.
    К слову сказать, нами запланирован запуск магазина модулей, в котором разработанные вами дополнения можно будет бесплатно или за определённые деньги разместить для других компаний.

    Надеемся, эта статья окажется полезной пользователям BILLmanager. Будем очень рады услышать о ваших успехах в описанном процессе.
    ISPsystem
    166.03
    Софт для хостинга: ISPmanager, BILLmanager и др.
    Share post

    Similar posts

    Comments 8

      0
      Это всё хорошо, но когда уже будет реализован полноценный «магазин расширений» (а не те 5 «модулей» которые сейчас есть)?
      Интересует ISPManager 5 в частности.
        0
        На данный момент магазин расширений находится в разработке. Как только мы будем готовы сообщить о дате выпуска — сразу же напишем анонс.
        +1
        Поделитесь пожалуйста опытом.
        У вас такая комплексная система, много продуктов, которые взаимодействуют с друг другом, поддержка разных операционных систем.
        Как вы все это тестируете и поддерживаете в безукоризненном состоянии?
        Что используете и как для этого, может виртуализация, контейнерные технологии?

        Ведь вам необходимо с каждым выпуском убедиться что все в рабочем состоянии, все API работают.
        Трудно в голове охватить весь тот обьем работ по тестированию который надо провести. Любопытно как вы решаете эти проблемы.
          0
          Автоматизируем тестирование, конечно :-) И виртуализацию, разумеется, используем.
          Вы правы, объём одного только регрессионного тестирования колоссален, вручную всего необходимого не охватить. Поэтому у нас в штате достаточно много тестеров-«автоматчиков».
          Надеемся, в ближайшее время соберём материал и напишем статью о том, как у нас в компании поставлен процесс тестирования. Будем рады, если Вы прочтёте этот материал и извлечёте для себя полезный опыт. Будем рады Вашим комментариям, если что. :-)
          0
          Сейчас работаем над тем, чтобы в будущем все разработанные нами плагины регистраторов, платежных систем, итд, были в открытом доступе. То, что уже было разработано, тоже планируется постепенно выкладывать. Отлично будет сочетаться с маркетплэйсом, который уже в разработке, как и сказал Автор.
            0
            EPP, EPP вот я с двумя украинскими регистраторами столкнулся — xml отличаются, кое в чём серьёзно отличаются. как решать?(с)
            Для себя то я, конечно. обошёл это методом неймспейсов и немного логикой, но у всех например отображение баланса может отличаться…
              0
              Если Вы имеете в виду, что многие пишут по-своему, когда есть единый стандарт EPP, то да, мы с Вами согласны. Тоже сталкиваемся с такой же проблемой, когда пишем обработчик нового регистратора на ЕРР. Метод решения «нестыковок» каждый раз свой, смотрим по ситуации.
                0
                Я, собственно по этому взялся писать полностью с нуля панель управления услугами хостинга и регистрацией доменных имен, на RoR с разными интересными плюшками в сторону heroku, например.
                Буду на ОСДН киевском вещать с докладом на тему одной из частей своей панели управления

            Only users with full accounts can post comments. Log in, please.