Отправка заказов в СДЭК через API/PHP

1

Взаимодействие с сервисом требует авторизации по протоколу OAuth 2.0. Подробнее на https://api-docs.cdek.ru/29923918.html

Для получения токена необходимо отправить POST-запрос:

// Авторизация
$array = array();
$array['grant_type']    = 'client_credentials';
$array['client_id']     = 'CLIENT_ID'; 
$array['client_secret'] = 'CLIENT_SECRET'; 

$ch = curl_init('https://api.cdek.ru/v2/oauth/token?parameters');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($array, '', '&')); 
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/x-www-form-urlencoded'));
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, false);
$html = curl_exec($ch);
curl_close($ch);
$res = json_decode($html, true);

$access_token = $res['access_token'];
PHP
2

Метод предназначен для создания заказа на доставку товаров до покупателей.

Подробнее на https://api-docs.cdek.ru/29923926.html

Для выбора ПВЗ можно использовать виджет сдэка.

// Товары в заказе
$prods = array(
	array(
		'name'   => 'Кофе в зернах Bushido Red Katana',
		'sku'    => '1234',
		'price'  => '379', // Стоимость
		'count'  => '1',   // кол-во
		'weight' => '227', // Вес, гр
		'length' => '10',  // Длина, см
		'width'  => '10',  // Ширина, см
		'height' => '10',  // Высота, см
	),
);

// Регистрация заявки
$array = array();
$array['type'] = 1;	// Договор "интернет-магазин"
$array['tariff_code'] = '136';
$array['number'] = 'НОМЕР_ЗАКАЗА_НА_ВАШЕМ_САЙТЕ';	
$array['shipment_point'] = 'КОД_ПВЗ_ОТГРУЗКИ';	
$array['delivery_point'] = 'КОД_ПВЗ_ПОЛУЧАТЕЛЯ';	
					
$array['recipient'] = array(
	'name' => 'ИМЯ_ПОЛУЧАТЕЛЯ',
	'phones' => array(
		'number' => 'ТЕЛЕФОН_ПОЛУЧАТЕЛЯ',
	),
	'address' => 'АДРЕС_ПОЛУЧАТЕЛЯ',
	'email'   => 'EMAIL_ПОЛУЧАТЕЛЯ',
);	

foreach($prods as $i => $row) {
	$array['packages'][] = array(
		'number' => ++$i,
		'weight' => $row['weight'] * $row['count'],
		'length' => $row['length'],
		'width'  => $row['width'],
		'height' => $row['height'],
		'items'  => array(
			array(
				'name'     => $row['name'],
				'ware_key' => $row['sku'],
				'payment'  => array(
					'value' => $row['price'],
				),
				'cost'     => $row['price'] * $row['count'],
				'weight'   => $row['weight'],
				'amount'   => $row['count'],
			)
		)
	);					
}
	
$array = json_encode($array, JSON_UNESCAPED_UNICODE);
$ch = curl_init('https://api.cdek.ru/v2/orders');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $array); 
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
	'Content-Type: application/json', 
	'Authorization: Bearer ' . $access_token
));
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, false);
$html = curl_exec($ch);
curl_close($ch);
					
$res = json_decode($html, true);	
var_dump($res);
PHP
// Товары в заказе
$prods = array(
	array(
		'name'   => 'Кофе в зернах Bushido Red Katana',
		'sku'    => '1234',
		'price'  => '379', // Стоимость
		'count'  => '1',   // кол-во
		'weight' => '227', // Вес, гр
		'length' => '10',  // Длина, см
		'width'  => '10',  // Ширина, см
		'height' => '10',  // Высота, см
	),
);

// Регистрация заявки
$array = array();
$array['type'] = 1;	// Договор "интернет-магазин"
$array['tariff_code'] = '137';
$array['number'] = 'НОМЕР_ЗАКАЗА_НА_ВАШЕМ_САЙТЕ';	
$array['shipment_point'] = 'КОД_ПВЗ_ОТГРУЗКИ';	
$array['to_location'] = array(
	'address' => 'ПОЛНЫЙ_АДРЕС_ПОЛУЧАТЕЛЯ'
);
				
$array['recipient'] = array(
	'name' => 'ИМЯ_ПОЛУЧАТЕЛЯ',
	'phones' => array(
		'number' => 'ТЕЛЕФОН_ПОЛУЧАТЕЛЯ',
	),
	'address' => 'АДРЕС_ПОЛУЧАТЕЛЯ',
	'email'   => 'EMAIL_ПОЛУЧАТЕЛЯ',
);	

foreach($prods as $i => $row) {
	$array['packages'][] = array(
		'number' => ++$i,
		'weight' => $row['weight'] * $row['count'],
		'length' => $row['length'],
		'width'  => $row['width'],
		'height' => $row['height'],
		'items'  => array(
			array(
				'name'     => $row['name'],
				'ware_key' => $row['sku'],
				'payment'  => array(
					'value' => $row['price'],
				),
				'cost'     => $row['price'],
				'weight'   => $row['weight'],
				'amount'   => $row['count'],
			)
		)
	);					
}
	
$array = json_encode($array, JSON_UNESCAPED_UNICODE);
$ch = curl_init('https://api.cdek.ru/v2/orders');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $array); 
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
	'Content-Type: application/json', 
	'Authorization: Bearer ' . $access_token
));
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, false);
$html = curl_exec($ch);
curl_close($ch);
					
$res = json_decode($html, true);	
var_dump($res);
PHP
В первых двух примерах стоимость доставки оплачивается отправителем, что-бы эту сумму переложить на получателя нужно предварительно узнать стоимость и передать ее в параметре
// Товары в заказе
$prods = array(
	array(
		'name'   => 'Кофе в зернах Bushido Red Katana',
		'sku'    => '1234',
		'price'  => '379', // Стоимость
		'count'  => '1',   // кол-во
		'weight' => '227', // Вес, гр
		'length' => '10',  // Длина, см
		'width'  => '10',  // Ширина, см
		'height' => '10',  // Высота, см
	),
);

// Стоимость доставки
$array = array();
$array['type'] = 1;	
$array['tariff_code'] = '136';		
		
$array['from_location'] = array(
	'address' => 'ПОЛНЫЙ_АДРЕС_ОТПРАВИТЕЛЯ'
);	
	
$array['to_location'] = array(
	'address' => 'ПОЛНЫЙ_АДРЕС_ПОЛУЧАТЕЛЯ'
);

$sum = 0;
foreach($prods as $i => $row) {
	$sum += $row['count'] * $row['price'];
	
	$array['packages'][] = array(
		'weight' => $row['weight'] * $row['count'],
		'length' => $row['length'],
		'width'  => $row['width'],
		'height' => $row['height'],
	);					
}
						
$array['services'] = array(
	'code' => 'INSURANCE',
	'parameter' => $sum
);
						
$array = json_encode($array, JSON_UNESCAPED_UNICODE);
$ch = curl_init('https://api.cdek.ru/v2/calculator/tariff');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $array); 
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json', 'Authorization: Bearer ' . $access_token));
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, false);
$html = curl_exec($ch);
curl_close($ch);
	
$res = json_decode($html, true);	
$delivery_sum = $res['total_sum'];

if (!empty($delivery_sum)) {
	// Регистрация заявки
	$array = array();
	$array['type'] = 1;
	$array['tariff_code'] = '137';
	$array['number'] = 'НОМЕР_ЗАКАЗА_НА_ВАШЕМ_САЙТЕ';	
	
	$array['delivery_recipient_cost'] = array(
		'value' => $delivery_sum
	);
  
	$array['shipment_point'] = 'КОД_ПВЗ_ОТГРУЗКИ';	
	$array['to_location'] = array(
		'address' => 'ПОЛНЫЙ_АДРЕС_ПОЛУЧАТЕЛЯ'
	);
			
	$array['recipient'] = array(
		'name' => 'ИМЯ_ПОЛУЧАТЕЛЯ',
		'phones' => array(
			'number' => 'ТЕЛЕФОН_ПОЛУЧАТЕЛЯ',
		),
		'address' => 'АДРЕС_ПОЛУЧАТЕЛЯ',
		'email'   => 'EMAIL_ПОЛУЧАТЕЛЯ',
	);	
	
	foreach($prods as $i => $row) {
		$array['packages'][] = array(
			'number' => ++$i,
			'weight' => $row['weight'] * $row['count'],
			'length' => $row['length'],
			'width'  => $row['width'],
			'height' => $row['height'],
			'items'  => array(
				array(
					'name'     => $row['name'],
					'ware_key' => $row['sku'],
					'payment'  => array(
						'value' => $row['price'],
					),
					'cost'     => $row['price'], // Стоимось товарая для страховки
					'weight'   => $row['weight'],
					'amount'   => $row['count'],
				)
			)
		);					
	}
		
	$array = json_encode($array, JSON_UNESCAPED_UNICODE);
	$ch = curl_init('https://api.cdek.ru/v2/orders');
	curl_setopt($ch, CURLOPT_POST, 1);
	curl_setopt($ch, CURLOPT_POSTFIELDS, $array); 
	curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json', 'Authorization: Bearer ' . $access_token));
	curl_setopt($ch, CURLOPT_TIMEOUT, 30);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
	curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
	curl_setopt($ch, CURLOPT_HEADER, false);
	$html = curl_exec($ch);
	curl_close($ch);
						
	$res = json_decode($html, true);	
	var_dump($res);
}
PHP
3

https://api-docs.cdek.ru/29923975.html

$cdek_id = '1234';
		
$ch = curl_init('https://api.cdek.ru/v2/orders/' . $cdek_id);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
	'Content-Type: application/json', 
	'Authorization: Bearer ' . $access_token
));
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, false);
$html = curl_exec($ch);
curl_close($ch);
			
$res = json_decode($html, true);	
//var_dump($res);
			
echo '<p>Номер отправления: ' . $res['entity']['cdek_number'] . '</p>';
echo '<p>Статус: ' . $res['requests'][0]['state'] . '</p>';
echo '<p>' . $res['requests'][0]['errors'][0]['message'] . '</p>';
PHP
23.03.2023
5448

Комментарии

, чтобы добавить комментарий.

Другие публикации

Примеры работа с API продавца Wildberries в PHP
Wildberries предоставляет продавцам возможность управлять магазином и получать статистику по API, через протокол HTTP...
10952
+4
Подключение к платежной системе Сбербанка
После регистрации в системе эквайринга Сбербанка и получив доступ к тестовой среде, можно приступить к интеграции с...
67459
+25
Прием платежей на сайте через Юкассу
В данной статье описан процесс оплаты через сервис ЮKassa с помощью прямых запросов к API через PHP cURL.
24590
+8
Прием платежей на сайте через интернет-эквайринг Тинькофф
Предварительно, чтобы реализовать оплату заказов на своем сайте через API Интернет-эквайринга банка Тинькофф...
23198
+15
Автоматическое сжатие и оптимизация картинок на сайте
Изображения нужно сжимать для ускорения скорости загрузки сайта, но как это сделать? На многих хостингах нет...
28787
+8
Использование API Яндекс Диска на PHP
Можно найти множество применений Яндекс Диска на своем сайте, например, хранение бекапов и отчетов, обновление прайсов,...
56427
+20