Skip to content

Commit

Permalink
Добавлена поддержка функции создания заказа V2
Browse files Browse the repository at this point in the history
  • Loading branch information
iamwildtuna committed Oct 29, 2020
1 parent d98e3ef commit c77461d
Show file tree
Hide file tree
Showing 2 changed files with 118 additions and 11 deletions.
94 changes: 93 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@
- [Заказы](#orders)
- [x] [Получение списка ПВЗ](#get_pvz_list)
- [x] [Создание заказов](#create_orders)
- [ ] [Создание заказов (v2)](#create_orders_v2)
- [x] [Создание заказов (v2)](#create_orders_v2)
- [x] [Редактирование заказа](#edit_order)
- [x] [Удаление заказов](#delete_orders)
- [x] [Поиск заказа](#search_order)
Expand Down Expand Up @@ -78,6 +78,7 @@
- [x] [Текущие настройки пользователя](#get_settings)

<a name="links"><h1>Changelog</h1></a>
- 0.9.6 - Добавлена функция создания заказа V2 с возвратом ШК и номеров клиентской ИС, спасибо [GrayWolfy](https://github.com/GrayWolfy) за помощь;
- 0.9.5 - Актуализирован список статусов отправления, изменено поведение пакетного трекинга, подробнее [тут](https://github.com/lapaygroup/RussianPost/releases/tag/0.9.5);
- 0.9.4 - Добавлена поддержка Guzzle 7.1 в зависимостях Composer;
- 0.9.3 - Добавлена поддержка Guzzle 7 в зависимостях Composer;
Expand Down Expand Up @@ -1052,6 +1053,97 @@ catch (\Exception $e) {
}
```



<a name="create_orders_v2"><h3>Создание заказа V2</h3></a>
Создает новый заказ. Автоматически рассчитывает и проставляет плату за пересылку.
Метод asArr() проверяет заполнение необходимых для создания заказа полей и в случае незаполнения выбрасывает \InvalidArgumentException.

**Важно!**
Для внутренних отправлений должен задаваться цифровой почтовый индекс *$order->setIndexTo(115551)*.
Для зарубежных отправлений должен задаваться зарубежный почтовый индекс *$order->setStrIndexTo('ab5551')*.
По умолчанию выбран динамический ДТИ. Для изменения диапазона ДТИ нужно обратиться в службу поддержки Почты России.

**Пример создания заказа:**
```php
<?php
use Symfony\Component\Yaml\Yaml;
use LapayGroup\RussianPost\Providers\OtpravkaApi;
use LapayGroup\RussianPost\Entity\Order;

try {
$otpravkaApi = new OtpravkaApi(Yaml::parse(file_get_contents('path_to_config.yaml')));

$orders = [];
$order = new Order();
$order->setIndexTo(115551);
$order->setPostOfficeCode(109012);
$order->setGivenName('Иван');
$order->setHouseTo('92');
$order->setCorpusTo('3');
$order->setMass(1000);
$order->setOrderNum('2');
$order->setPlaceTo('Москва');
$order->setRecipientName('Иванов Иван');
$order->setRegionTo('Москва');
$order->setStreetTo('Каширское шоссе');
$order->setRoomTo('1');
$order->setSurname('Иванов');
$orders[] = $order->asArr();

$result = $otpravkaApi->createOrdersV2($orders);

// Успешный ответ
/*Array
(
[orders] => Array
(
[barcode] => 80093053624992
[order-num] => 3
[result-id] => 310115153
)
)*/

// Ответ с ошибкой
/*Array
(
[errors] => Array
(
[0] => Array
(
[error-codes] => Array
(
[0] => Array
(
[code] => EMPTY_INDEX_TO
[description] => Почтовый индекс не указан
)

)

[position] => 0
)

)

)*/
}

catch (\InvalidArgumentException $e) {
// Обработка ошибки заполнения параметров
}

catch (\LapayGroup\RussianPost\Exceptions\RussianPostException $e) {
// Обработка ошибочного ответа от API ПРФ
}

catch (\Exception $e) {
// Обработка нештатной ситуации
}
```



<a name="edit_order"><h3>Редактирование заказа</h3></a>
Изменение ранее созданного заказа. Автоматически рассчитывает и проставляет плату за пересылку.

Expand Down
35 changes: 25 additions & 10 deletions src/Providers/OtpravkaApi.php
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,8 @@ class OtpravkaApi implements LoggerAwareInterface
{
use LoggerAwareTrait;

const VERSION = '1.0';
const V1 = '1.0';
const V2 = '2.0';
const DELIVERY_VERSION = 'v1';
const PRINT_TYPE_PAPER = 'PAPER';
const PRINT_TYPE_THERMO = 'THERMO';
Expand Down Expand Up @@ -66,7 +67,7 @@ private function checkApiClient($endpoint = self::OTPRAVKA)
case self::OTPRAVKA:
if (!$this->otpravkaClient) {
$this->otpravkaClient = new \GuzzleHttp\Client([
'base_uri' => 'https://otpravka-api.pochta.ru/' . self::VERSION . '/',
'base_uri' => 'https://otpravka-api.pochta.ru/',
'headers' => ['Authorization' => 'AccessToken ' . $this->token,
'X-User-Authorization' => 'Basic ' . $this->key,
'Content-Type' => 'application/json',
Expand All @@ -91,7 +92,7 @@ private function checkApiClient($endpoint = self::OTPRAVKA)
case self::POSTOFFICE:
if (!$this->postOfficeClient) {
$this->postOfficeClient = new \GuzzleHttp\Client([
'base_uri' => 'https://otpravka-api.pochta.ru/postoffice/' . self::VERSION . '/',
'base_uri' => 'https://otpravka-api.pochta.ru/postoffice/' . self::V1 . '/',
'headers' => ['Authorization' => 'AccessToken ' . $this->token,
'X-User-Authorization' => 'Basic ' . $this->key,
'Content-Type' => 'application/json',
Expand All @@ -114,7 +115,7 @@ private function checkApiClient($endpoint = self::OTPRAVKA)
* @return array | string | UploadedFile
* @throws RussianPostException
*/
private function callApi($type, $method, $params = [], $endpoint = null)
private function callApi($type, $method, $params = [], $version = self::V1, $endpoint = null)
{
$is_file = false;
$this->checkApiClient($endpoint);
Expand All @@ -125,10 +126,12 @@ private function callApi($type, $method, $params = [], $endpoint = null)
break;

case self::DELIVERY:
$version = self::DELIVERY_VERSION;
$client = $this->deliveryClient;
break;

case self::POSTOFFICE:
$version = self::V1;
$client = $this->postOfficeClient;
break;

Expand All @@ -140,7 +143,7 @@ private function callApi($type, $method, $params = [], $endpoint = null)
case 'GET':
$request = http_build_query($params);
if ($this->logger) {
$this->logger->info("Russian Post Otpravka API {$type} request /".self::VERSION."/{$method}: ".$request);
$this->logger->info("Russian Post Otpravka API {$type} request /".$version."/{$method}: ".$request);
}
$response = $client->get($method, ['query' => $params]);
break;
Expand All @@ -149,11 +152,11 @@ private function callApi($type, $method, $params = [], $endpoint = null)
case 'DELETE':
$request = json_encode($params);
if ($this->logger) {
$this->logger->info("Russian Post Otpravka API {$type} request /".self::VERSION."/{$method}: ".$request);
$this->logger->info("Russian Post Otpravka API {$type} request /".$version."/{$method}: ".$request);
}

/** @var ResponseInterface $response */
$response = $client->{strtolower($type)}($method, ['json' => $params]);
$response = $client->{strtolower($type)}($version.'/'.$method, ['json' => $params]);
break;
}

Expand All @@ -165,11 +168,11 @@ private function callApi($type, $method, $params = [], $endpoint = null)
if (preg_match('~^application/(pdf|zip|octet-stream)~', $content_type, $matches_type)) {
$is_file = true;
if ($this->logger) {
$this->logger->info("Russian Post Otpravka API {$type} response /".self::VERSION."/{$method}: получен файл с расширением ".$matches_type[1], $headers);
$this->logger->info("Russian Post Otpravka API {$type} response /".$version."/{$method}: получен файл с расширением ".$matches_type[1], $headers);
}
} else {
if ($this->logger) {
$this->logger->info("Russian Post Otpravka API {$type} response /".self::VERSION."/{$method}: " . $response_contents, $headers);
$this->logger->info("Russian Post Otpravka API {$type} response /".$version."/{$method}: " . $response_contents, $headers);
}
}

Expand Down Expand Up @@ -337,7 +340,7 @@ public function getDeliveryPeriod($post_type, $index_from, $index_to, $as_html =
$params['from'] = $index_from;
$params['to'] = $index_to;

return $this->callApi('GET', 'calculate', $params, self::DELIVERY);
return $this->callApi('GET', 'calculate', $params, self::DELIVERY_VERSION, self::DELIVERY);
}

/**
Expand Down Expand Up @@ -395,6 +398,18 @@ public function createOrders($orders)
return $this->callApi('PUT', 'user/backlog', $orders);
}

/**
* Создание заказов V2
*
* @param Order[] $orders - массив объектов Order
* @return array
* @throws RussianPostException
*/
public function createOrdersV2($orders)
{
return $this->callApi('PUT', 'user/backlog', $orders, self::V2);
}


/**
* Редактирование заказа
Expand Down

0 comments on commit c77461d

Please sign in to comment.