От тех кто уже наступил на эти грабли тем, кто еще только собирается.
Не так давно яндекс-маркет сделал механизм с покупкой на маркете, не переходя на сайт партнера. Т.е. вы можете выбрать товар на маркете, и тут же его купить. Вернее покупать пока нельзя, можно только сформировать заказ, который упадет в магазин партнера. Далее с вами будут связываться из этого магазина и уточнять детали по заказу.
Собственно магазин должен удовлетворять требованиям маркета, и иметь 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
Перенаправили яндекс на них.
В итоге – когда это безобразие профиксят, и будет действительно работать из коробки, останется только перенаправить яндекс на дефолтную страницу и сменить правила обработки урлов.
Еще проблема: В Битрикс не предусмотрена работа и расчет стоимости доставки через автоматизированные службы доставки. Только через "настраиваемые". По моему обращению создали заявку на разработку этого функционала. И как всегда уточнили: "ХЗ когда реализуем".
301 ошибка лечится убиранием подстановки слеша в конце в .htaccess. Но тогда не будет нужного редиректа в чпу для публички и чпу страницы без слеша на конце будут отдавать 404 ошибку.
Дмитрий Караваев написал: sh1 ключ? доступ по https? сертификат? токены и идентификаторы, все правильно сделано и заполнено?
sh1 ключ? - да, https - есть, сертификат - самоподписанный, токены и индентификаторы - заполнены согласно инструкции. ТП написала, что исправили ошибку на моем сайте, а че за ошибку, я хз, сейчас буду выяснять.
Если бы все. Есть еще 2 глобальных проблемы: 1. Не передаются данные о заказчике. В битриксе создается пустой анонимный пользователь и на этом все. 2. Товар добавляется без учета действующих на него скидок. Не находили решений этого? Битрикс обещает пофиксить в новых обновлениях, но это еще когда будет.
Подскажите, как решить проблему округления цен для "Покупки на маркете"? А конкретно скидок. В каком файле происходит формирование данных о ценах для Покупок на маркете?
Кто-нибудь сталкивался с проблемой отмена заказа с маркета на стороне сайта? Изменяю статус заказа/меняю флаги, никакой информации в маркет от сайта не уходит, собственно заказы так и продолжают висеть в маркете "в обработке". В чем может быть причина?
Филатов Тимур, У вас магазин обновлен до последней версии? Я как то сталкивался с тем, что в файлах для маркета используются старые события от магазина
Дрёмин Станислав, 16.5.6 стоит. В обработчике ym_handler вижу события типа "OnSaleStatusOrder". Я так понимаю, это как раз и есть старые события? Галочка "включить поддержку устаревших" в данном моменте не помогает?
Филатов Тимур, да, это старые события. Вам надо попробовать включить галку и залогировать эти места с событиями. Ежели там ничего не будет, значит надо перестраивать на новые события.
По поводу проблемы №2 (я столкнулся только с ней) - можно сделать 1 правило #^/bitrix/services/ymarket/# с файлом /bitrix/services/ymarket/index.php , этого будет достаточно, плюс такое правило универсально.
Станислав, день добрый. Не подскажите что может быть? Тестовый заказ получаю на сайт, все приходит норм. При попытке поменять статус заказ, допустим на Выполнен в Яндексе не меняется статус, остается в обработке.
Группы на сайте создаются не только сотрудниками «1С-Битрикс», но и партнерами компании. Поэтому мнения участников групп могут не совпадать с позицией компании «1С-Битрикс».