Стъпки
Стъпка 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 |
Връща локации от определен тип. Ако не присъства в заявката, филтърът не се прилага.
|
Вижте пример с успешна имплементация:
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 координати.
|
radius | number |
Радиус в метри, който ще ви върне автомати в зададения радиус спрямо подадените GPS координати. Този параметър се игнорира, ако не е подаден latlng параметър.
|
requiredSize | number |
Ще ни върне само автомати, които могат да съберат нашата пратка.
|
locationType | string |
Връща локации от определен тип. Ако не присъства, филтърът не се прилага.
|
Вижте пример с успешна имплементация:
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, която ще разпечатате и залепите към пратката.
- Ние ще Ви изпратим куриер, който да вземе пратката (пратките) спрямо предварително договореното време за взимане.
- Ние също така ще уведомим крайният клиент за следното:
- Че сме получили заявка за доставка от Вас и че пратката ще им бъде доставена в избран от Вас автомат.
- Че сме занесли пратка им до избрания автомат с всички нужни данни за взимане на пратката.
Вижте пример с успешна имплементация:
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:
- Име на подател
Recipient:
- Име на получател
- Телефонен номер
- Имейл адрес
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:
- Поставете BOX NOW Map Widget JavaScript кода към страницата за приключване на поръчката (или към всяка друга страница, към която желаете да добавите уиджета на BOX NOW за избиране на автомат).
- Създайте нов HTML бутон с class: boxnow-widget-button за да отворите BOX NOW Map Widget. Пример:
<a href="javascript:;" class="boxnow-widget-button">О</a>
- Създайте функция, която ще приема данни за избран автомат като: 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- id за ID номер на автомат;
- image за url адрес със снимка на избрания автомат;
- name името на определен автомат;
- addressLine1 and addressLine2
- postalCode
- 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]
Бележки:
- Тестване на плъгин с тестови API ключове.
- Изберете тестови автомат: Test Locker 1, locker id: 5365
- След като поръчката бъде създадена, ние автоматично ще Ви изпратим товарителницата в 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