От тех кто уже наступил на эти грабли тем, кто еще только собирается.
Не так давно яндекс-маркет сделал механизм с покупкой на маркете, не переходя на сайт партнера. Т.е. вы можете выбрать товар на маркете, и тут же его купить. Вернее покупать пока нельзя, можно только сформировать заказ, который упадет в магазин партнера. Далее с вами будут связываться из этого магазина и уточнять детали по заказу.
Собственно магазин должен удовлетворять требованиям маркета, и иметь 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
Перенаправили яндекс на них.
В итоге – когда это безобразие профиксят, и будет действительно работать из коробки, останется только перенаправить яндекс на дефолтную страницу и сменить правила обработки урлов.
странно, что это вообще прошло наружу Станислав Дрёмин,, два раза встречается "Засада номер четыре. ". Возможно, что опечатка и засад пять? За пост спасибо
Засада: при распарсивании ответа сайта-магазина используется Java, а там строго проверяются типы данных. Мне вернулся вот такой ответ в логах ошибок: "Детали ошибки = JSON deserialization error; nested exception is java.io.IOException: attribute id is not numeric or too big". Как оказалось, ID пунктов самовывоза нужно приводить к целым числам.
Всем привет!!! после всех (мытарств)настроек, особенно SSL, т.к. на моем сайте https работает только из под одной папки, борьбы с 301 редиректом, вроде.... А вот и нет нашел траблу а именно отладка выдала: Детали ошибки = validate error: item feedId is null для этого в ym_handler.php, строка 389, меняем $arResult["cart"]["items"][] = 1; на $arResult["cart"]["items"][] = $item; 1С-Битрикс: Управление сайтом 14.0.10
Никак не могу победить яндекс покупки. Запросы приходят в YMHandler Выше уже упоминали цикл foreach ($this->mapDelivery as $deliveryId => $deliveryType)
Как оказалось $this->mapDelivery - пуст. Посмотрел - этот параметр заполняется из настроек магазина, но настройки парсятся без ошибки и никаких упоминаний о DELIVERIES (из которых заполняется mapDelivery) там нет. Может быть кто-то знает - как эти данные в настройки положить или исходя из чего они заполняются?
Ну ежели ничего в последних версиях не меняли, то настройки все здесь bitrix/admin/sale_ymarket.php?lang=ru, а службы доставки берутся из соответствующего раздела это формы, а те - из списка настраиваемых служб доставки в разделе настроек магазина
А кто-нибудь сделал в Покупках-на-Маркете автоматизированные службы доставки? Вот так Битрикс отвечает на post запросы API если там автоматизированная служба: {"cart":{"items":[],"paymentMethods":[],"deliveryOptions":[]}}
Белоусов Юрий, А как Вам удалось впихнуть туда автоматическую службу доставки? у меня предлогает только настраеваеые службы? поделитесь? если не секрет...
URL = /bitrix/services/ymarket/cart Детали ошибки = 301 Moved Permanently
как решали подобную проблему?
точно такая же проблема. при попытке сделать правило указанное в данной теме - ничего не получается. Возможно я не правильно делаю "правила". Так как автор не указал что прописывать в "Условии".
Группы на сайте создаются не только сотрудниками «1С-Битрикс», но и партнерами компании. Поэтому мнения участников групп могут не совпадать с позицией компании «1С-Битрикс».