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

Your email address will not be published.


*