Загрузка оффлайн конверсии по яндексу на PHP

Сегодня разберемся как отправить яндексу информацию по оффлайн конверсиям. У яндекса на этот счет есть документация, но в ней не описано как сделать эту загрузку, используя 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. Пишите в комментариях получилось у вас или нет.

Комменатрии
Добавить комментарий