MiniShop2: Paypal и разные контексты на сайте

Здравствуйте!

Вводное:

У меня есть сайт-магазин. На сайте два языка, сделано через контексты: site.ru и site.ru/en/ и Babel. На сайте есть система приема платежей Paypal, она подключена и работает на первом контексте, но не работает на втором. У PayPal'а стоят в настройках админки нужные страницы: ms2_payment_paypal_success_id и ms2_payment_paypal_cancel_id.

Проблема:

Если клиент на английской части сайта что-то покупает, его пересылают на гейт пейпала, там всё тоже окей, но вот обратно он приходит на неправильный адрес:
site.ru/en/assets/components/minishop2/payment/paypal.php?action=succses&token=EC-000000&PayerID=0000000000 — что вызывает 404 ошибку и платеж НЕ проходит.



Вопрос:

1. Как указать PayPal'у что с английского контекста он должен переходить на site.ru/assets/ а не site.ru/en/assets/?
2. Как прописать страницы для английского контекста о статусах «оплачен» или «отменен»?

Дополнительно:

По поводу второго вопроса: я пытался для контекста создать свои настройки, но из-за того что в оригинале «Тип поля» стоит «numbfield» — настройку не сохранить, отказывается наотрез.

Так же в .htaccses прописано:
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(ru|en)/assets(.*)$ assets$2 [L,QSA]
Попытки прописать редирект не помогают. Я плохо знаю синтаксис, может я что-то не так делаю.

Я подозреваю что это одна строка в htaccses, но у меня не получается. :(

Технические данные:

MODX Revolution 2.4.2-pl (traditional)
PHP Version 5.4.44-1+mh1
miniShop2 2.2.0-pl2
Scorp Satex
03 декабря 2015, 14:42
modx.pro
1
2 107
0

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

Andrei D.
03 октября 2016, 06:40
0
Даже если в paypal.class.php захардкодить $paymentUrl, то возвращает пустую страницу для других языков :/
    Andrei D.
    03 октября 2016, 07:29
    0
    оу… нашел решение:
    1. захардкодить $paymentUrl в paypal.class.php в папке core/components/minishop2/custom/payment
    $paymentUrl = 'http://сайт.com/assets/components/minishop2/payment/paypal.php';
    2. в assets/components/minishop2/payment/paypal.php добавить перед $success id страниц отмены
    if ($context == 'web') {
        $makeId = '277';
    } elseif ($context == 'ru') {
        $makeId = '278';
    }
    3. заменить на
    if ($id = $modx->getOption('ms2_payment_paypal_cancel_id', null, 0)) {
    $cancel = $modx->makeUrl($makeId, $context, $params, 'full');
    }
      Scorp Satex
      03 октября 2016, 11:12
      0
      Мой знакомый программист нашел решение так:

      Вот что он мне оставил, может кому пригодится, актуально только для MiniShop2 2.2!

      Описание проблемы:

      1) Инициализация оплаты происходит по прямой ссылке paypal.php, вне зависимости от языковой версии.
      2) При запросе paypal.php в контексте /en/* файл физически отсутствует на сервере и выдается ошибка 404. Так как информация запроса передается методом POST редирект в .htaccess файле не может помочь с этой проблемой. Возможно создание «симлинка» или копии файла paypal.php с физическим созданием папки /en/* на сервере, но при этом решении нужно изменять условия редиректов движка ModX с самыми интересными последствиями.
      3) В условиях редиректов успешной и не успешной оплаты используется конструкция $modx->getOption('ms2_payment_paypal_success_id', null, 0) без указания контекста (языковой версии). При этом получение параметров cancel английской версии не работает.
      4) paypal.class.php — файл отвечает за отправку и получение результатов с платежного шлюза. Файл при вызове не содержит информацию языковой версии, поэтому формирование платежной ссылки, а также распознавание результата (hash верификация) проходят только в рублях

      Решение:

      [index.php]

      # Самое начало сайта

      if(substr($_SERVER['REQUEST_URI'], 0, 50) == "/en/assets/components/minishop2/payment/paypal.php"){
      $ch = curl_init();
      $postvars = '';
      foreach($_POST as $key=>$value) {
      $postvars .= $key. "=". $value. "&";
      }

      $url = «site.ru».substr($_SERVER['REQUEST_URI'], 3)."&isEng=1";
      curl_setopt($ch,CURLOPT_URL,$url);
      curl_setopt($ch,CURLOPT_RETURNTRANSFER, true);
      curl_setopt($ch,CURLOPT_FOLLOWLOCATION, true);
      curl_setopt($ch,CURLOPT_POST, 1);
      curl_setopt($ch,CURLOPT_POSTFIELDS, $postvars);
      curl_setopt($ch,CURLOPT_CONNECTTIMEOUT ,3);
      curl_setopt($ch,CURLOPT_TIMEOUT, 20);
      $response = curl_exec($ch);

      curl_close ($ch);
      echo $response;

      die();
      }

      # Описание:

      Если ссылка на paypal.php содержит /en/ мы переадресуем этот запрос на /web/ контекст передавая в $_GET запросе дополнительный параметр "&isEng=1". Информацию POST мы передаем в том же виде, как она поступила. Ждем результат выполнения запроса и выводим его на экран. Если приходит редирект — следуем редиректу.
      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
      3