Как написать модуль оплаты для Minishop2

Привет всем :). Я не с первого раза разобрался как написать модуль оплаты для Minishop2. Поэтому решил сделать небольшую инструкцию. Не во всем правда разобрался, но надеюсь в комментариях подскажут.

Для модуля оплаты нужны всего 2 файла:
1) /core/components/minishop2/custom/payment/you_name.class.php
В нем минишоп вызывает метод
public function send(msOrder $order)
	{
		$link = $this->getPaymentLink($order);
		return $this->success('', array('redirect' => $link));
	}
Получает ссылку 'redirect' => $link и по этой ссылке яваскрипт минишопа отправляет на страницу провайдера оплаты. В стандартном варианте ссылка содержит GET параметры такие как сумма, номер заказа, код магазина и т.д.

2) /assets/components/minishop2/payment/you_name.php
На этот файл приходит ответ об успешной оплате. После проверки ответа просто подключаем минишоп
$miniShop2 = $modx->getService('minishop2');
$miniShop2->loadCustomClasses('payment');
и ставим статус оплачен
if(!$order = $modx->getObject('msOrder', array('num'=>$_POST['orderid']))){
	      echo "Error! order not found.";
	      exit;
	  }
$miniShop2->changeOrderStatus($order->id, 2);

С упаковкой в компонент несколько сложнее. Я тут не разобрался как закинуть эти файлы в папки минишопа. В build.transport.php добавил
$root = dirname(dirname(__FILE__)) . '/';
$vehicle->resolve('file', array(
    'source' => $root . 'assets/components/minishop2/payment',
    'target' => "return MODX_ASSETS_PATH . 'components/minishop2/';",
));
$vehicle->resolve('file', array(
    'source' => $root . 'core/components/minishop2/custom/payment',
    'target' => "return MODX_CORE_PATH . 'components/minishop2/custom/';",
));
unset($root);
Но при удалении компонента удаляются и эти папки минишопа :(. Можно закидывать эти файлы в папки минишопа после установки компонента ресолвером, но не знаю как лучше. Подскажите плиз.

Я делал модуль оплаты для paykeeper.ru/. У них нельзя отправить на оплату ссылкой с GET параметрами. Предлагают загружать POST форму на сайт. Пришлось писать сниппет, загружающий эту форму, и редиректить на него с минишопа.

Для примера код моего компонента mspPayKeeper
https://github.com/touol/mspPayKeeper

Если разобраться то все легко, но как часто бывает нет ни описаний ни прмеров кода и приходиться идти и искать то не знаю что.
Может кто-нибудь выложит код бесплатного компонента оплаты, чтоб можно было посмотреть и разобраться как лучше сделать?
Александр
08 апреля 2018, 23:44
5
672
+7

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

Pavel Zarubin
09 апреля 2018, 04:24
0
Использовать custom папку минишопа это плохая практика, в минишопе с четвертой версии появились такие понятия как плагины.
У них нельзя отправить на оплату ссылкой с GET параметрами. Предлагают загружать POST форму на сайт
Очень в этом сомневаюсь, иначе как например пользователю у которого прервался интернет/выключили свет продолжить оплату? Если действительно так, то печально и стоило бы написать в ТП paykeeper
    Иван Климчук
    09 апреля 2018, 10:52
    0
    Дополню, что не плагины, а сервисы. А вот тут о том, как они подключаются. docs.modx.pro/components/minishop2/development/service/connection
      Александр
      09 апреля 2018, 21:15
      0
      Как зарегистрировать сервис при установке компонента? Чтоб потом не сломалось.
        Иван Климчук
        09 апреля 2018, 21:17
        0
        Ну а ссылка зачем? Читайте внимательно.
          Александр
          09 апреля 2018, 21:30
          0
          Не поверите читал :). Заснуть $miniShop2->addService в ресолвер https://github.com/touol/mspPayKeeper/blob/master/_build/resolvers/resolve.tables.php
          после case xPDOTransport::ACTION_INSTALL:?
            Иван Климчук
            10 апреля 2018, 00:05
            0
            Зачем это добавлять в резолвер, который по названию вообще занимается созданием таблиц?
            У меня это отдельный резолвер, в котором происходит только регистрация сервиса при установке. И важное замечание — удаление сервиса при удалении пакета. Чтобы потом не чистить руками хлам после удаление пакетов горе-авторов (случалось уже не единожы, речь не о вас) :)
            gist.github.com/Alroniks/dc1c03ac87bc7e5ff92afe3011227f54
    Александр
    10 апреля 2018, 00:46
    0
    Очень в этом сомневаюсь, иначе как например пользователю у которого прервался интернет/выключили свет продолжить оплату? Если действительно так, то печально и стоило бы написать в ТП paykeeper
    Возобновить оплату можно. Минишоп при оплате и при возобновлении отправляет на страницу со снипетом который POST форму подгружает.
      Pavel Zarubin
      10 апреля 2018, 01:30
      0
      Это какое то откровенное извращение
Иван Климчук
09 апреля 2018, 10:53
+2
Какая-то заметка получилась сумбурная. Куча примеров кода без объяснения и, видимо, местами без понимания всего процесса. Но начало хорошее, стоит поглубже разобраться и дело пойдет.
    Александр
    09 апреля 2018, 21:13
    0
    Убрал кучу кода из заметки :). Потратил час, поставил гит и и залил код на гитхаб. Так лучше выглядит :).