Тут будет речь о том как сделать свой плагин оплаты для CMS webasyst и какие трудности возникают у разработчика и как их решать.
Итак решили мы попробовать создать плагин оплаты для удаленного пробития чеков в CMS Webasyst и вот как шел процесс.
Примечание: надо отметить, что в нашем случае имеется ввиду фискализация чека при оплате наличными, то есть мы не являемся полноценной платежной системой как вы понимаете. И в этом была наша ошибка, плагин оплаты это для режима оплаты в облаке, а у нас режим товароучетки , смотрите здесь АПИ для Вэб разработчиков. Но тем не менее плагин оплаты мы сделали и может кому пригодится на будущее.
Мы все делали по виндой 10.
Версия Webasyst 2.9.9.828
Версия PHP 8.0.30
Версия Shop-Script 10.1.2.1713435439
VS Code xDebug используем для отладки php.
Итак мы все отлаживаем на своем компьютере через localhost. Установили apache, mysql, php, phpmyadmin (тут все банально). Кстати использовали некий удобный установщик xampp, который удобен тем, что быстро устанавливает данный стандартный набор программ. И еще нам например удобно,что apache и др. не стартуют автоматом при загрузке ПК, то есть мы их запускаем, когда непосредственно надо поработать с webasyst:
Задача нашего плагина в первом представлении предоставить пользователям webasyst интерфейс, чтобы посылать чеки для фискализации на удаленном кассовом аппарате в вашем офиса или на ферме в интернете и получать ответ как пробит чек успешно или нет (с указанием ошибки).
Тут конечно приходит в голову только создание плагина оплаты webasyst. Поскольку мы ещё не создавали никаких плагинов для CMS я расскажу все нюансы и заблуждения, которые нас постигли, думаю это будет интересно для тех, кто захочет сделать плагин как и мы в первый раз.
Кстати документация по созданию плагинов оплаты на сайте webasyst есть.
Для создания нового плагина лучше выполнить консольную команду, это сразу создать шаблон плагина с нужными папками и начальными настройками и плагин был увиден корректно CMS :
echo off
SET PATH=%PATH%;k:\\xampp\\php;
php.exe wa.php createPlugin shop myplugin -name 'My plugin' -version 1.0.0 -vendor 123456 -frontend -settings
pause
Тут надо обратить внимание на название самого плагина blogMyplugin2Plugin.class.php. Дело в том, что это синтаксически правильное название, но в документации встречаются и другие варианты (так нам показалось).
Итак первое, что вам захочется это проверить работу плагина и вызвать какой-нибудь его метод.
Заблуждения со Smarty
Webasyst использует некий шаблонизатор Smarty для включения в содержание страниц вашего php кода.
Сразу чтобы не искать можно ознакомится здесь https://www.smarty.net/docsv2/ru/language.function.if.tpl
Итак пример как у нас заработал плагин, то есть на странице приложения blog мы создали страницу, где протестировали вызов статического метода плагина:
так не работает
{if $wa->blog->pluginAvailable('blogBitdrvkktPlugin')}
{"доступен плагин blogBitdrvkktPlugin"}
{else}
{"не доступен плагин blogBitdrvkktPlugin"}
{/if}
так работает
{if $wa->blog}
{if method_exists('blogBitdrvkktPlugin', 'test')}
{"найден blogBitdrvkktPlugin метод test"}
{blogBitdrvkktPlugin::test()}
// только статический метод вызывается
{else}
{"не найден blogBitdrvkktPlugin метод test"}
{/if}
{else}
{"не найден $wa->blog"}
{/if}
Поначалу с непривычки мы долго бились с этой простой задачей, почти день. Единственное чего добились это вызов статического метода плагина работает, а вот обычный метод класса плагина вызвать не получается (смотрите дальше).
Примечание: можно создавать и тестить shop плагин, это тот же самый плагин, но для приложения shop. Но мы сначала почему-то решили внедрять свой плагин в blog. Webasyst тоже рекомендует начинать с этого. А еще оказывается можно создавать свой плагин и в папке wa-plugins\payment, так например делают Юкасса, payanyway и т.д. и все варианты будут работать. Отличие создания в папке wa-plugins в том,что для плагин нет привязки к конкретному приложению, то есть можно юзать везде где захочется.
Далее вам надо как-то отключать/включать (в.т.ч и созданные вручную) , устанавливать/удалять плагины, это здесь:

Изоляция или защита правки базы данных пользователем
Речь о том, что обычный метод класса плагина вызвать через smarty пользователем в какой-то форме - нельзя (только если метод статический). Мы долго бились над этим не понимая ничего и только включив лог увидели в файле error.log ошибки типа:
blogBitdrvkkt: вызов неизвестного метода waPluginViewHelper->some_test() с аргументами []
Это для smarty конструкции:
{$wa->blog->blogBitdrvkktPlugin->some_test()}
{$wa->blog->Bitdrvkkt->some_test()} - так ошибка сразу, что Bitdrvkkt это null !!
То есть метод some_test есть в классе blogBitdrvkktPlugin , но видно что обращение идет даже не к классу blogBitdrvkktPlugin , а к некоему классу waPluginViewHelper.
Короче говоря оказываеся, что парадигма такая: есть приложение например blog и есть у нас плагин для приложения blog , называется blogBitdrvkktPlugin.
blogBitdrvkktPlugin может перехватывать только некоторые вызовы (хуки) из blog , которые объявлены в приложении blog. И только в этих хуках можно что-то выполнять какой-то php код. Описание хуков на сайте webasyst есть, но мы например нашли все хуки глобальным поиском в каталоге blog по фразе:
)->event(
и нашли в приложении blog например backend_post_edit , это хук при сохранении изменений в записи блога.
Хуки приложения blog мы нашли например здесь: https://developers.webasyst.ru/hooks/blog/ .
Чтобы backend_post_edit срабатывал надо его объявить в blogBitdrvkktPlugin, а именно в файле lib/config/plugin.php:
'БИТ драйвер ККТ',
'description' => 'Удаленная фискализация чеков на кассе в вашем офисе',
'icon' => 'img/panda-100x100.ico',
'logo' => 'img/logo-square-4x4.png',
'vendor' => '1267357',
'version' => '1.0.0',
'locale' => array('ru_RU',),
'handlers' => array(
'evt_fiscal_receipt' => 'fiscalReceipt',
'view_helper_call' => 'viewHelperCall',
'blog_save' => 'blogSave',
'comment_save_backend' => 'commentSaveBackend',
'comment_save_frontend' => 'commentSaveFrontend',
'backend_comments' => 'backendComments',
'backend_post_edit' => 'backendPostEdit',
'frontend_post' => 'frontendPost',
'blogDelete' => 'blogDelete'
),
//'type' => waPayment::TYPE_ONLINE,
);
B реализацию метода backendPostEdit надо сделать в классе плагина (blogBitdrvkktPlugin). И тогда вы увидите (в error.log), что при сохранении записи в блоге у вас будет вызываться backendPostEdit.
class blogBitdrvkktPlugin extends blogPlugin
{
.......
public function backendPostEdit($params=[])
{
waLog::log("backendPostEdit Ura! called...");
}
........
Таким образом пользователь не может напрямую вызвать методы вашего плагина через smarty конструкцию {...}, и это есть хорошо. Но теперь мы жестко ограничены набором хуков для взаимодействия с плагином.
Как создать таблицу базы данных при инсталляции плагина
Следующая возможно задача возникнет как добавить таблицу к базе данных, которая будет обслуживать нужды плагина.
Для это создаем файл install.php и прописываем создание таблицы примерно таким образом:
query('SELECT `hash` FROM `blog_bitdrvkkt_receipts` WHERE 0');
}
catch (waDbException $e)
{
//$model->exec('CREATE TABLE `shop_product` ADD `custom_field` INT(11) UNSIGNED NULL DEFAULT NULL');
$sql = <<query($sql);
waLog::log('install.php '.$sql);
}
install.php будет вызываться только при начальной установке плагина. Соответственно если надо заново вызвать установку плагина, то сначала плагин удаляется (перед этим скопируйте его папку куда-нибудь). Потом после удаления, восстановите папку обратно и процедура установки автоматически произойдет сама (это для localhost развлечений).
Примечание: файл db.php это настройки соединения с базой данных, если она другая не webasyst (по умолчанию).
Как добавить способ оплаты
Как понятно из логики: оплата заказа происходит раньше, потом нужна фискализация чека на кассовом аппарате. возможно, что в магазине shop вы сможете установить много способов оплаты, но будет отображаться только Яндекс касса например. В чем нюанс?
Первое, что надо проверить это настройки витрины. В самом низу есть

Как видно, у нас только два способа оплаты, при условии,что реально установлено намного больше. Почему?
Ответ для новичков просто - смотрите настройки shop script примерно на странице http://localhost/wa/webasyst/shop/?action=settings#/payment/ или проще как на картинке здесь:

Надо отметить, что теперь плагины оплаты располагаются в отдельной глобальной папке wa\wa-plugins\payment .
Промежуточные выводы
Для создания своего плагина самый простой способ это тупо скопировать чужой, например из папки wa-plugins\payment\yandexkassa сделаем копию и реализуем свой функционал.
Отладка
Итак следующий логичный шаг это задействовать отладку в php коде (сервера, ведь php выполняется на сервере).
Оказывается это возможно и даже не трудно настроить с xDebug и VS Code, смотрите здесь PHP.
Теперь мы можем отловить запросы к серверу, когда задействуется плагин, какие классы и методы используются.
И первое, что мы выяснили это checkout действие, которое вызывает принятие заказа к исполнению и первое это вызов соответствующего плагина для оплаты, а именно метода payment в плагине.
Отладка удобна тем, кто не любит читать инструкций, а смотрит сразу в код., в суть происходящего. К тому вся прелесть этого процесса ещё и в том, что он бесплатный.
Такой приличный облом
На практике оказалось, что АПИ оплат в Webasyst предназначена исключительно для покупателей, то есть покупатель инициирует все действия по оплате. В случает оплаты наличными (то есть в нашем случае) оплату фиксирует продавец и этого АПИ в Webasyst уже нет.
Можно городить свой огород, но мы пошли другим путем, а именно опубликовали свой АПИ для CMS, который управляет оборудованием из браузера и отдали разработчикам разных CMS на откуп, чтобы они сами реализовывали свои плагины оплат для разных CMS. Оказывается такое возможно и теперь по факту мы взяли на себя все проблемы с фискализацией чеков, а также все проблемы с настройкой кассовых аппаратов.
То есть получается четкое разделение: ваша CMS и наш функционал по фискализации чеков.
Купить новую лицензию (25 999,35 руб., скидка 35%)
Через некоторое время, а именно в августе того же года (2024). Получаем сообщение, что лицензия закончилась. И все бы ничего, но это на локалхосте. И далее разрабатывать плагин уже не получается (в отличии от вордпресса например, где базовый функционал бесплатен).

Единый драйвер для ккт и банк.терминалов
Представляем наш драйвер для фискализации чеков и принятия банковских карт: АПИ для web разработчиков