Api vk товары пример

Вчера для меня встала задача по выгрузке товаров из сайта напрямую в группу VK.

Соответственно на PHP по этой теме материала мало, поэтому пришлось методом проб и ошибок написать вот такую вот функцию

function sync_catalog_vk($arr)
ini_set(‘max_execution_time’, 0);
$url_vk = ‘https://api.vk.com/method/’;
foreach ($arr as $key => $value)
if ($arr[$key][‘vk_album_id’] == »)
// создание новой подборки
$buf = array();
$buf[] = ‘owner_id=-‘.$owner_id;
$buf[] = ‘title=’.urlencode($arr[$key][‘name’]);
$buf[] = ‘access_token=’.$access_token;
if ($arr[$key][‘img’] <> »)
// Запрашиваем ссылку для загрузки фотографии
$json_html = file_get_contents($url);
$json = json_decode($json_html, true);
echo ‘

‘;print_r($json);echo»;
$upload_url = $json[‘response’][‘upload_url’];
// отправляем фотографию на сервер
echo ‘
‘.$upload_url;
$ch = curl_init($upload_url); // создаем подключение
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$json_html = curl_exec($ch);
curl_close($ch);
$json = json_decode($json_html, true);
echo »;print_r($json);echo»;
$server = $json[‘server’];
$photo = $json[‘photo’];
$hash = $json[‘hash’];
// сохраняем фотографию
$json_html = file_get_contents($url);
$json = json_decode($json_html, true);
echo »;print_r($json);echo»;
$buf[] = ‘photo_id=’.$json[‘response’][0][‘pid’];
// добавляем подборку
$url = $url_vk.’market.addAlbum?’.implode(‘
$json_html = file_get_contents($url);
$json = json_decode($json_html, true);
echo »;print_r($json);echo»;
$market_album_id = $json[‘response’][‘market_album_id’];
$arr[$key][‘vk_album_id’] = $market_album_id;

$sql = ‘UPDATE ‘.$arr[$key][‘table’].’ SET vk_album_id = «‘.$market_album_id.'» WHERE ‘.$arr[$key][‘table_name_col_id’].’ = ‘.$arr[$key][‘id’];

Как выгрузить товары из InSales в VK/во Вконтакте

$query = mysql_query($sql);
foreach ($arr[$key][‘goods’] as $key2 => $value2)
if ($arr[$key][‘goods’][$key2][‘vk_market_item_id’] == »)
// добавляем товар
$buf = array();
$buf[] = ‘owner_id=-‘.$owner_id;
$buf[] = ‘name=’.urlencode($arr[$key][‘goods’][$key2][‘name’]);
$buf[] = ‘description=’.urlencode($arr[$key][‘goods’][$key2][‘description’]);
$buf[] = ‘category_id=’.$arr[$key][‘vk_category_id’];
$buf[] = ‘price=’.$arr[$key][‘goods’][$key2][‘price’];
$buf[] = ‘deleted=’.$arr[$key][‘goods’][$key2][‘deleted’];
$buf[] = ‘access_token=’.$access_token;
if ($arr[$key][‘goods’][$key2][‘img’] <> »)
// Запрашиваем ссылку для загрузки фотографии
$json_html = file_get_contents($url);
$json = json_decode($json_html, true);
echo ‘

‘;print_r($json);echo»;
$upload_url = $json[‘response’][‘upload_url’];
// отправляем фотографию на сервер
echo ‘
‘.$upload_url;
$ch = curl_init($upload_url); // создаем подключение
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$json_html = curl_exec($ch);
curl_close($ch);
$json = json_decode($json_html, true);
echo »;print_r($json);echo»;
$photo = $json[‘photo’];
$server = $json[‘server’];
$hash = $json[‘hash’];
$crop_data = $json[‘crop_data’];
$crop_hash = $json[‘crop_hash’];
// сохраняем фотографию
$json_html = file_get_contents($url);
$json = json_decode($json_html, true);
echo »;print_r($json);echo»;
$buf[] = ‘main_photo_id=’.$json[‘response’][0][‘pid’];
// добавляем товар
$url = $url_vk.’market.add?’.implode(‘
$json_html = file_get_contents($url);
$json = json_decode($json_html, true);
echo »;print_r($json);echo»;
$market_item_id = $json[‘response’][‘market_item_id’];
//переносим его в подборку
$json_html = file_get_contents($url);
echo »;print_r($json);echo»;
//обновляем vk ключ у товара
$arr[$key][‘goods’][$key2][‘vk_market_item_id’] = $market_item_id;

$sql = ‘UPDATE ‘.$arr[$key][‘goods’][$key2][‘table’].’ SET vk_market_item_id = «‘.$market_item_id.'» WHERE ‘.$arr[$key][‘goods’][$key2][‘table_name_col_id’].’ = ‘.$arr[$key][‘goods’][$key2][‘id’];

Импорт и обновление товаров из файла .YML в ВК

$query = mysql_query($sql);
// изменяем товар
$buf[] = ‘owner_id=-‘.$owner_id;
$buf[] = ‘name=’.urlencode($arr[$key][‘goods’][$key2][‘name’]);
$buf[] = ‘description=’.urlencode($arr[$key][‘goods’][$key2][‘description’]);
$buf[] = ‘category_id=’.$arr[$key][‘vk_category_id’];
$buf[] = ‘price=’.$arr[$key][‘goods’][$key2][‘price’];
$buf[] = ‘deleted=’.$arr[$key][‘goods’][$key2][‘deleted’];
$buf[] = ‘access_token=’.$access_token;
$buf[] = ‘item_id=’.$arr[$key][‘goods’][$key2][‘vk_market_item_id’];
$json_html = file_get_contents($url);
$json = json_decode($json_html, true);
echo ‘

‘;print_r($json);echo»;
print_r($json);
$buf[] = ‘main_photo_id=’.$json[‘response’][1][‘photos’][0][‘pid’];
$url = $url_vk.’market.edit?’.implode(‘
$json_html = file_get_contents($url);
$json = json_decode($json_html, true);
echo »;print_r($json);echo»;
//удаляем из всех подборок
$list = array();
foreach ($arr as $key3 => $value3)
if ($arr[$key3][‘vk_album_id’] <> $arr[$key][‘vk_album_id’])
$list[] = $arr[$key3][‘vk_album_id’];
$json_html = file_get_contents($url);
echo »;print_r($json);echo»;
//переносим его в подборку
$json_html = file_get_contents($url);
echo »;print_r($json);echo»;

В функцию мы передаем следующий массив

  • $array[$i][‘name’] — название подборки
  • $array[$i][‘img’] — ссылка на изображение подборки
  • $array[$i][‘vk_album_id’] — номер подборки
  • $array[$i][‘vk_category_id’] — номер категории товаров
  • $array[$i][‘table’] — название таблицы где хранятся подборки
  • $array[$i][‘table_name_col_id’] — название столбца в котором храниться уникальный номер подборки
  • $array[$i][‘id’] — уникальный номер подборки
  • $array[$i][‘goods’][$j][‘name’] — название товара
  • $array[$i][‘goods’][$j][‘description’] — описание товара
  • $array[$i][‘goods’][$j][‘price’] — стоимость товара
  • $array[$i][‘goods’][$j][‘deleted’] — удален товар или нет
  • $array[$i][‘goods’][$j][‘img’] — ссылка на фотографию товара
  • $array[$i][‘goods’][$j][‘vk_market_item_id’] — номер товара по VK
  • $array[$i][‘goods’][$j][‘table’] — таблица в которой хранится товар
  • $array[$i][‘goods’][$j][‘table_name_col_id’] — название поля с уникальным id товара
  • $array[$i][‘goods’][$j][‘id’] — уникальный id товара
Еще по теме:  Как закрыть лс в ВК для всех

Смысл функции в том что она обходит массив с подборками и добавляет подборку если отсутствует vk_album_id.

Затем идет перебор товаров находящихся подборке. Если в товаре отсутствует vk_market_item_id то он добавляется. Если присутствует то товар обновляется.

Источник: www.feramount.ru

Как работать с API VK Market?

Здравствуйте, по долгу службы я занимаюсь размещение товаров в самых различных группах ВКонтакте. Хотелось бы оптимизировать ручной труд без финансовых затрат и я решил добавлять товары через API. Возникает закономерный вопрос — как в принципе строится загрузка товаров? Нужно написать некий скрипт, который будет работать на сервере?

Или я могу оффлайн скармливать определенный файл импорта скрипту и он будет проходить авторизацию и т.д.? Я не прошу готовое решение — мне хотя бы толковый мануал. В методах запросов я вроде разобрался, схему кода понимаю. Остается вопрос как его запускать (если я правильно выражаюсь).

  • Вопрос задан более трёх лет назад
  • 3034 просмотра

Источник: qna.habr.com

Опыт интеграции с VK Market

Пришел клиент с интернет-магазином в VK, захотел пользоваться нашей облачной кассой, но руками пробивать чеки не захотел, в итоге была сделана интеграция с VK Market с автоматической фискализацией.

Ниже рассмотрим детали реализации и возникшие проблемы, которые решились достаточно просто и быстро, благодаря сервису VK.

#Задача

В VK есть сообщества (группы), они могут иметь функционал интернет-магазина с возможностью оформления и оплаты заказов, но оплата может быть только через VK Pay.

Для организации интернет-магазина в сообществе VK нужно перейти в Управление — Разделы и выбрать Товары — Расширенные :

Расширенные товары для интернет-магазина в VK

Заказ в админке имеет базовые поля, возможность менять статус заказа и статус оплаты, а также есть возможность вставить ссылку на чек:

Заказ в админке VK

Моя задача заключалась в интеграции облачной кассы с произвольным интернет-магазином VK на базе внутренней интеграционной платформы компании провайдера облачной кассы.

#Реализация

У VK есть механизм webhook именуемый Callbak API. При помощи этого механизма, наша интеграция может получать уведомления об интересующих нас событиях.

Заходим в сообщество как администратор, далее переходим в Управление — Работа с API — Callback API — Типы событий .

Типы событий Callback API VK

Мы в компании условились что по дефолту будем использовать статусы заказов как основание для фискализации заказов, но когда есть возможность опираться на статус оплаты использовать именно оплату. VK Market как раз предоставляет такую возможность.

Среди событий сразу замечаются 3 подходящих события:

  • Создание заказа
  • Редактирование заказа
  • Платеж через VK Pay
  • Заказ создается до оплаты
  • webhook события Платеж через VK Pay не имеет информации о заказе
  • webhook события Редактирование заказа не несет в себе всех необходимых для интеграции данных, однако является отправной точкой для запуска процесса фискализации

Редактирование заказа — изменение данных заказа, это может быть оплата заказчиком заказа либо администратор может самостоятельно изменить статус оплаты, либо иные действия, которые не являются триггерными для интеграции.

Значит редактирование заказа является для нашей интеграции триггерным событием для фискализации.

Еще по теме:  Что такое дт Вконтакте

#Webhook Редактирование заказа

В документации описан объект заказа, предположительно с аналогичными данными мне предстояла работа, но не совсем.

К слову у нас в компании уже был прототип реализации написанный годом ранее, он принимал webhook ‘и Создание заказа и Редактирование заказа , но проблема заключалась в том, что оба эти webhook ‘а приходили в разных кодировках, один в UTF8 , другой в CP-1251 . Что немного странно, а тех поддержка не помогла (об этом позже).

Webhook не присылал ключи delivery и recipient , а preview_order_items содежит 5 рандомных товаров, а нужны все товары.

Недостающие данные обязательны, но у нас уже есть id заказа, а значит есть за что зацепиться 🙂

#Достаем недостающие данные

VK имеет ключ доступа сообщества — это статичный ключ, с которым можно осуществлять запросы к VK API и действовать от именни группы. Он достаточно ограниченный по правам, но при помощи него можно достать недостающие данные, что является необходимым минимумом.

С ключом доступа сообщества можно получить заказ (достаем delivery и recipient ) и позиции заказа.

#Считаем скидки

Как оказалось, VK отдает данные с непосчитанными скидками, а значит нужно считать самому.

Ранее я уже писал код для пересчета позиций заказа на основании скидки для интеграции с , но в этот раз нужна была модификация.

На вход имеем следующие данные:

  • позиции заказа с ценами без скидки
  • скидка в рублях

Считаем процент позиции от общей суммы:

const amountByItems = this.getTotalAmountByItems(); const significances: Array> = []; this.items.forEach((value, i) => < significances.push(< i, significance: Math.round((100.0 / amountByItems) * value.amount * 100) / 100, >); >); // сортируем по увеличению значения, чтобы significances.sort((a, b) => a.significance — b.significance);

На основании посчитанного процента считаем скидку:

let remainderDiscount = totals.discount; significances.forEach((value, i) => < const < significance >= value; const item = this.items[value.i]; let < amount, price >= item; let currDiscount = totals.discount * (significance / 100.0); // если считаем последнюю позицию — применяем оставшуюся скидку // это проще сделать для самой крупной позиции if (i === this.items.length — 1) < currDiscount = remainderDiscount; amount = Math.round((amount — currDiscount) * 100) / 100; price = Math.round((amount / item.quantity) * 100) / 100; >else < amount = Math.round((amount — currDiscount) * 100) / 100; price = Math.round((amount / item.quantity) * 100) / 100; // цена позиции не может быть 0 копеек // если внезапно так случилось ставим минимально возможную if (Math.round(price * 100) < 1) < price = 0.01; >// примененную скидку пересчитываем и отнимаем от общей скидки amount = Math.round((price * item.quantity) * 100) / 100; currDiscount = item.amount — amount; > remainderDiscount -= currDiscount; this.items[value.i].price = price; this.items[value.i].amount = amount; >);

Еще по теме:  Как назначить администратора в беседе Вконтакте

Первые тесты показали что алгоритм вполне справляется со своей работой, но дальше нашего штатного тестера понесло — он смог придумать числа, на которых это перестало работать. Это оказались вполне реальные кейсы .

Проблема заключалась в малых числах и ограничении количества цифр после запятой (2 цифры на копейки).

Теперь нужно сравнить значения каждой позиции на равенство, и если есть разница надо выровнять:

const items: ItemCollection = []; this.items.forEach((item) => < // если «стоимость позиции» не равна «цена за ед.» * «количество» // выравниваем числа if (item.amount * 100 !== item.price * item.quantity * 100) < const qOld = item.quantity; let qNew = Math.floor(item.amount / item.price); let amountNew = Math.round(item.price * qNew * 100) / 100; if (amountNew !== item.amount qOld === qNew) < qNew -= 1.0; amountNew = Math.round(item.price * qNew * 100) / 100; >items.push(< . item, quantity: qNew, amount: amountNew, >); // если не сошлись количества или стоимости // тогда в предыдущей операции мы пошли на уменьешние чисел то надо вставить новую позицию if (qOld !== qNew || item.amount !== amountNew) < const price = Math.round((item.amount — amountNew) * 100) / 100; items.push(< name: item.name, price, amount: price, quantity: 1, >); > > else < items.push(item); >>);

Этот код ждет рефакторинг .

#Ссылка на чек

В заказе есть поле для вставки ссылки на чек (на одном из скринов в самом начале). Вставить ее можно через VK API все тем же ключом сообщества.

Однако, на момент разработки интеграции на странице версий VK API последней была 5.131 , но ссылка на чек требует 5.159 . Ну ладно, поставим 🙂

Последняя версия VK API на момент написания интеграции

Требуемая версия VK API на момент написания интеграции

#Техподдержка

Когда я столкнулся с разными кодировками в разных webhook ‘ах то решил обратиться с техническую поддержку VK, но оказалось бесполезно: на вопрос не ответили, ситуацию не исправили. Вот такой диалог у меня состоялся:

Общение с ТП VK

#Итог

Интеграция оказалась интересной, я глубже познакомился с TypeScript, разработал все необходимые инфраструктурные клиенты для интеграции.

Несмотря на возникшие проблемы с VK, эта интеграция была одной из простых, стабильность данных webhook ‘ов подвела, но дополнительные инструменты взаимодействия с VK API позволили легко решить проблемы. Такая вариативность есть не в каждом сервисе.

Источник: byurrer.ru

Рейтинг
( Пока оценок нет )
Загрузка ...