Яндекс метрика API, вся информация о заказах

Рассказываю, как вывести в одной таблице полную информацию о заказе: Откуда пришел пользователь, С какого устройства он пришел, суума заказа, ф.и.о. пользователя, и.т.д.

Для людей у которых есть интернет-магазин очень важно получать статистику по всем посетителям сайта и конкретно по тем, что делают заказы в этом интернет-магазине. Для решения этой проблемы есть яндекс-метрика и в частности там можно настроить e-commerce (электронную коммерцию), в документации у яндекса подробно рассказано о том, как это сделать. Если говорить простым языком, то e-commerce позволяет собирать данные по тем пользователям, что делают какие-то заказы на вашем сайте.

После того как вы настроите e-commerce, вы можете столкнуться с тем, что в метрике вы получаете не совсем полную статистику, к примеру у вас есть данные о заказе, но вы не видете данные об этом посителе (имя, телефон, почта, и.т.д.), который сделал заказ. Вы их не видите, т.к. просто не передаете яндекс-метрике. И вот для решения подобных проблем, существует api яндекс-метрики, благодоря, которой вы можете получить полную информацию о заказе.

Для взаимодействия с таким api, я написал следующий код:

<?
//Метрика
function getCodeYa($clientId){
	Header("Location: https://oauth.yandex.ru/authorize?response_type=code&client_id=".$clientId);
    die();
}

function getTokenYa($url,$peremen,$headers) {
    $post_arr=array();
    foreach ($peremen as $key=>$value) {
      $post_arr[]=$key."=".$value;
    }
    $data=implode('&',$post_arr);

    $ch=curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
	
    $code=curl_getinfo($ch, CURLINFO_HTTP_CODE);
	
	$response = array();
	$response['html']     = curl_exec($ch);
	$response['err']      = curl_errno($ch);
	$response['errmsg']   = curl_error($ch);
	$response['header']   = curl_getinfo($ch);
	
    return ["code"=>$code,"response"=>$response];
}

function getInfoYa($url,$peremen,$token){
	foreach ($peremen as $key=>$value) {
      $post_arr[]=$key."=".$value;
    }
    $data=implode('&',$post_arr);
	
	$ch = curl_init();
	curl_setopt($ch, CURLOPT_URL, $url . '?' . $data);
	curl_setopt($ch, CURLOPT_HTTPHEADER, array('Host:api-metrika.yandex.net','Authorization: OAuth '.$token,'Content-Type:application/x-yametrika+json'));	
	curl_setopt ($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6");
	curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);	
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
	$code=curl_getinfo($ch, CURLINFO_HTTP_CODE);	
	
	$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 ["code"=>$code,"response"=>$response];			
}

$clientId = "ваш id клиента";
if($_GET["code"]){
	$header = "Content-type: application/x-www-form-urlencoded";
	$ParamForEnter['grant_type'] = 'authorization_code';
	$ParamForEnter['code'] = $_GET["code"];
	$ParamForEnter['client_id'] = "ваш id клиента";
	$ParamForEnter['client_secret'] = "ваш секретный ключ";
	
	$yaInfo = getTokenYa("https://oauth.yandex.ru/token",$ParamForEnter,$header);
	$yaInfo = json_decode($yaInfo["response"]["html"],true);
	
	$ParamForInfo["ids"] = "ваш ids";
	$ParamForInfo["preset"] = "sources_summary";
	$ParamForInfo["group"] = "day";
	$ParamForInfo["dimensions"] = "ym:s:purchaseID,ym:s:trafficSource,ym:s:searchEngine,ym:s:SocialNetwork,ym:s:deviceCategory,ym:s:AdvEngine,ym:s:DirectBannerGroup,ym:s:SearchPhrase,ym:s:DirectClickBanner";
	$ParamForInfo["metrics"] = "ym:s:users,ym:s:visits,ym:s:pageviews";
	$ParamForInfo["attribution"] = "lastsign";
	$ParamForInfo["limit"] = "10000";
	$ParamForInfo["offset"] = "1";
	$ParamForInfo["pretty"] = "true";
	$ParamForInfo["date1"] = "2019-01-01";
	$ParamForInfo["date2"] = "2019-05-07"; //YYYY-MM-DD

	$token = $yaInfo["access_token"];
	
	$url = "https://api-metrika.yandex.net/stat/v1/data";

	$yaInfo = getInfoYa($url,$ParamForInfo,$token);

	$yaInfo = json_decode($yaInfo["response"]["html"],true);

}else{
	getCodeYa($clientId);
}

foreach($yaInfo["data"] as $arItem){
	$dimensions = $arItem["dimensions"];
	
	// $dimensions[0]["name"] - номер заказа
	// $dimensions[1]["name"] - Источник
	// $dimensions[2]["name"] - Поисковая система
	// $dimensions[3]["name"] - Соц. сети
	// $dimensions[4]["name"] - Устройство
	// $dimensions[5]["name"] - Рекламная система
	// $dimensions[6]["name"] - Группа объявлений в директе
	// $dimensions[7]["name"] - Поисковая фраза
	
	$InfoMetrika[$dimensions[0]["name"]]["source"] = $dimensions[1]["name"];
	$InfoMetrika[$dimensions[0]["name"]]["search_system"] = $dimensions[2]["name"];
	$InfoMetrika[$dimensions[0]["name"]]["social"] = $dimensions[3]["name"];
	$InfoMetrika[$dimensions[0]["name"]]["device"] = $dimensions[4]["name"];
	$InfoMetrika[$dimensions[0]["name"]]["adv"] = $dimensions[5]["name"];
	$InfoMetrika[$dimensions[0]["name"]]["group_direct"] = $dimensions[6]["name"];
	$InfoMetrika[$dimensions[0]["name"]]["search_phrase"] = $dimensions[7]["name"];
	$InfoMetrika[$dimensions[0]["name"]]["header_direct"] = $dimensions[8]["name"];
}


//Массив с норм названиями
$arName["search"]["Search engine traffic"] = "Поисковые системы";
$arName["search"]["Social network traffic"] = "Соц. сети";
?>

<table>
	<tr>
		<td>Дата заказа</td>
		<td>Номер заказа</td>
		<td>Отказ</td>
		<td>Комментарий</td>
		<td>Сумма заказа</td>
		<td>Источник</td>
		<td>Тип источника</td>
		<td>Поисковая фраза</td>
		<td>Устройство пользователя</td>
		<td>Рекламная система</td>
		<td>Группа объявлений директ</td>
		<td>Заголовок объявления в директе</td>
	</tr>

<?	
	$db_sales = CSaleOrder::GetList(array("DATE_INSERT" => "ASC"), $arFilter);	
	while ($ar_sales = $db_sales->Fetch())
	{ 		
		?>
		<tr <?if($ar_sales["CANCELED"] == "Y"){echo "style='background:red;'";}?>>
			<td><?=$ar_sales["DATE_INSERT"]?></td>
			<td><?=$ar_sales["ID"]?></td>
			<?if($ar_sales["CANCELED"] == "Y"){?>
				<td>Да</td>
			<?}else{?>
				<td></td>
			<?}?>
			<td><?=$ar_sales["COMMENTS"]?></td>
			<td><?=$ar_sales["PRICE"];?></td>
			
			<?
			if($arName["search"][$InfoMetrika[$ar_sales["ID"]]["source"]]){
				echo "<td>".$arName["search"][$InfoMetrika[$ar_sales["ID"]]["source"]]."</td>";
			}else{
				echo "<td>".$InfoMetrika[$ar_sales["ID"]]["source"]."</td>";
			}
			
			if($InfoMetrika[$ar_sales["ID"]]["search_system"]){
				echo "<td>".$InfoMetrika[$ar_sales["ID"]]["search_system"]."</td>";
			}else{
				echo "<td>".$InfoMetrika[$ar_sales["ID"]]["social"]."</td>";
			}
			echo "<td>".$InfoMetrika[$ar_sales["ID"]]["device"]."</td>";
			echo "<td>".$InfoMetrika[$ar_sales["ID"]]["search_phrase"]."</td>";
			echo "<td>".$InfoMetrika[$ar_sales["ID"]]["adv"]."</td>";
			echo "<td>".$InfoMetrika[$ar_sales["ID"]]["group_direct"]."</td>";
			echo "<td>".$InfoMetrika[$ar_sales["ID"]]["header_direct"]."</td>";
			?>
		</tr>
		<?
	}
?>
</table>

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

Теперь непосредственно код, который я написал, функция getCodeYa() получит специальный код от яндекса, тут важно упомянуть, что если вы делаете по моему примеру, то при настройки OAuth-авторизации вам надо указать ссылку на страницу с этим кодом.

Функция getTokenYa() получит специальный токен, для этого вам надо будет указать ваши данные от OAuth-авторизации.

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

dimensions - указываем по каким парамметрам и группировкам нам формировать отчет. К примеру ym:s:SocialNetwork - означает, что мы хотим получать в отчете информацию о том, из каких соц. сетей пришел этот посетитель. ym:s:deviceCategory - позволит нам узнать с какого устройства пришел пользователь. Тут https://tech.yandex.ru/metrika/doc/api2/api_v1/attrandmetr/dim_all-docpage/, вы можете посмотреть весь список группировок и метрик, которые вы можете указывать.

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

У меня за вывод информации с сайта отвечают строчки $db_sales = CSaleOrder::GetList(array("DATE_INSERT" => "ASC"), $arFilter); и цикл while ($ar_sales = $db_sales->Fetch()), потому что данный пример я делал на битриксе, если у вас не битрикс, то вам надо просто написать запрос к бд с заказами и в цикле вывести информацию по ним, добавив инфу из массива $InfoMetrika

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

Комменатрии
Я не робот
Отправить