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

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

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

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

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

Пример:  

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

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

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

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

Пример:  

{
  "id": "evt_14EccV2eZvKYlo2C2j1B18pF",
  "data": {
    "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
    }]
  }
}

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

Уведомление 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 должен быть указан ключ PayQR из личного кабинета, что именно PayQR отправил это сообщение.

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

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

Пример:  

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

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

Обработчик для оплаты заказа на 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.deliverycases.updating")
 {
     header("PQRSecretKey:" . $secretKeyOut); /* Подтвердить, что ответ от магазина */
     $delivery_cases = array(
          array(
            "article" => "deliv01",
            "name" => "Курьерская доставка",
            'description' => 'Курьерская доставка документов, посылок и корреспонденции',
            'amountFrom' => '350',
            'amountTo' => '350'
          ),
          array(
            'article' => 'deliv02',
            'name' => 'DHL',
            'description' => '1-2 дня',
            'amountFrom' => '0',
            'amountTo' => '70'
          ),
          array(
            'article' => 'deliv03',
            'name' => 'Транспортная компания',
            'description' => 'Грузоперевозки и другие транспортные услуги в России',
            'amountFrom' => '200',
            'amountTo' => '1500'
          )
     );
     $output = array(
         "id" => $event->id,
         "data" => array(
             "deliveryCases" => $delivery_cases,
         )
     );
     echo json_encode($output);
 }
?>