BoxNow

Стъпки

Стъпка 1: Първи стъпки

Стъпка 2: Среда за разработка

Стъпка 3: Заявка за доставка

Стъпка 4: Карта с BOX NOW автомати

Стъпка 5: Отстраняване на проблеми

Помощ

Tailor Made

Преди да започнете

Стъпка 1: Първи стъпки

OAUTH_CLIENT_ID

Пазете този „ключ“ на безопасно място! Това е Вашият OAuth2 Client ID, който ще ползвате, за да достъпите нашият API за партньори.

OAUTH_CLIENT_SECRET

Пазете този „ключ“ на безопасно място! Това е Вашият OAuth2 Client Secret, който ще ползвате, за да достъпите нашият API за партньори.

API_URL

Това е уеб-адрес основа, към който ще пращате Вашите заявки, добавяйки различните API endpoints.

Стъпка 2: Среда за разработка

Тестова

Това е тестова среда, с ограничена функционалност, желателно е да я ползвате, за да тествате Вашата интеграция.

Продукция

Използвайте тази среда като внимавате изключително много! Защото е реална и е свързана с реални клиенти, заявки и други напълно реални данни.

Стъпка 3: Заявка за доставка

Следвайте тези стъпки, за да можете успешно да направите заявка за доставка и да ползвате прилежащите функции:

3.1 Автентификация

Автентификацията е базирана на OAuth 2.0 стандарта, Client Credentials grant.

За да ползвате нашият API, е ЗАДЪЛЖИТЕЛНО да добавите токена за достъп, към т.нар. „Authorization header“ като „Bearer“ токен.

Вижте пример с успешна имплементация:

POST /api/v1/ auth sessions

{

"grant_type”: "client_credentials”,

"client_id": “string”,

"client_secret": “string”

}

Status Code 200

{

"access_token”: “client_credentials”,

"token_type": “Bearer”,

"expires_in”: 3600

}

Възможни отговори от сървъра:

400

Сървърът не може или няма да обработи заявка, която е грешна (Пример: грешен синтаксис, грешна заявка към сървъра). Необходимо е да промените заявката, преди да я изпратите отново.

401

Не сте се удостоверили. Най-вероятно използвате изтекъл токен за достъп или се опитвате да инициализирате сесия за автентификация с грешни / невалидни данни.

403

Акаунтът Ви е деактивиран. Вашият акаунт е бил деактивиран, моля свържете се с поддръжката за съдействие.

3.2 Списък с всички складове /origins

Извикването на /origins ще ни покаже списък с всички налични локации за взимане на пратка от наша страна (PUP - PickUpPoint), тоест Ваш склад, магазин или друго място, от което ние ще вземем пратките.

Всичките Ваши складове ще бъдат показани с извикването на /origins, който има същите параметри като извикването на /destinations , където не е нужно да се ползват параметрите „lat“, „lng“, “radius“ или „requiredSize“, но се подава параметъра „locationType“ с примерна стойност: „warehouse“. За да достъпите дадена локация, то е нужно да я извиквате с помощта на нейното ID (locationId).

Има и една специфична локация, наречена „any-apm“, която може да бъде извикана по същия начин - „locationType“ като “any-apm” ни връща точно една локация – any-apm. За да я реферирате, е нужно да ползвате ID (locationId). Употребата й ще бъде обяснена в следващата секция.

Това е набора от параметри, даден Ви, за да изведете определена начална локация:

Име Тип Описание
locationType string

Връща локации от определен тип. Ако не присъства в заявката, филтърът не се прилага.

  • Възможни стойности: any-apm, warehouse

Вижте пример с успешна имплементация:

GET /api/v1/ origins

curl -X ‘GET’\

'…/origins\

-H 'accept: application/json’

Status Code 200

{

"data": [

{

"id": "string",

"type": "warehouse",

"image": "https://via.placeholder.com/175",

"lat": "48.940819584637266",

"lng": "12.366962491028423",

"title": "Warehouse 1",

"name": "Main Warehouse",

"addressLine1": "ul.Tsar Boris III",

"addressLine2": "Sofia",

"postalCode": "1000",

"country": "BG",

"note": "Намира се на ъгъла до супермаркета"// can be null

}

]

}

Възможни отговори от сървъра:

Код на грешката

400

Сървърът не може или няма да обработи заявка, която е грешна (Пример: грешен синтаксис, грешна заявка към сървъра). Необходимо е да промените заявката, преди да я изпратите отново.

401

Не сте се удостоверили. Най-вероятно използвате изтекъл токен за достъп или се опитвате да инициализирате сесия за автентификация с грешни / невалидни данни.

403

Акаунтът Ви е деактивиран. Вашият акаунт е бил деактивиран, моля свържете се с поддръжката за съдействие.

3.3. Списък с локациите на всички автомати /destinations

Извикването на /destinations ще ни изведе списък с всички налични автомати, до които ние можем да доставим Вашата пратка.

По-долу са показани параметрите, по които можете да филтрирате нужната Ви локация сред всички налични локации:

Име Тип Описание
latlng string

Ако се използва този параметър, ще се покажат машините в радиус (нужно е да подадем и radius параметър!) от подадените GPS координати.

  • Пример: 48.78081955454138,12.446962472273063
radius number

Радиус в метри, който ще ви върне автомати в зададения радиус спрямо подадените GPS координати. Този параметър се игнорира, ако не е подаден latlng параметър.

  • Пример: 1 000
  • Стойност по подразбиране: 25 000
requiredSize number

Ще ни върне само автомати, които могат да съберат нашата пратка.

  • Пример 1
  • 1 - Малък (H: 8 cm, W: 45 cm, L: 60 cm), 2 - Среден (H: 17 cm, W: 45 cm, L: 60 cm), 3 - Голям (H: 36 cm, W: 45 cm, L: 60 cm)
locationType string

Връща локации от определен тип. Ако не присъства, филтърът не се прилага.

  • Възможни стойности: apm, any-apm

Вижте пример с успешна имплементация:

GET api/v1/ destinations

curl X ‘GET’\

‘.../destinations\

-H 'accept: application/json'

Status Code 200

{

"data": [

{

"id": "string",

"type": "apm",

"image": "https://via.placeholder.com/150",

"lat": "48.78081955454138",

"lng": "12.446962472273063",

"title": "1842 - Building SIVEN, Hladilnika",

"name": "1842 - бул. Черни връх №47А, София, 1407",

"addressLine1": "bul. Cherni Vrah 47A",

"addressLine2": "string",

"postalCode": "1407",

"country": "BG",

"note": "Намира се зад зоомагазина"

}

]

}

Моля направете справка със секция номер 4 за пример с JavaScript, който можете да вградите към Вашите страници, за да Ви се покажат всички налични автомати чрезизкачащ т.е. pop-up / iframe уиджет, или като насока за успешна интеграция с изработена от Вас карта.

id

Когато заявявате доставка, ще бъде нужно да реферирате всички тези записи, по тяхното id – най-вече чрез: locationId:

locationId

Възможни отговори от сървъра:

Error Code

400

Сървърът не може или няма да обработи заявка, която е грешна (Пример: грешен синтаксис, грешна заявка към сървъра). Необходимо е да промените заявката, преди да я изпратите отново.

401

Не сте се удостоверили. Най-вероятно използвате изтекъл токен за достъп или се опитвате да инициализирате сесия за автентификация с грешни / невалидни данни.

403

Акаунтът Ви е деактивиран. Вашият акаунт е бил деактивиран, моля свържете се с поддръжката за съдействие.

3.4 Заявка за доставка /delivery-requests

Чрез /delivery-request ще изпратите заявка към нас, да доставим пратка (или множество пратки). Това е основното „запитване“, което ще ползвате, за да създавате какъвто и да било тип заявка за доставка.

Когато е направена успешна заявка за доставка:

  • (опционално) Ще Ви изпратим имейл с потвърждение за успешна заявка за доставка, с товарителница в PDF формат, която ще бъде прикачена в съобщението. За да се случи това обаче е нужно да използвате параметъра notifyOnAccepted (Моля вижте Приложение 6.3).
  • (Описан по-долу) Друг вариант е да генерирате товарителница в PDF формат за всяка Ваша пратка, използвайки: GET /parcels/{id}/label.pdf, която ще разпечатате и залепите към пратката.
  • Ние ще Ви изпратим куриер, който да вземе пратката (пратките) спрямо предварително договореното време за взимане.
  • Ние също така ще уведомим крайният клиент за следното:
  1. Че сме получили заявка за доставка от Вас и че пратката ще им бъде доставена в избран от Вас автомат.
  2. Че сме занесли пратка им до избрания автомат с всички нужни данни за взимане на пратката.

Вижте пример с успешна имплементация:

POST api/v1/ delivery requests

{

"orderNumber": “string”,

"invoiceValue": “25.50”,

"paymentMode":”prepaid”,

”amountToBeCollected": “0.00",

"allowReturn”: true,

"origin”:{

"contactNumber":“+3598XXXXXXXX”,

"contactEmail”: [email protected],

"contactName": “Ivan Ivanov",

"locationId":”string”

},

“destination”:{

"contactNumber": "+3598XXXXXXXX”,

"contactEmail”: [email protected],

"contactName” "Ivan Petrov",

"locationId":”string”

},

"items”: [

{

"id": “string”,

"name": “Smartphone”

"value”: “3.45”,

"weight”: 0

}

]

}

items: weight

Ако не знаете теглото на пратката, моля задайте стойност 0.

Тези параметри са основните индентификатори на местата за взимане на пратката и на местата за оставяне на пратка:

Начална точка: locationId

Склада, от който ние ще вземем пратката.

Крайна точка: locationId

Автомат - мястото, на което пратката ще бъде доставена от нас.

Също така, моля не забравяйте да подадете следните параметри с всяка заявка.

Sender:

  1. Име на подател

Recipient:

  1. Име на получател
  2. Телефонен номер
  3. Имейл адрес

Status Code 200

{

"referenceNumber":”string”,

"parcels”:[

{

"id":”string”

}

]

}

ВНИМАНИЕ: В горния пример масива “items” съответства на пратки, но „item ID“ е уникален индентификатор за самия електронен магазин (приемете го като важен референтен номер). Ако нямате уникално ID за всяка пратка, то в такъв случай е необходимо да го създадете като към номер на поръчката добавите поредния номер на всяка пратка във възходящ ред или можете да го генерирате по друг начин, но идеята е да подадете уникален номер. А т.нар. ID на пратката/„parcel ID“ (parcels: id) е вътрешен и уникален за BOX NOW - ID номер.

Ако желаете да изпратите пратка чрез автомат, можете да използвате “any-APM” за начална точка и определен автомат като крайна точка.

Ако лично ще оставите пратката до същият АПС, от който крайният клиент ще си вземе тази пратка, то тогава ползвате „any-APM“ като начална точка, но и като крайна точка.

Възможни отговори от сървъра:

Код на грешката

400

Сървърът не може или няма да обработи заявка, която е грешна (Пример: грешен синтаксис, грешна заявка към сървъра). Необходимо е да промените заявката, преди да я изпратите отново.

401

Не сте се удостоверили. Най-вероятно използвате изтекъл токен за достъп или се опитвате да инициализирате сесия за автентификация с грешни / невалидни данни.

403

Акаунтът Ви е деактивиран. Вашият акаунт е бил деактивиран, моля свържете се с поддръжката за съдействие.

3.5 Генериране на товарителница /parcels/{id}/label.pdf

Използвайте тази заявка, за да създадете товарителница в .pdf формат или .zpl формат, която трябва задължително да се залепи към всяка пратка.

Това са параметрите, които може да подадете:

Име Тип Описание
id string Уникално ID на пратката. Parcel ID се получава след създаването на успешна заявка за доставка или можете да видите списък с всички пратки. Parcel ID винаги е 10-цифрено число.
type string Възможни стойности: pdf, zpl (zebra printer language)
spi number Само ако е избран ZPL формата! Възможни стойности : 200, 300

Вижте пример с успешна имплементация:

GET /api/v1/ parcels

curl -X 'GET' \

‘.../parcels/{id}/label.pdf’ \

-H 'accept: application/pdf’

Status Code 200

.pdf файл със съответстваща на пратката товарителница.

За да принтирате всички товарителници наведнъж, заменете {id} с {orderNumber}:

GET /api/v1/ delivery requests

curl -X 'GET' \

‘.../delivery-requests/{orderNumber}/label.pdf’ \

-H 'accept: application/pdf’

Стъпка 4: Карта с BOX NOW автомати (Уиджет / Ръчна разработка)

4.1 Интегратия на уиджет

Като алтернатива на интегрирането на нашето API за избиране на автомат от Ваша карта, то можете да ползвате готов уиджет като out-of-the-box решение във Вашата страница за поръчки. Този уиджет си комуникира с нашия API и съдържа същите данни с тези, достъпни чрез GET /api/v1/destination.

Как да интегрирате уиджета на BOX NOW:

  1. Поставете BOX NOW Map Widget JavaScript кода към страницата за приключване на поръчката (или към всяка друга страница, към която желаете да добавите уиджета на BOX NOW за избиране на автомат).
  2. Създайте нов HTML бутон с class: boxnow-widget-button за да отворите BOX NOW Map Widget. Пример:
    <a href="javascript:;" class="boxnow-widget-button">О</a>
  3. Създайте функция, която ще приема данни за избран автомат като: id, адрес, име и др.

BOX NOW Map Widget (Javascript код):

    

<div id="boxnowmap"></div>

<script type="text/javascript">

var _bn_map_widget_config = {

partnerId: 123,

parentElement: "#boxnowmap"

afterSelect: function(selected){

alert(selected.boxnowLockerPostalCode);

alert(selected.boxnowLockerAddressLine1);

alert(selected.boxnowLockerId);

}

};

(function(d){var e = d.createElement("script");e.src = "https://widget-cdn.boxnow.bg/map-widget/client/v5.js";e.async = true;e.defer = true;d.getElementsByTagName("head")[0].appendChild(e);})(document);</script>

Бележка:Най-важна е променливата _bn_map_widget_config, защото чрез тази променлива можете да попълните всички нужни опции, както е показано по-долу.

Име Начин на ползване Описание
parentElement задължително

Моля попълнете CSS селектора за Map Widget container. Например това, което можете да направите, е да създадете

<div id="boxnowmap"></div> 

който да попълните с #boxnowmap. Уиджета на BOX NOW ще се позиционира вътре в този елемент.

afterSelect

задължително for type:iframe

and type:popup

Функция, която бива задействана, когато е избран автомат. Съдържа един параметър (object), който съдържа в себе си цялата информация за автомата (като свойствата boxnowLockerPostalCode, boxnowLockerAddressLine1 и boxnowLockerId са изключително важни).

partnerId опционално Моля използвайте Вашето partnerId
type опционално Използвайте iframe, popup или navigate. По подразбиране се ползва iframe.
gps опционално Използвайте го, ако желаете да промените местоположението на потребителя веднага след показването на картата. Възможните опции са: true или false. По подразбиране е true.
autoclose опционално Използвайте го, ако желаете да направите промяна след избор на автомат. За type:iframe, стойността по подразбиране е true, което означава че картата ще се скрие, след като е избран АПС. За type:popup, autoclose е нужно да е true. Възможните стойности са: true или false. Стойността по подразбиране е true.

**За повече примери можете да погледнете: widget-v4.boxnow.bg/developers

4.2 Интеграция със създадена от Вас карта

Нашият уиджет се възползва от предлаганото от Google Maps JavaScript API: https://developers.google.com/maps/apis-by-platform

Чрез извикването на GET /api/v1/ destination, Вие можете да се сдобиете с longitude като променливата lng и latitude като променливата lat за всяка една наша локация, после можете да ги подадете към Google Maps API, за да ги покажете на избрана от Вас карта:

https://developers.google.com/maps/documentation/javascript/adding-a-google-map
  1. id за ID номер на автомат;
  2. image за url адрес със снимка на избрания автомат;
  3. name името на определен автомат;
  4. addressLine1 and addressLine2
  5. postalCode
  6. note за по-подробно описане на това къде точно се намира самия автомат.
Стъпка 5: Отстраняване на проблеми

Описание на всички кодове с грешки, получени при върнат „статус 400“ т.е. проблемна заявка:

Грешка P400

Заявка с грешни данни. Уверете се, че пускате заявка според документацията.

Грешка P401

Заявка с грешна начална точка на пратката. Уверете се, че ползвате валиден location ID \ ID на локацията от Origins и/или проверете дали адреса е правилен.

Грешка P402

Невалидна крайна дестинация! Уверете се, че използвате правилното location ID \ ID на локацията от endpoint-a с крайните дестинации и че подаденият адрес е коректен.

Грешка P403

Не Ви е позволено да ползвате доставки от типа AnyAPM - SameAPM. Обърнете се към поддръжката, ако считате ,че това е наша грешка.

Грешка P404

Невалиден CSV импорт. Вижте съдържанието на грешката за повече информация.

Грешка P405

Невалиден телефонен номер. Проверете дали изпращате телефона в подходящия интернационален формат, тоест +359 xx xxx xxxx.

Грешка P406

Невалиден размер. Уверете се, че в заявката си пращате някой от необходимите размери 1, 2 или 3 (Малък, Среден или Голям). Размерът е задължителна опция дори когато изпращате от дадена машина директно.

Грешка P407

Невалиден код за държавата. Уверете се, че изпращате коректен код за държава във формат по ISO 3166-1 alpha-2. Примерно: BG.

Грешка P410

Конфликт в номера на поръчката. Опитвате се да направите заявка за доставка за ID на поръчката, което е било използвано. Моля използвайте друго ID на поръчката.

Грешка P411

Вие не можете да ползвате „наложен платеж“ като тип плащане. Използвайте друг тип плащане или се свържете с нашата поддръжка.

Грешка P420

Не е възможно отказването на пратката. Типа пратки, които можете да откажете, са от тип „new“, „undelivered“. Пратки, които не можете да откажете, са в състояние „returned“ или „lost“. Уверете се, че пратката е в процес на доставка и опитайте отново.

Грешка P430

Пратки, които не са готови за AnyAPM потвърждение. Най-вероятно пратката е потвърдена за доставка. Обърнете се към поддръжката, ако считате че това е наша грешка.

Свържете се с нас:

Ако изпитвате затруднения с интеграцията на нашия API във Вашия електронен магазин спрямо предоставената документация, моля свържете се с нас на адрес: [email protected]

Бележки:

  1. Тестване на плъгин с тестови API ключове.
  2. Изберете тестови автомат: Test Locker 1, locker id: 5365
  3. След като поръчката бъде създадена, ние автоматично ще Ви изпратим товарителницата в PDF формат само ако сте избрали "NotifyOnAccepted" и сте посочили валиден имейл адрес.
  • (POST) Authorization: {baseURL}/api/v1/auth-sessions
  • (GET) Origins: {baseURL}/api/v1/origins
  • (GET) Destinations: {baseURL}/api/v1/destinations
  • (POST) Delivery-request: {baseURL}/api/v1/delivery-requests
  • (GET) Parcel label: {baseURL}/api/v1/parcels/{id}/label.pdf
  • (GET) Parcels: {baseURL}/api/v1/parcels
  • (POST) Cancel parcel: {baseURL}/api/v1/parcels/{id}:cancel