shiptor api добавление посылки
Создадим посылку, используя сервис. Shiptor предоставляет Public и Shipping api. Нам нужен 2-й, метод addPackage.
Код можно скачать с этого репозитория https://github.com/esteit/shiptor-russia-php-api-client . Можно воспользоваться примером shiptor-russia-php-api-client/samples/ShippingEndpoint/AddPackage.php
Ключ берем в ЛК, в разделе Настройки — API — API токен для интеграции https://api.shiptor.ru/shipping/v1 .
Далее все параметры описаны в https://shiptor.ru/doc/#api-Public , сложность может возникнуть с параметрами setShippingMethod, setKladrId, setDeliveryPoint. Значения этих параметров легко получить с помощью виджета расчета доставки https://help.shiptor.ru/knowledge_base/item/102796 . Подключается он довольно легко и возвращает все нужные данные.
Создаем экземпляр виджета, привязанный к селектору.
var elemShiptorWidget = document.querySelector("#shiptor_widget");
Работаем с событиями onLocationSelect, onMethodSelect, onCourierSelect, onPvzSelect. Важно разграничивать 3 способа доставки:
1. Курьер
2. ПВЗ
3. Почта России.
// сохраняем город
elemShiptorWidget.addEventListener("onLocationSelect",function(ce){
shiptorData.location = ce.detail.city
});
// сохраняем метод, попутно сбрасывая старые данные
elemShiptorWidget.addEventListener("onMethodSelect",function(ce){
shiptorData.method = ce.detail
delete shiptorData.pvz
delete shiptorData.courier
});
// сохраняем метод доставки Курьер
elemShiptorWidget.addEventListener("onCourierSelect",function(ce){
shiptorData.courier = ce.detail
});
// или ПВЗ
elemShiptorWidget.addEventListener("onPvzSelect",function(ce){
shiptorData.pvz = ce.detail
});
Все это отправляем аяксом на AddPackage.php. Также надо добавить улицу и дом, т.к. они обязательные поля. В виджете их почему то нет, надо добавить самому.
$.ajax({
url: '/AddPackage.php' ,
data: shiptorData ,
type: 'post' ,
method: 'post' ,
success: function(data){
data = JSON.parse(data)
$(".ajax-loader").remove()
if(data.success){
$(".shiptor").val(JSON.stringify(shiptorData2))
$('input[type=submit][name=checkout]').closest('form').submit()
}else if(data.error){
$("._shiptor_widget_footer").before('<div class="alert alert-danger">' +
data.error + '</div>')
}
},
error: function(err){
console.log(err)
}
})
И полный код AddPackage.php
<?php
use ShiptorRussiaApiClient\Client\Shiptor,
ShiptorRussiaApiClient\Client\Core\Response\ErrorResponse;
require_once $_SERVER['DOCUMENT_ROOT'].'/vendor/autoload.php';
$shiptor = new Shiptor(["API_KEY" => "<apikey>"]);
$inputs = filter_input_array(INPUT_POST);
file_put_contents('shiptor_inputs.log' , var_export($inputs, true));
$package = $shiptor->ShippingEndpoint()->addPackage();
$request = $package
->setLength(null !== array_sum($inputs['length']) ? array_sum($inputs['length']) : 10)
->setWidth(null !== array_sum($inputs['width']) ? array_sum($inputs['width']) : 10)
->setHeight(10)
->setWeight(null !== array_sum($inputs['weight']) ? array_sum($inputs['weight']) : 10)
->setCod(0)
// Оценоч стоимость
->setDeclaredCost( ($cost = array_sum(array_column($inputs['products'] , 'price'))) > 0 ? $cost : 1000) // Оценочная стоимо
->setExternalId("123456") // Идентификатор
// Метод
->setShippingMethod( isset($inputs['courier']) ? $inputs['courier']['method']['id'] : ( isset($inputs['pvz']) ? $inputs['pvz']['shipping_methods'][0] : '20' ) ) // Метод доставки
->setComment( $inputs['comment'] )
// Кладр
->setKladrId( $inputs['location']['kladr_id'] ) // Код КЛАДР населенного пункта
->setName( $inputs['name'] )
->setSurname("тестовый")
->setPatronimic("")
->setEmail($inputs['email'])
->setPhone($inputs['phone'])
// город
->setApartment( isset($inputs['flat']) ? $inputs['flat'] : '' )
->setHouse( isset($inputs['dom']) ? $inputs['dom'] : '' )
->setStreet( isset($inputs['street']) ? $inputs['street'] : '' )
->setAddressLine( isset($inputs['pvz']['prepare_address']) ? $inputs['pvz']['prepare_address']['street'] : $inputs['street']
. ' ' . $inputs['dom'] . ' ' . $inputs['flat'])
->forRu()
;
if(isset($inputs['pvz'])){
$package->setDeliveryPoint($inputs['pvz']['id']);
}
foreach($inputs['products'] as $prod){
$request->newProduct()->setShopArticle($prod['name'])->setCount($prod['count'])->setPrice($prod['price']);
}
$response = $request->send();
if($response instanceof ErrorResponse):?>
<?php echo json_encode(['error' => $response->getMessage()])?>
<?php else:?>
<?php
$result = $response->getResult();
echo json_encode(['success' => $result->getId()]);
die();
?>
<?php
endif;
?>
Leave a comment