От тех кто уже наступил на эти грабли тем, кто еще только собирается.
Не так давно яндекс-маркет сделал механизм с покупкой на маркете, не переходя на сайт партнера. Т.е. вы можете выбрать товар на маркете, и тут же его купить. Вернее покупать пока нельзя, можно только сформировать заказ, который упадет в магазин партнера. Далее с вами будут связываться из этого магазина и уточнять детали по заказу.
Собственно магазин должен удовлетворять требованиям маркета, и иметь SSL.
В Битриксе из коробки есть механизм интеграции с этой программой. Наблюдать его можно в админке -> магазин -> настройки -> покупки на маркете. Там формочка с настройками по каждому сайту. До нее нужно настроить форму в кабинете маркета и получить ключи. А механизм настроек со стороны Битрикс описан в курсе http://dev.1c-bitrix.ru/learning/cour....4828.5802
Пройдемся по настройкам в личном кабинете маркета.
URL ресурса партнерского API Яндекс.Маркета – оставляем как есть.
Токен для запросов Яндекса к магазину – token, который мы получали в яндексе – access_token.
Авторизационный токен (для запросов магазина к Яндексу) – см. выше.
Идентификатор приложения – то, что получили при регистрации приложения.
Остальные настройки понятны и без комментов.
Сохраняем форму и, казалось бы, наступит счастье. Однако…
Вместо счастья начинается череда засад, не зная про которые можно долго блуждать по инету и в исходниках модуля sale.
Засада номер раз. Она не критична с точки зрения разработки, но критична для юзабилити. Ежели мы, после настроек, нажмем «сохранить» или «применить», то все сработает как надо. Но ежели сделать F5, форма окажется пустой. Я раза 3 пересохранял настройки пока на залез в b_option. Там под NAME = yandex_market_purchase_settings будет лежать сериализованный массив настроек этой формы. Пройдя в /bitrix/modules/sale/admin/ymarket.php увидим примерно на 17 строке $arYMSettings = $_POST["YMSETTINGS"]; - это нормально, а не нормально, что нигде нет вызова этих настроек через getOptionString. Думаю разработчики Битрикс сие безобразие исправят.
Ну ладно, настройки-то в итоге сохраняются, значит все норм.
Однако…
Засада норме два. Идем в кабинет маркета, пробуем сделать тестовую покупку и получаем отлуп от яндекса в виде ошибки 404. Согласно доков, Яндекс ломится на страницу https://site.ru/bitrix/services/ymarket/cart, но такой страницы действительно нет на сайте. И правил под нее тоже никаких. Кроме того, у апача есть особенность подставлять слеш в конец строки если не указано расширение файла. Апач считает это разделом на сайте, подставляет в конец урла слеш и мы попадаем на 404. Выход – идем в админку сайта –> настройки -> обработка адресов -> правила обработки. И там указываем правила на три запроса от яндекса: правило - #^/bitrix/services/ymarket/cart#, файл - /bitrix/services/ymarket/index.php, так же и для запросов /order/status и /order/accept. В итоге все запросы от яндекса должны переправляться в файл /bitrix/services/ymarket/index.php.
Засада номер три. При следующей тестовой покупке сайт ничего не вернет, на что яндекс и будет материться. Идем в файл /bitrix/modules/sale/services/ymarket/index.php. Там есть интересные строчки
Однако сколько ни пытайся трейсить $_REQUEST, $_POST и $_GET – ничего не увидишь. И это логично, ибо, все данные от яндекса лежат в $HTTP_RAW_POST_DATA в виде json. Вот с ней и надо работать.
Засада номер четыре. После подстановки нужных значений в $YMHandler->processRequest() все вроде бы должно работать. Идем в это модуле в файл /general/ym_handler.php, ищем метод getDeliveryOptions, в нем foreach ($this->mapDelivery as $deliveryId => $deliveryType) В mapDelivery настройки попадают из __construct в котором получаются через getSettings().
Все бы ничего, если у вас 1 или 2 сайта на лицензии. Но когда их с десяток, то массив с настройками не полностью сохраняется в базу. Он обрезается до 2000 символов. И при unserialize получаем false и Notice: unserialize(): Error at offset 1995 of 2000 bytes. Решение – класть настройки для каждого сайта в отдельную строку в b_option.
Засада номер пять. Кроется она в методе getDeliveryOptions() По докам яндекса, если у товара имеется доставка типа PICKUP, в ответном массиве должен быть ключ outlets => array(array('id'=>1)), id в общем вроде бы не важен, должен браться из настроек магазина, из кабинета маркета, но можно передать и сразу. Но этот ключ должен быть обязательно и иметь такую структуру.
Пожалуй это пока все засады, которые я знаю про эту фичу.
Как это вылечили.
Сделали свою страничку в админке с настройками, настройки кладем по каждому сайту в отдельную строку в b_option.
Сделали свои странички php_interface: ym_buy_init.php – кастомизированный /bitrix/modules/sale/services/ymarket/index.php и ym_buy_handler.php – кастомизированный /sale/general/ym_handler.php
Перенаправили яндекс на них.
В итоге – когда это безобразие профиксят, и будет действительно работать из коробки, останется только перенаправить яндекс на дефолтную страницу и сменить правила обработки урлов.
Группы на сайте создаются не только сотрудниками «1С-Битрикс», но и партнерами компании. Поэтому мнения участников групп могут не совпадать с позицией компании «1С-Битрикс».