Работа с API Яндекс.Маркета для модели FBS в PHP

Примеры запросов к API Яндекс Маркета (добавление товаров, обновление цен и остатков) из PHP.

Для доступа к API понадобится:

  • $token – OAuth-токен, подробнее о получении OAuth-токена;
  • $client_id – Идентификатор приложения;
  • $campaign_id – Идентификатор кампании, в личном кабинете, в меню слева выберите Настройки → Настройки API и скопируйте из поля Номер кампании число после дефиса.
1

Документация

В данном примере формируется запрос к API Маркета на добавление сразу нескольких товаров из БД магазина:

<?php
// Доступы к API:
$token = 'OAuth-токен';
$client_id = 'Идентификатор приложения';
$campaign_id = 'Идентификатор кампании';

// Получение товаров и БД:
$dbh = new PDO('mysql:dbname=db_name;host=localhost', 'логин', 'пароль');
$sth = $dbh->prepare("SELECT * FROM `prods` WHERE `market` = 1 LIMIT 100");
$sth->execute();
$prods = $sth->fetchAll(PDO::FETCH_ASSOC);

if (!empty($prods)) {
	$offers = array();
	foreach ($prods as $i => $prod) {
		$offer = array(
			'offer' => array(
				'shopSku' => $prod['id'],
				'name' => $prod['name'],
				'category' => $prod['category'],
				'manufacturer' => '',
				'manufacturerCountries' => explode(',', $prod['countries']),
				'weightDimensions' => array(
					'length' => $prod['length'],
					'width' =>  $prod['width'],
					'height' => $prod['height'],
					'weight' => $prod['weight']
				),
				'urls' => array(
					'https://example.com/prod/' . $prod['id']
				),
				'pictures' => array(
					'https://example.com/img/' . $prod['img_1'],
					'https://example.com/img/' . $prod['img_2'],
				),
				'vendor' => $prod['brands'],
				'vendorCode' => $prod['sku'],
				'barcodes' => array(
					$prod['barcode'],
				),
				'description' => $prod['text'],
				//'shelfLife' => array(
				//	'timePeriod' => 0,
				//	'timeUnit' => '',
				//	'comment' => ''
				//),
				//'lifeTime' =>array(
				//	'timePeriod' => 0,
				//	'timeUnit' => '',
				//	'comment' => ''
				//),
				//'guaranteePeriod' => array(
				//	'timePeriod' => 0,
				//	'timeUnit' => '',
				//	'comment' => ''
				//),
				//'customsCommodityCodes' => array(),
				//'certificate' => '',
				//'transportUnitSize' => 0,
				//'minShipment' => 0,
				//'quantumOfSupply' => 0,
				//'supplyScheduleDays' => array(0),
				//'deliveryDurationDays' => 0,
				//'boxCount' => 1,
				//'shelfLifeDays' => 0,
				//'lifeTimeDays' => 0,
				//'guaranteePeriodDays' => 0
			),
			'mapping' => array(
				'marketSku' => 0
			)
		);

		$offers[] = $offer;
	}

	$data = array(
		'offerMappingEntries' => $offers
	);

	$ch = curl_init("https://api.partner.market.yandex.ru/v2/campaigns/{$campaign_id}/offer-mapping-entries/updates.json");
	curl_setopt($ch, CURLOPT_HTTPHEADER, array(
		'Authorization: OAuth oauth_token="' . $token . '", oauth_client_id="' . $client_id . '"', 
		'Content-Type:application/json'
	));
	curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data, JSON_UNESCAPED_UNICODE)); 
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
	curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
	curl_setopt($ch, CURLOPT_HEADER, false);
	$res = curl_exec($ch);
	curl_close($ch);
	
	$res = json_decode($res, true);
	print_r($res);	
}
PHP

Ответ в случаи успеха:

Array
(
    [status] => OK
)
2

Документация

В данном примере цены задаются для нескольких товаров из БД магазина.

Параметр discountBase следует передавать только в том случае, если у товара есть скидка иначе API вернет ошибку.

<?php
// Доступы к API:
$token = 'OAuth-токен';
$client_id = 'Идентификатор приложения';
$campaign_id = 'Идентификатор кампании';

// Получение товаров и БД:
$dbh = new PDO('mysql:dbname=db_name;host=localhost', 'логин', 'пароль');
$sth = $dbh->prepare("SELECT * FROM `prods` WHERE `market` = 1 LIMIT 100");
$sth->execute();
$prods = $sth->fetchAll(PDO::FETCH_ASSOC);

if (!empty($prods)) {
	$offers = array();
	foreach ($prods as $i => $prod) {
		$price = $prod['price'];

		$offer = array(
			'id' => $prod['id'],
			'price' => array(
				'currencyId' => 'RUR',
				'value' => $price
			),		
		);
		
		if ($prod['price_old'] > 0 && $prod['price_old'] > $price) {
			$offer['price']['discountBase'] = $prod['price_old'];
		}
	
		$offers[] = $offer;
	}

	$data = array(
		'offers' => $offers
	);	
	
	$ch = curl_init("https://api.partner.market.yandex.ru/v2/campaigns/{$campaign_id}/offer-prices/updates.json");
	curl_setopt($ch, CURLOPT_HTTPHEADER, array(
		'Authorization: OAuth oauth_token="' . $token . '", oauth_client_id="' . $client_id . '"', 
		'Content-Type:application/json'
	));
	curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data, JSON_UNESCAPED_UNICODE)); 
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
	curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
	curl_setopt($ch, CURLOPT_HEADER, false);
	$res = curl_exec($ch);
	curl_close($ch);
	
	$res = json_decode($res, true);
	print_r($res);	
}
PHP

Ответ в случаи успеха:

Array
(
    [status] => OK
)
3

Документация

$warehouse_id – идентификатор склада, в личном кабинете в разделе Логистика → Склады. Он указан в поле ID склада.

<?php
// Доступы к API:
$token = 'OAuth-токен';
$client_id = 'Идентификатор приложения';
$campaign_id = 'Идентификатор кампании';
$warehouse_id = 'Идентификатор склада';

// Получение товаров и БД:
$dbh = new PDO('mysql:dbname=db_name;host=localhost', 'логин', 'пароль');
$sth = $dbh->prepare("SELECT * FROM `prods` WHERE `market` = 1 LIMIT 100");
$sth->execute();
$prods = $sth->fetchAll(PDO::FETCH_ASSOC);

if (!empty($prods)) {
	$skus = array();
	foreach ($prods as $i => $prod) {
		$sku = array(
			'sku' => $prod['id'],
			'warehouseId' => $warehouse_id,
			'items' => array(
				array(
					'type' => 'FIT',
					'count' => $prod['count'],
					'updatedAt' => date('c'),
				)
			),	
		);
		
		$skus[] = $sku;
	}

	$data = array(
		"skus" => $skus
	);
	
	$ch = curl_init("https://api.partner.market.yandex.ru/v2/campaigns/{$campaign_id}/offers/stocks.json");
	curl_setopt($ch, CURLOPT_HTTPHEADER, array(
		'Authorization: OAuth oauth_token="' . $token . '", oauth_client_id="' . $client_id . '"', 
		'Content-Type:application/json'
	));
	curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");
	curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data, JSON_UNESCAPED_UNICODE)); 
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
	curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
	curl_setopt($ch, CURLOPT_HEADER, false);
	$res = curl_exec($ch);
	curl_close($ch);
	
	$res = json_decode($res, true);
	print_r($res);	
}
PHP

Ответ в случаи успеха:

Array
(
    [status] => OK
)
11.11.2022, обновлено 15.11.2022
5753

Комментарии

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

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

Метрика API
API Яндекс метрики позволяет получить информацию о посещаемости сайта и формировать отчеты, но с ограничением в 30 запросов в секунду и 5000 в сутки.
17219
+6
Авторизация на сайте через Яндекс
Сервис Яндекс.Паспорт позволяет через API реализовать авторизацию пользователя на своем сайте. После разрешения доступа...
16511
+7
Интеграция с платежной системой PayKeeper в PHP
Платежная платформа PayKeeper позволяет принимать оплату заказов по ссылке, используя данный метод можно с легкостью...
9412
+1
Публикация записей на стену сообщества VK
Для начала вы должны быть авторизированы в VK и являться администратором группы или страницы. Далее нужно создать...
31028
+9
Вход на сайт через Вконтакте
Многие соцсети позволяют создавать приложения и через API получать данные пользователей, поэтому их использует для быстрой регистрации и авторизации на сайтах.
56608
+10
Авторизация на сайте через Facebook
Инструкция, как получить данные пользователя Facebook через авторизацию OAuth.
22606
+9