Процедура предложения пунктов самовывоза

Настройка запроса предложения способов доставки

Когда одной из необходимых опций для создания заказа является выбор точки самовывоза,то необходимо

В этом случае на сервер магазина посылается уведомление invoice.pickpoints.updating. Пока список будет пустой, пользователь не сможет перейти к оплате. После того, как пользователь выбрал точку самовывоза и заполнил все необходимые поля для создания магазином заказа, на сервер магазина посылается событие invoice.order.creating. По этому событию нужно пересчитать окончательную сумму заказа

Уведомление invoice.pickpoints.updating приходит на сервер магазина в таком формате:

Пример:  

{
  "object": "event",
  "id": "evt_14EccV2eZvKYlo2C2j1B18pF",
  "created": "2015-08-09T18:31:42.201+04:00",
  "type": "invoice.pickpoints.updating",
  "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": 650.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"
    },
    "pickPoints": [],
    "validityInMinutes": 10080,
    "confirmWaitingInMinutes": 4320,
    "status": "personalized"
  }
}

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

Используя delivery.city в качестве фильтра, можно возвращать в массиве объектов pickPoints только те точки самовывоза, которые необходимы покупателю. Если фильтрация не нужна или представляет сложность, можно возвращать весь список точек самовывоза.

Ответ на событие invoice.pickpoints.updating нужно отправить в таком виде.

Пример:  

{
  "id": "evt_14EccV2eZvKYlo2C2j1B18pF",
  "data": {
    "id": "usr_inv_gKSaFJxIv8xydXdOl3f4fm",
    "pickPoints": [{
      "article": "",
      "name": "м. Павелецкая",
      "description": "",
      "longitude": 55.731394,
      "latitude": 37.636149,
      "amountFrom": 1000
    }, {
      "article": "1000",
      "name": "Связной",
      "description": "с 10:00 до 21:00",
      "longitude": 55.729704,
      "latitude": 37.636267,
      "amountFrom": 1300,
      "amountTo": 1300
    }, {
      "article": "1001",
      "name": "Oldi",
      "description": "с 10:00 до 19:00",
      "longitude": 55.733500,
      "latitude": 37.633231,
      "amountFrom": 1000,
      "amountTo": 1000
    }]
  }
}

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

Уведомление invoice.order.creating с данными о доставке приходит на сервер магазина в таком формате:

Пример:  

{
  "id": "evt_14EccV2eZvKYlo2C2j1B18pF",
  "object": "event",
  "created": "2015-08-09T18:31:42.201+04:00",
  "type": "invoice.order.creating",
  "data": {
    "id": "usr_inv_gKSaFJxIv8xydXdOl3f4fm",
    "object": "invoice",
    "livemode": false,
    "created": "2015-08-09T18:31:42.201+04:00",
    "modified": "2015-08-09T18:33:42.201+04:00",
    "payqrNumber": "3213326680056410",
    "payqrUserId": "000000000000",
    "orderGroup": "87549023rkdf09ic",
    "amount": 1000.00,
    "cart": [{
      "article": "5675657",
      "name": "Товар 1",
      "imageUrl": "http:/*goods.ru/item1.jpg",
      "quantity": 5,
      "amount": 650.00
    }],
    "customer": {
      "firstName": "Иван",
      "lastName": "Иванов",
      "phone": "+79111111111",
      "email": "test@user.com"
    },
    "delivery": {
      "longitude": 55.718666,
      "latitude": 37.634119,
      "kladrId": "77000000000222600",
      "country": "Россия",
      "region": "Москва",
      "city": "Москва",
      "zip": "115093",
      "street": "Партийный пер.",
      "house": "1",
      "unit": "416 б",
      "hallway": "2",
      "floor": "4",
      "intercom": "к416к1234",
      "comment": "Пройти магазин Пионерия и повернуть направо. Охране сказать, что в PayQR",
    },
    "pickPoints": [{
      "article": "",
      "name": "м. Павелецкая",
      "description": "",
      "longitude": 55.731394,
      "latitude": 37.636149,
      "amountFrom": 1000
    }, {
      "article": "1000",
      "name": "Связной",
      "description": "с 10:00 до 21:00",
      "longitude": 55.729704,
      "latitude": 37.636267,
      "amountFrom": 1300,
      "amountTo": 1300
    }, {
      "article": "1001",
      "name": "Oldi",
      "description": "с 10:00 до 19:00",
      "longitude": 55.733500,
      "latitude": 37.633231,
      "amountFrom": 1000,
      "amountTo": 1000
    }],
    "pickPointsSelected": {
      "article": "1000",
      "name": "Связной",
      "description": "с 10:00 до 21:00",
      "longitude": 55.729704,
      "latitude": 37.636267,
      "amountFrom": 350,
      "amountTo": 350
    },
    "status": "personalized"
  }
}

В заголовке header PQRSecretKey должен быть указан ключ PayQR из личного кабинета, что именно PayQR отправил это сообщение (SecretKeyOut).

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

Ответ на событие invoice.order.creating нужно отправить в таком виде.

Пример:  

{
  "id": "evt_14EccV2eZvKYlo2C2j1B18pF",
  "data": {
    "id": "usr_inv_gKSaFJxIv8xydXdOl3f4fm",
    "orderId": "00000001",
    "amount": "1000.00",
  }
}

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

Обработчик для оплаты заказа на PHP может быть реализован следующим образом.

Пример:  

<?php
 /* Ключ системы PayQR для этого магазина, указанный в личном кабинете */
 $secretKeyIn = "XXX";
 /* Ключ магазина, указанный в личном кабинете */
 $secretKeyOut = "YYY";
 /* Получаем уведомление о событии из тела пришедшего POST запроса */
 $event = json_decode(file_get_contents("php://input"));
 /* Получаем хидеры запроса */
 $headers = getallheaders();
 /* Проверить, что запрос от сервера PayQR */
 if (isset($headers["PQRSecretKey"]) && $headers["PQRSecretKey"] == $secretKeyIn
         && isset($event->object) && $event->object == "event"
         && isset($event->type) && $event->type == "invoice.pickpoints.updating")
 {
    /* Подтвердить, что ответ от магазина */
    header("PQRSecretKey:" . $secretKeyOut);
    $pick_points_cases = array(
         array(
           'article' => '1003',
           'number' => '1',
           'name' => 'Наш пункт самовывоза 3',
           'description' => 'с 10:00 до 23:00',
           'amountFrom' => '0',
           'amountTo' => '130',
         ),
         array(
           'article' => '1002',
           'number' => '1.1',
           'name' => 'Наш пункт самовывоза 2',
           'description' => 'с 10:00 до 20:00',
           'amountFrom' => '150',
           'amountTo' => '150',
         ),
         array(
           'article' => '1001',
           'number' => '1.2',
           'name' => 'Наш пункт самовывоза 1',
           'description' => 'с 10:00 до 22:00',
           'amountFrom' => '90',
           'amountTo' => '140',
         ),
         array(
           'article' => '1004',
           'number' => '1.3',
           'name' => 'Наш пункт самовывоза 4',
           'description' => 'круглосуточно',
           'amountFrom' => '130',
           'amountTo' => '0',
         ),
         array(
           'article' => '1004',
           'number' => '2',
           'name' => 'Наш пункт самовывоза 4',
           'description' => 'круглосуточно',
           'amountFrom' => '130',
           'amountTo' => '0',
         ),
         array(
           'article' => '1004',
           'number' => '3',
           'name' => 'Ясенево',
           'description' => 'круглосуточно',
           'amountFrom' => '130',
           'amountTo' => '0',
         ),
         array(
           'article' => '1004',
           'number' => '4',
           'name' => 'Жулебино',
           'description' => 'круглосуточно',
           'amountFrom' => '130',
           'amountTo' => '0',
         ),
         array(
           'article' => '1004',
           'number' => '5',
           'name' => 'Тёплый стан',
           'description' => 'круглосуточно',
           'amountFrom' => '130',
           'amountTo' => '0',
         ),
       );
        $output = array(
         "id" => $event->id,
         "data" => array(
             "pickPoints" => $pick_points_cases,
         )
     );
     echo json_encode($output);
 }
?>