Процедура оформления заказа

Шаги, необходимые для оформления заказа

Для оформления заказа требуется

  1. Подключить скрипт PayQR на странице магазина
  2. Разместить кнопку PayQR с необходимыми параметрами заказа на странице магазина
  3. Добавить обработчик уведомлений PayQR на сервере магазина

1. Подключить скрипт PayQR на странице магазина

Для подключения скрипта PayQR к интернет-сайту скопируйте в секцию head подключаемого интернет-сайта сгенерированный код из личного кабинета. Найти его можно в разделе «Магазины» на странице подключаемого «Магазина» на вкладке «Техническая интеграция». В коде скрипта будет присутствовать уникальный номер подключаемого «Магазина».

Пример:  

<head>
  ...
  <script src="https://payqr.ru/popup.js?merchId=000000-00000" charset="utf-8"></script>
<head>
<body>
  ...
</body>

2. Разместить кнопку PayQR с необходимыми параметрами заказа на странице магазина

Разместите коды кнопок PayQR везде, где вы хотите предоставить возможность посетителям быстрее покупать товары/услуги. Для интернет-магазинов лучше всего подойдет комплексное размещение кнопки PayQR – на карточках товаров на главной странице, на страницах товаров и в корзине для покупки нескольких товаров.

Если для оформления заказа требуется фамилия покупателя, то достаточно установить data-lastName-required = "required" в кнопке или настроить в Личном кабинете опцию "Получить фамилию покупателя". Аналогично, если для оформления заказа требуется имя покупателя, то достаточно установить data-firstname-required = "required" в кнопке или настроить в Личном кабинете опцию "Получить имя покупателя".

Если для оформления заказа требуется телефон покупателя, то достаточно установить data-phone-required = "required" в кнопке или настроить в Личном кабинете опцию "Получить номер телефона покупателя". Аналогично, если для оформления заказа требуется e-mail покупателя, то достаточно установить data-email-required = "required" в кнопке или настроить в Личном кабинете опцию "Получить e-mail покупателя".

Если для оформления заказа требуется адрес доставки, то достаточно установить data-delivery-required = "required" в кнопке или настроить в Личном кабинете опцию "Получить адрес покупателя для доставки заказа".

Кнопки PayQR идентифицируются скриптом PayQR по классу payqr-button, не удаляйте его для корректной работы сервиса.

Код кнопок PayQR выглядит примерно так:  

<button
   class="payqr-button"
   data-scenario="buy"
   data-cart= '[{
     "article": "6172ixz",
     "name": "Хороший товар",
     "imageUrl": "http:/*modastuff.ru/item1.jpg",
     "amount": "500.00",
     "quantity": "1"
   },
   {
     "article": "6971eqo",
     "name": "Очень хороший товар",
     "imageUrl': "http:/*modastuff.ru/item2.jpg",
     "amount": "2000.00",
     "quantity": "2"
   }]'
   data-firstname-required="required"
   data-phone-required="required"
   data-delivery-required="nonrequired"
   data-amount="2500.00"
>Купить быстрее<button>

Пример как мы делали генерацию кнопок PayQR на «1С-Битрикс» (PHP):  

<?php
  if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED !== true)
      die();

  $arResult['PQR_AMOUNT'] = 0;
  $pqrCart                = array();

  if ($_REQUEST['getCartJson'] != 'Y') {
      $APPLICATION->AddHeadScript('https://payqr.ru/popup.js?merchId=' . $arParams['MERCH_ID']);
  }

  if (CModule::IncludeModule("sale") && CModule::IncludeModule("iblock")) {
      $dbBasketItems = CSaleBasket::GetList(array(
          "NAME" => "ASC",
          "ID" => "ASC"
      ), array(
          "FUSER_ID" => CSaleBasket::GetBasketUserID(),
          "LID" => SITE_ID,
          "ORDER_ID" => "NULL"
      ), false, false, array(
          "ID",
          "PRODUCT_ID",
          "PRODUCT_PRICE_ID",
          "NAME",
          "QUANTITY",
          "CAN_BUY",
          "PRICE",
          "PREVIEW_PICTURE",
          "DELAY"
      ));

      while ($arBasketItem = $dbBasketItems->Fetch()) {
          if ($arBasketItem['CAN_BUY'] == 'Y' && $arBasketItem['DELAY'] == 'N') {
              $rsProduct = CIBlockElement::GetByID($arBasketItem["PRODUCT_ID"]);
              $imageUrl = null;
              if ($arProduct = $rsProduct->Fetch())
                  $imageUrl = 'http://' . SITE_SERVER_NAME . CFile::GetPath($arProduct["PREVIEW_PICTURE"]);
              $replaceArray = array(
                  "'" => "&#039;",
                  '"' => "\""
              );
              $pqrCart[]    = array(
                  "article" => $arBasketItem['PRODUCT_PRICE_ID'],
                  "name" => str_replace(array_keys($replaceArray), array_values($replaceArray), $arBasketItem['NAME']),
                  "imageUrl" => $imageUrl,
                  "quantity" => $arBasketItem['QUANTITY'],
                  "amount" => $arBasketItem['PRICE'] * $arBasketItem['QUANTITY']
              );
              $arResult['PQR_AMOUNT'] += $arBasketItem['PRICE'] * $arBasketItem['QUANTITY'];
          }
      }

      $arResult['PQR_ORDER_GROUP'] = SITE_ID . "." . CSaleBasket::GetBasketUserID() . "." . CUser::GetID();

      /*
        Заносим в дополнительный атрибут кнопки PayQR все идентификаторы этой
        учетной системы, которые могут потребоваться в дальнейшим при создании и
        оплате заказа, через разделитель «точка», в данном случае первым, вторым и
        третьим параметром сохранили ИД сайта, ИД пользователя на интернет-сайте и
        ИД пользователя в учетной системе (это особенность «1С-Битрикс»,
        часто в учетных системах понятия ИД сайта, ИД пользователя на
        интернет-сайте и ИД пользователя в учетной системе отсутствуют,
        а в создании заказа участвуют только артикулы позиций)
      */

      $arResult['PQR_CART'] = json_encode($pqrCart); // Конвертируем заполненную корзину в JSON для передачи в кнопку

      if ($_REQUEST['getCartJson'] == 'Y') {
          $APPLICATION->RestartBuffer();
          echo json_encode(array(
              'cart' => $arResult['PQR_CART'],
              'amount' => $arResult['PQR_AMOUNT']
          ));
          die();
      }
  } else
      $arResult['ERROR'] = 'Вы не можете использовать данный компонент, т.к. не установлен модуль Интернет-магазин';

  $this->IncludeComponentTemplate();
?>

<button class="payqr-button payqr-btn-template" data-scenario="<?=$arParams['TYPE']?>" <?if (!empty($arResult['PQR_ORDER_GROUP'])):?> data-orderGroup='<?=$arResult['PQR_ORDER_GROUP']?>'<?endif;?> <?if (!empty($arResult['ORDER_ID'])):?> data-orderId='<?=$arResult['ORDER_ID']?>'<?endif;?> <?if ($arParams['FIRSTNAME_REQUIRED'] == 'Y'): ?> data-firstname-required="required"<?endif;?> <?if ($arParams['LASTNAME_REQUIRED'] == 'Y'): ?> data-lastname-required="required"<?endif;?> <?if ($arParams['PHONE_REQUIRED'] == 'Y'): ?> data-phone-required="required"<?endif;?> <?if ($arParams['EMAIL_REQUIRED'] == 'Y'): ?> data-email-required="required"<?endif;?> <?if ($arParams['DELIVERY_REQUIRED'] == 'Y'): ?> data-delivery-required="required"<?endif;?> <?if (!empty($arResult['PQR_CART'])):?> data-cart='<?=$arResult['PQR_CART']?>'<?endif;?> <?if (!empty($arResult['PQR_AMOUNT'])):?> data-amount="<?=$arResult['PQR_AMOUNT']?>"<?endif;?> ><?if ($arParams['TYPE'] == 'buy') echo GetMessage('BTN_BUY'); else echo GetMessage('BTN_PAY'); ?></button>

3. Добавить обработчик уведомлений PayQR на сервере магазина

Когда мобильное приложение собрало запрошенные данные для создания заказа, сервер PayQR посылает эти данные в объекте Invoice уведомлением invoice.order.creating на сервер магазина. В обработчике необходимо создать заказ в учётной системе Магазина и вернуть стоимость и идентификатор заказа - orderId.

При расчёте стоимости корзины рекомендуется рассчитывать стоимость позиции по её артикулу и количеству заказываемого товара. Также мы рекомендуем проверить и пересчитать окончательную сумму заказа: после обработки этого события, пользователь перейдет к оплате покупки.

Данные в уведомлении invoice.order.creating приходят в следующем виде...

Пример:  

{
  "object": "event",
  "id": "evt_14EccV2eZvKYlo2C2j1B18pF",
  "created": "2015-08-09T18:31:42.201+04:00",
  "type": "invoice.order.creating",
  "data": {
    "object": "invoice",
    "id": "usr_inv_gKSaFJxIv8xydXdOl3f4fm",
    "payqrNumber": "3334445556667778",
    "created": "2015-03-17T15:24:04.311+03:00",
    "modified": "2015-05-17T17:10:08.107+03:00",
    "livemode": true,
    "payqrUserId": "000000000007",
    "scenario": "buy",
    "amount": 1000.00,
    "cart": [{
      "article": "jl1uayq8",
      "name": "Историческая Книга",
      "imageUrl": "http://www.modastuff.ru/books/history-200x200.jpg",
      "quantity": "1",
      "amount": 650,
      "category": ""
    }],
    "customer": {
      "firstName": "Степан",
      "middleName": "Степанович",
      "lastName": "Степанов",
      "phone": "8-926-000-11-11",
      "email": "mail@mail.ru"
    },
    "delivery": {
      "country": "Россия",
      "region": "Москва",
      "city": "Москва",
      "zip": "115059",
      "street": "Партийный переулок",
      "house": "1",
      "unit": "46",
      "building": "",
      "flat": "217",
      "hallway": "",
      "floor": "4",
      "intercom": "",
      "comment": "Предварительно позвонить",
      "longitude": 37.237400,
      "latitude": 115.809000,
      "kladrId": "77000000000222600"
    },
    "deliveryCases": [{
      "article": "deliv01_Sl",
      "name": "Курьерская доставка",
      "description": "Курьерская доставка документов, посылок и корреспонденции",
      "amountFrom": 200,
      "amountTo": 350,
      "children": [{
        "article": "eliv01_Sl",
        "name": "Срочная доставка курьером",
        "description": "Экспресс-доставка в течение часа",
        "amountFrom": 350,
        "amountTo": 350
      }, {
        "article": "eliv01_S2",
        "name": "Курьером",
        "description": "На следующий день",
        "amountFrom": 200,
        "amountTo": 200
      }],

    }, {
      "article": "deliv02_Sl",
      "name": "Транспортная компания",
      "description": "Грузоперевозки и другие транспортные услуги в России",
      "amountFrom": 200,
      "amountTo": 1500
    }],
    "deliveryСasesSelected": {
      "article": "eliv01_Sl",
      "name": "Срочная доставка курьером",
      "description": "Экспресс-доставка в течение часа",
      "amountFrom": 350,
      "amountTo": 350
    },
    "promoCode": {
      "article": "bunuscode",
      "description": "Промо-код",
      "value": "0000111100001111"
    },
    "promoCard": {
      "article": "malinacard",
      "description": "Карта лояльности",
      "value": "9999000099990000"
    },
    "message": {
      "article": "thanxmes",
      "text": "Спасибо за заказ! Доставка будет осуществлена в течение 01:00. Телефон справочной службы: +7 (495) 669-67-56.",
      "imageUrl": "http://modastuff.ru/thanks.jpeg",
      "url": "http://modastuff.ru"
    },
    "upSale": {
      "article": "Gsv2mX93kdhsi2",
      "name": "Конституция Российской Федерации",
      "imageUrl": "http://www.modastuff.ru/books/constitut-300x300.jpg",
      "quantity": "1",
      "amount": 500,
      "category": ""
    },
    "userData": "82nZJKAKq2yyXU_1oQp2lffS",
    "validityInMinutes": 10080,
    "confirmWaitingInMinutes": 4320,
    "status": "ordered"
  }
}

В заголовке header PQRSecretKey должен быть указан ключ для сервера из личного кабинета (SecretKeyIn).

Ответ на сервер PayQR нужно отправить в таком виде...

Пример:  

{
  "id": "evt_14EccV2eZvKYlo2C2j1B18pF",
  "data": {
    "amount": 1000.00,
    "orderId": "GN15-IZY1AF.90r"
  }
}

В заголовке header PQRSecretKey должен быть указан ключ магазина из личного кабинета (SecretKeyOut).

Параметры счета на оплату

ПараметрыОбязательноеЗаполняет пользовательЗаполняет магазинЗаполняет PayQR
data-firstName-requiredНет "required": "deny"
data-lastName-requiredНет "required", "deny"
data-phone-requiredНет "required", "deny"
data-email-requiredНет "required", "deny"
data-delivery-requiredНет "required", "deny", "nonrequired"
data-cartНет Да
data-amountНет Да
data-orderIdНет Да
customer.firstNameЗависит от data-firstName-requiredДа
customer.lastNameЗависит от data-lastName-requiredДа
customer.phoneЗависит от data-phone-requiredДа
customer.emailЗависит от data-email-requiredДа
orderIdДа Да
amountДа Да
delivery.longitudeНет Координаты на карте
delivery.latitudeНет Координаты на карте
delivery.kladrIdНет По адресу
delivery.countryЗависит от data-delivery-requiredДа
delivery.regionЗависит от data-delivery-requiredДа
delivery.cityЗависит от data-delivery-requiredДа
delivery.zipЗависит от data-delivery-requiredДа
delivery.zipНетДа
delivery.streetЗависит от data-delivery-requiredДа
delivery.houseНетДа
delivery.unitНетДа
delivery.hallwayНетДа
delivery.floorНетДа
delivery.intercomНетДа
delivery.commentНетДа

Примеры

Как обрабатывать оплату заказов в учетной системе вашего интернет-сайта зависит от этой учетной системы (обратитесь к документации учетной системы, если затрудняетесь дифференцировать этот функционал). Если на интернет-сайте уже используются какие-то системы безналичных платежей (интернет-эквайринг, электронные кошельки и тому подобное), то обработка уведомлений об оплате от PayQR должна осуществляться аналогично этим системам.

Обработчик для оформления заказа на «1С-Битрикс» (PHP) может быть реализован следующим образом.

Пример:  

<?php
  if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED !== true)
      die();

  $raw_data = file_get_contents("php://input");
  //кастомная функция логирования, для отладки
  payQrLogToFile($raw_data);
  $event = json_decode($raw_data);

  $secretKeyIn  = $arParams['SECRET_KEY_IN']; // Входящий ключ SecretKeyIn этого «Магазина», указанный в личном кабинете
  $secretKeyOut = $arParams['SECRET_KEY_OUT']; // Исходящий ключ SecretKeyOut этого «Магазина», указанный в личном кабинете

  header("PQRSecretKey:" . $secretKeyOut); // Подписать ответ исходящим ключом для подтверждения, что ответ действительно от «Магазина»

  if ($event->type == "invoice.order.creating" && CModule::IncludeModule("iblock") && CModule::IncludeModule("sale") && CModule::IncludeModule("catalog")) /* Проверяем тип события на соответствие типу события для создания заказа и задействуем нужные компоненты*/ {
      $invoice         = $event->data; // Объект «Счет на оплату» (invoice)
      $orderGroupParts = explode(".", $invoice->orderGroup);
      /* Получаем пришедшие идентификаторы учетной системы ИД сайта ИД пользователя на сайте и ИД пользователя в учетной системе (это редкая особенность «1С-Битрикс», часто в учетных системах понятия ИД сайта и ИД пользователя отсутствуют, а в формировании участвуют только артикулы позиций в заказе) */
      $siteId          = $orderGroupParts[0]; // ИД сайта (был сохранен на уровне кнопки PayQR в data-orderGroup первым параметром)
      $fuserId         = $orderGroupParts[1]; // ИД пользователя на сайте (был сохранен на уровне кнопки PayQR в data-orderGroup вторым параметром)
      $userId          = $orderGroupParts[2]; // ИД пользователя в учетной системе (был сохранен на уровне кнопки PayQR в data-orderGroup третьим параметром)
      if (empty($userId))
          $userId = $arParams['DEFAULT_USER_ID'];

      $arFieldsOrder = array();

      $arFieldsOrder[$arParams['FIELD_FIRSTNAME_ID']] .= ', ' . $invoice->customer->firstName;
      $arFieldsOrder[$arParams['FIELD_LASTNAME_ID']] .= ', ' . $invoice->customer->lastName;
      $arFieldsOrder[$arParams['FIELD_PHONE_ID']] .= ', ' . $invoice->customer->phone;
      $arFieldsOrder[$arParams['FIELD_EMAIL_ID']] .= ', ' . $invoice->customer->email;

      $arFieldsOrder[$arParams['FIELD_COUNTRY_ID']] .= ', ' . $invoice->delivery->country;
      $arFieldsOrder[$arParams['FIELD_CITY_ID']] .= ', ' . $invoice->delivery->city;
      $arFieldsOrder[$arParams['FIELD_ZIP_ID']] .= ', ' . $invoice->delivery->zip;

      if ($arParams['FIELD_ADDRESS_ID'] > 0):
          $arFieldsOrder[$arParams['FIELD_ADDRESS_ID']] .= ', ';
          if (!empty($invoice->delivery->street))
              $arAddress[] = 'ул. ' . $invoice->delivery->street;
          if (!empty($invoice->delivery->house))
              $arAddress[] = 'д. ' . $invoice->delivery->house;
          if (!empty($invoice->delivery->unit))
              $arAddress[] = 'корп.. ' . $invoice->delivery->unit;
          if (!empty($invoice->delivery->building))
              $arAddress[] = 'стр. ' . $invoice->delivery->building;
          if (!empty($invoice->delivery->flat))
              $arAddress[] = 'кв. ' . $invoice->delivery->flat;
          if (!empty($invoice->delivery->hallway))
              $arAddress[] = 'подъезд ' . $invoice->delivery->hallway;
          if (!empty($invoice->delivery->floor))
              $arAddress[] = 'этаж ' . $invoice->delivery->floor;
          if (!empty($invoice->delivery->intercom))
              $arAddress[] = 'домофон ' . $invoice->delivery->intercom;
          $arFieldsOrder[$arParams['FIELD_ADDRESS_ID']] .= implode(', ', $arAddress);
      endif;

      //$arFieldsOrder[$arParams['FIELD_PAYQR_ID']] = $invoice->payqrNumber;
      $commentOrder = $invoice->delivery->comment;

      AddMessage2Log('FUSERID: ' . $fuserId . ' | USERID: ' . $userId . ' | ');

      $dbBasketItems = CSaleBasket::GetList( // Получаем корзину этого пользователя из интернет-сайта
          array(
          "NAME" => "ASC",
          "ID" => "ASC"
      ), array(
          "FUSER_ID" => $fuserId,
          "LID" => SITE_ID,
          "ORDER_ID" => "NULL"
      ), false, false, array(
          "ID",
          "PRODUCT_ID",
          "PRODUCT_PRICE_ID",
          "NAME",
          "QUANTITY",
          "CAN_BUY",
          "PRICE"
      ));
      $arBasketItems = array();
      while ($arBasketItem = $dbBasketItems->Fetch()) /* На всякий случай, приводим состояние корзины на интернет-сайте в соответствие с содержанием заказа в PayQR (заказ, который начал оформляться в PayQR, приоритетнее) */
          $arBasketItems[] = $arBasketItem;
      $removingPositionKeys = array();
      /* Массив удаляемых из корзины PayQR элементов, которые не удалось поместить в корзину магазина (нет такого товара или не удалось добавить к корзину) */
      $invoice->amount      = 0; // Очищаем итоговую сумму счета для пересчета по текущим ценам интернет-сайта, так как они могли измениться

      payQrLogToFile("\\narBasketItems: " . var_export($arBasketItems, true));
      payQrLogToFile("\\ninvoice->cart: " . var_export($invoice->cart, true));

      foreach ($invoice->cart as $positionKey => $position) // Проверяем корзину PayQR и обновляем корзину магазина
          {
          $arPrice                   = CPrice::GetByID(intval($position->article));
          $arDiscounts               = CCatalogDiscount::GetDiscountByPrice($arPrice["ID"], $USER->GetUserGroupArray(), "N", SITE_ID);
          $discountPrice             = CCatalogProduct::CountPriceWithDiscount($arPrice["PRICE"], $arPrice["CURRENCY"], $arDiscounts);
          $arPrice["DISCOUNT_PRICE"] = $discountPrice;
          payQrLogToFile("\\narPrice: " . var_export($arPrice, true));
          if ($arProduct = CIBlockElement::GetByID(intval($arPrice["PRODUCT_ID"]))->Fetch()) {
              $position->amount = $arPrice["DISCOUNT_PRICE"] * $position->quantity; // Актуализируем сумму по позиции
              $position->name   = $arProduct["NAME"]; // Актуализируем название позиции
              $removingIndex    = -1;
              foreach ($arBasketItems as $index => $arBasketItem) /* Проверяем текущую корзину на интернет-сайте на соответствие заказу в приложении */
                  if ($arBasketItem["PRODUCT_PRICE_ID"] == $position->article) {
                      if ($arBasketItem["QUANTITY"] != $position->quantity) // Проверяем совпадение количества
                          CSaleBasket::Update($arBasketItem["ID"], array(
                              "QUANTITY" => $position->quantity
                          ));
                      /* Приводим в соответствие с тем, что в приложении, если есть расхождения */
                      $removingIndex = $index;
                      break;
                  }
              if ($removingIndex >= 0)
                  unset($arBasketItems[$removingIndex]);
                  /* Удаляем элементы из списка, которые успешно обработали, за ненадобностью */
              else if (!CSaleBasket::Add(array(
                      /* Заполняем корзину в учетной системе для создания заказа (это редкая особенность «1С-Битрикс», часто в учетных системах можно сразу создать заказ, а потом заполнить его содержимое, без необходимости эмуляции предварительного создания корзины) */
                      "PRODUCT_ID" => $arPrice["PRODUCT_ID"],
                      "PRODUCT_PRICE_ID" => $arPrice["ID"],
                      "PRICE" => $arPrice["PRICE"],
                      "CURRENCY" => $arParams['CURRENCY'],
                      "QUANTITY" => $position->quantity,
                      "LID" => $siteId,
                      "FUSER_ID" => $fuserId,
                      "DELAY" => "N",
                      "CAN_BUY" => "Y",
                      "NAME" => $arProduct["NAME"],
                      "CALLBACK_FUNC" => "",
                      "MODULE" => "sale",
                      "NOTES" => "",
                      "ORDER_CALLBACK_FUNC" => "",
                      "DETAIL_PAGE_URL" => "",
                      "CANCEL_CALLBACK_FUNC" => "",
                      "PAY_CALLBACK_FUNC" => ""
                  )))
                  $removingPositionKeys[] = $positionKey;
                  /* Удаляем позицию из заказа в приложении, если учетная система отказала в добавлении этой позиции в корзину по любым причинам */
              $invoice->amount += $position->amount; // Пересчитываем итоговую сумму заказа на основе данных учетной системы
          } else
              $removingPositionKeys[] = $positionKey;
              /* Удаляем позицию из заказа в приложении, если указанный товар не был найден в учетной системе (например, закончился на складе) */
      }
      foreach ($arBasketItems as $arBasketItem) /* Удаляем из корзины на интернет-сайте те товары, которые отсутствуют в заказе в приложении PayQR */
          CSaleBasket::Delete($arBasketItem["ID"]);
      foreach ($removingPositionKeys as $positionKey) /* Удаляем из корзины на интернет-сайте те товары, которые отсутствуют в учетной системе интернет-сайта */
          unset($invoice->cart[$positionKey]);

      payQrLogToFile("\\narBasketItems: " . var_export($arBasketItems, true));
      payQrLogToFile("\\ninvoice->amount: " . var_export($invoice->amount, true));

      $dbBasketItems = CSaleBasket::GetList( // Получаем корзину этого пользователя из интернет-сайта
          array(
          "NAME" => "ASC",
          "ID" => "ASC"
      ), array(
          "FUSER_ID" => $fuserId,
          "LID" => SITE_ID,
          "ORDER_ID" => "NULL"
      ), false, false, array(
          "ID",
          "PRODUCT_ID",
          "PRODUCT_PRICE_ID",
          "NAME",
          "QUANTITY",
          "CAN_BUY",
          "PRICE"
      ));
      $arBasketItems = array();
      while ($arBasketItem = $dbBasketItems->Fetch()) /* На всякий случай, приводим состояние корзины на интернет-сайте в соответствие с содержанием заказа в PayQR (заказ, который начал оформляться в PayQR, приоритетнее) */
          $arBasketItems[] = $arBasketItem;
      payQrLogToFile("\\narBasketItems: " . var_export($arBasketItems, true));
      //exit;
      if (count($invoice->cart) > 0) /* Создаем заказ в учетной системе интернет-сайта, если оформляемая корзина после всех проверок осталась непустой, иначе не создаем заказ */ {
          $invoice->orderId = CSaleOrder::Add(array( // Добавляем заказ в учетную систему
              "LID" => $siteId,
              "PERSON_TYPE_ID" => 1,
              "PAYED" => "N",
              "CANCELED" => "N",
              "STATUS_ID" => "N",
              "PRICE" => $invoice->amount,
              "CURRENCY" => $arParams['CURRENCY'],
              "USER_ID" => intval($userId),
              "USER_DESCRIPTION" => $commentOrder
          ));

          if ($invoice->orderId == false)
              AddMessage2Log('Ошибка добавления заказа');


          if (count($arFieldsOrder) > 0) {
              foreach ($arFieldsOrder as $id => $value) {

                  $value = substr($value, 2);

                  if ($id > 0 && !empty($value) && $arOrderProps = CSaleOrderProps::GetByID($id)) {
                      CSaleOrderPropsValue::Add(array(
                          "ORDER_ID" => $invoice->orderId,
                          "ORDER_PROPS_ID" => $id,
                          "NAME" => $arOrderProps['NAME'],
                          "CODE" => $arOrderProps['CODE'],
                          "VALUE" => $value
                      ));
                  }

              }
          }


          CSaleBasket::OrderBasket($invoice->orderId, $fuserId, $siteId);
          /* Связываем только что созданный заказ с текущей корзиной на интернет-сайте, чтобы корзина на интернет-сайте не осталась «брошенной» */
      }
      //------- Формирование заказа завершено в 1C-Битрикс -------
      $raw_data = json_encode($event);
      payQrLogToFile($raw_data);
      echo $raw_data;
  } else if ($event->type == "invoice.paid" && CModule::IncludeModule("sale")) /* Проверяем тип события на соответствие типу события для оплаты заказа и задействуем нужные компоненты этой учетной системы */ {
      /* логика оплаты заказа */
  } else
      echo json_encode(array(
          "id" => $event->id
      ));
?>