Страницы

Поиск по вопросам

суббота, 14 декабря 2019 г.

Битрикс и Яндекс касса , почему разные номера заказов

#битрикс #яндекс


Доброго времени суток ! На сайте реализована многосайтовость, два ИМ на которых можно
оформлять заказы, подключена яндекс касса. В аккаунте яндекс кассы прописаны ссылки:

Check URL https://site1.ru/bitrix/tools/sale_ps_result.php

Aviso URL https://site1.ru/bitrix/tools/sale_ps_result.php

Success URL http://site1.ru/bitrix/tools/sale_ps_success.php

Fail URL http://site1.ru/bitrix/tools/sale_ps_fail.php


т.е ссылки от первого сайта, когда клиент делает заказа на втором сайте site2.ru
то в случае успешной оплаты соответственно от попадает на site1.ru , мне нужно сделать
перенаправление на site2.ru т.е на тот сайт в котором был сделан заказ. 

В файле /bitrix/tools/sale_ps_success.php я хочу сделать редирект , как мне показалось
что это можно сделать получив ID заказа из URL который формирует яндекс касса в случае
успешной оплаты, в котором есть параметр orderNumber=273 . Но заметил что номер заказа
в яндекс кассе не совпадают с номером заказа на сайте. К примеру если а ЯК это 273
то на сайте 280 . 
И итог того что хочу сделать:
Получить номер заказа из URL, в файле sale_ps_success.php проверить  какому сайту
пренадлежит заказ и сделать редиррект на нужный сайт https://site2/personal/order/make/?ORDER_ID=".$OrderID

Кто нибудь сталкивался с подобным? Почему номера заказов разные?  

По совету Mihanik71  использовать класс Bitrix\Sale\Internals\PaymentTable оказалось
верным решением за что ему большое спасибо, ниже пример кода который в файле(sale_ps_success.php)
я запилил у себя на сайте:



   $orderNumbder = $_GET['orderNumber']; // тут приходит номер оплаты 


CModule::IncludeModule("sale");
 c
$obj = new Bitrix\Sale\Internals\PaymentTable; // класс с помощью которого можно
вытащить id заказа, был обнаружен с помощью модуля live ip

$shimpentCode = $obj->getlist(array('select' => array('ID','ORDER_ID'),'filter' =>
array('ID' => $orderNumbder)))->fetch();

$SiteOrder = CSaleOrder::GetByID($shimpentCode['ORDER_ID']); // вытаскиваем свойства
заказа, нас интересует поле LID

$SiteID = $SiteOrder['LID']; // id сайта на котором была покупка 

$OrderID = $shimpentCode['ORDER_ID'];

$successUrl = "";
// простое условие , выбираем куда редиректить покупателя 
if($SiteID == 's1'){
   $successUrl = "https://site1.ru/personal/order/make/?ORDER_ID=".$OrderID . "&PAY=Y";
// параметр PAY=Y добавил для своих нужд   
}
if($SiteID == 's2'){
   $successUrl = "https://site2.ru/personal/order/make/?ORDER_ID=".$OrderID . "&PAY=Y";
}


$successPath = COption::GetOptionString("sale", "sale_ps_success_path", "/");

   if(!empty($successUrl)){
      LocalRedirect($successUrl);   
   }
}

    


Ответы

Ответ 1



Есть класс Bitrix\Sale\Internals\PaymentTable там по номеру оплаты поле ID можно получить номер заказа ORDER_ID.

Ответ 2



Ваше решение не совсем верно с точки зрения нового ядра D7 Битрикс. Нежелательно использовать API старого ядра, когда есть аналоги нового. К тому же было бы неверно использовать Bitrix\Sale\Internals\PaymentTable, потому что нет гарантий, что данное поведение функции сохраниться в дальнейшем, а именно: Подпространство Bitrix\Sale\Internals содержит классы для работы с таблицами модуля Интернет-магазин. Важно! Прямое использование данных классов не рекомендуется и совместимость не гарантируется. https://dev.1c-bitrix.ru/api_d7/bitrix/sale/internals/ Гораздо лучше использовать доступные публичные статические методы: //Вместо CModule::IncludeModule("sale"); \Bitrix\Main\Loader::includeModule('sale'); //Вместо создания объекта класса Bitrix\Sale\Internals\PaymentTable $payment = \Bitrix\Sale\Payment::getList( array( "filter" => array('ID' => $_GET['orderNumber']), "select" => array('ORDER_ID') ) ); $paymentFields = $payment->fetch(); //Поднимаем объект заказа по id $order = \Bitrix\Sale\Order::load($paymentFields['ORDER_ID']); //Получаем поле 'LID' $SiteID = $order->getField('LID'); //'ID' заказа можно получить и из заказа тоже, например: $OrderID = $order->getId() $OrderID = $paymentFields['ORDER_ID']; $successUrl = ""; // простое условие , выбираем куда редиректить покупателя if($SiteID == 's1') { $successUrl = "https://site1.ru/personal/order/make/?ORDER_ID=".$OrderID . "&PAY=Y"; // параметр PAY=Y добавил для своих нужд } if($SiteID == 's2') { $successUrl = "https://site2.ru/personal/order/make/?ORDER_ID=".$OrderID . "&PAY=Y"; } if(!empty($successUrl)) { LocalRedirect($successUrl); } Можно еще и $_GET['orderNumber'] через API получать, но это уже так, легкое ООП извращение: $request = \Bitrix\Main\Context::getCurrent()->getRequest(); $request->get("orderNumber");

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

Отправить комментарий