Как написать модуль оплаты для 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

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


Комментарии ()

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