Сегодня разберемся как отправить яндексу информацию по оффлайн конверсиям. У яндекса на этот счет есть документация, но в ней не описано как сделать эту загрузку, используя PHP.
Я не буду рассказывать какие манипуляции надо провести в самой яндекс метрике, потому что для этого достаточно документации Яндекса. Если у вас вдруг с этим возникнут трудности, то пишите в комментарии, постараемся вместе разобраться.
Итак, приступим. Для начала вам необходимо каждый раз отправлять яндексу о пользователях на вашем сайте, для этого используйте этот код на js:
<script> $(document).ready(function(){ window.onload = function() { yaCounter123456789.setUserID(57); } }); </script>
Объясню, что к чему данный код, вы вставляете после подключения вашей яндекс метрики.
yaCounter123456789 - цифры 123456789, в данном случае это id вашего счетчика
Цифра 57 - в данном случае это id пользователя на вашем сайте. Т.е. вместо 57 вам надо подставить id пользователя.
Теперь прежде чем перейти к отправке данных по оффлайн конверсии, надо зарегистрировать ваше приложение на oauth.yandex.ru, зарегистрируйте и поставьте там ко всему доступ. Также укажите там путь к вашему скрипту отправки данных.
Перейдем к самой отправки оффлайн конверсии, я приведу пример кода для начала, а уже под кодом распишу, что за что отвечает. Мой пример этого кода будет ориентирован на битрикс, но не переживайте, вы сможете его использовать на сайте с любой CMS или даже просто самописном сайте, я дам для этого пояснения. Итак собственно код PHP:
<? function getCodeYa($clientId){ Header("Location: https://oauth.yandex.ru/authorize?response_type=code&client_id=".$clientId); die(); } function getTokenYa($query) { $header = "Content-type: application/x-www-form-urlencoded"; $opts = array('http' => array( 'method' => 'POST', 'header' => $header, 'content' => $query ) ); $context = stream_context_create($opts); $result = file_get_contents('https://oauth.yandex.ru/token', false, $context); $result = json_decode($result); return $result->access_token; } function getInfoYa($url,$token,$data,$boundary){ $ch=curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST'); curl_setopt($ch, CURLOPT_HTTPHEADER, array('Host:api-metrika.yandex.net','Authorization: OAuth '.$token,"Content-Type: multipart/form-data; boundary=------------------------$boundary","Content-Length: " . strlen($data))); $response = array(); $response['html'] = curl_exec($ch); $response['err'] = curl_errno($ch); $response['errmsg'] = curl_error($ch); $response['header'] = curl_getinfo($ch); curl_close($ch); return $response; } $clientId = "Ваш id клиента"; if($_GET["code"]){ $passw = "Ваш секретный ключ"; $ParamForEnter['grant_type'] = 'authorization_code'; $ParamForEnter['code'] = $_GET["code"]; $ParamForEnter['client_id'] = $clientId; $ParamForEnter['client_secret'] = $passw; $ParamForEnter = http_build_query($ParamForEnter); $getToken = getTokenYa($ParamForEnter); //Данные заказа $arFilter = Array(">=DATE_INSERT" => "22.06.2019 00:00:01","PAYED"=>"Y"); $db_sales = CSaleOrder::GetList(array("DATE_INSERT" => "ASC"), $arFilter); $target = 1298643; $orders = "UserId,Target,DateTime,Price,Currency".PHP_EOL; while ($ar_sales = $db_sales->Fetch()) { $orders .= $ar_sales["USER_ID"].",".$target.",".strtotime($ar_sales["DATE_INSERT"]).",".$ar_sales["PRICE"].",".$ar_sales["CURRENCY"].PHP_EOL; } $token = $getToken; $counterId = 123456789; //id счетчика $boundary = "7zDUQOAIAE9hEWoV"; $filename = 'data.csv'; $data = "--------------------------$boundary\x0D\x0A"; $data .= "Content-Disposition: form-data; name=\"file\"; filename=\"$filename\"\x0D\x0A"; $data .= "Content-Type: text/csv\x0D\x0A\x0D\x0A"; $data .= $orders . "\x0A\x0D\x0A"; $data .= "--------------------------$boundary--"; $url = "https://api-metrika.yandex.net/management/v1/counter/".$counterId."/offline_conversions/upload?client_id_type=USER_ID&oauth_token=".$token; $yaInfo = getInfoYa($url,$token,$data,$boundary); $yaInfo = json_decode($yaInfo["response"]["html"],true); ?><pre><?print_r($yaInfo)?></pre><? }else{ getCodeYa($clientId); } ?>
Перейдем к коду, который располагается после всех трех функций, в процессе мы будем обращаться к этим функциям и я объясню за что они отвечают.
Переменная $clientId - это id вашего клиента на яндекса можете посмотреть, там где вы зарегистрировали ваше приложение oauth.yandex.ru
Далее идет условие, если у вас еще нет уникального кода от яндекса для получения токена, то его надо получить, для этого используется функция getCodeYa($clientId) из параметров в эту функцию вы передаете только id клиента.
После того как получили этот код, вам необходимо получить токен, для этого служит функция getTokenYa, в нее надо передать такие параметры как: grant_type будет равен authorization_code код от яндекса, который вы получили, он вернется вам гетовым параметром $_GET["code"], после выполнения функции getCodeYa client_id - $clientId и client_secret - $passw их вы тоже найдете в вашем зарегистрированном приложении на oauth.yandex.ru
Теперь надо сформировать данные по заказу. Переменные $arFilter и $db_sales используются для фильтра в Битриксе, если вы берете заказы не из сайта на битриксе, то пропустите их.
Переменная $target - номер вашей цели, который вы можете посмотреть в яндекс метрике. Цель заданная для оффлайн конверсии.
Переменная $orders содержит информацию о заказах, в первой строчке мы указываем колонки, а позже в цикле из базы данных записываем в эти колонки значения заказа. Опять же у меня этот пример для битрикса, если у вас не Битрикс, то просто сделайте цикл с выводом заказов из вашей базы, я объясню, что колонки означают.
UserId - это id клиента на вашем сайте Target - номер цели DateTime - время заказа в unix формате Price - сумма заказа Currency - валюта
Переменная $token - ваш токен, который вы получили функцией getTokenYa $boundary - это разделитель $counterId - id счетчика в метрике
После идет отправка всех заголовков и информации о вашем заказе через функцию getInfoYa($url,$token,$data,$boundary);
На этом все, в ответе вы получите результат операции, если все успешно, то вы среди ответа увидите uploading. Пишите в комментариях получилось у вас или нет.