Информационные технологииStfw.Ru 🔍

PHP: партнерская программа

Антон Орлов
🕛 29.12.2008, 04:07
Помните, в мартовском номере "Подводной Лодки" за прошлый год рассказывалось о PHP-сценарии простейшего Интернет-магазина? Так вот: из этой небольшой заметки вы узнаете, как дополнить его интересной возможностью - "партнерской программой", позволяющей заинтересовать других web-мастеров в рекламе вашего сетевого торгового центра.
* * *
Если вы когда-нибудь посещали Интернет-магазины, то наверняка видели в некоторых из них раздел "Партнерская программа". Суть такой программы проста - это предложение web-мастерам различных сайтов размещать на их страницах ссылки на магазин, и в том случае, если совершивший покупку посетитель пришел именно по такой ссылке, то тот, кто разместил ссылку, получает определенный процент от денег, выплаченных посетителем за товар. Программное обеспечение магазина отличает ссылки различных партнеров и может сообщать владельцу магазина, какой покупатель посредством какой ссылки пришел на его сайт.
Если вы на своем сайте также осуществляете прием заказов на что-либо от посетителей, то организовать партнерскую программу вы сможете буквально четырьмя строками кода на PHP.


Проектировка
Собственно, а что надо для организации партнерской программы - например, на базе описанного в третьем номере "Подводной Лодки" магазина? Решить две задачи:
1. Создать механизм, позволяющий различать посетителей, пришедших на сайт магазина с различных других сайтов - механизм "регистрации переходов по партнерским ссылкам".
2. Создать механизм, включающий сведения о сайте, с которого пришел заказчик, в текст заказа, отправляемого владельцу магазина.
Ну и, разумеется, необходимы договора с владельцами других сайтов о размещении ссылок на магазин и отчислении процентов за сделанные заказы.

Регистрация посетителей с партнерских сайтов
Задачу различения посетителей, пришедших на сайт магазина с различных других сайтов, можно решить двумя способами:
- выдать владельцам сайтов, переходы с которых необходимо регистрировать (то есть собственно "партнерам"), ссылки, составленные в особом формате - включив в эти ссылки переменные. Тогда в сценарий на той web-странице, на которую такие ссылки будет вести, можно включить команды работы со значениями этих переменных, и в зависимости от этих значений различать, с какого сайта пришел покупатель.
- использовать в сценарии на странице, переходы на которую нужно отслеживать, переменную $HTTP_REFERER , в которую автоматически записывается адрес web-страницы, с которой пришел посетитель.
В реальных партнерских программах обычно используется первый способ, так как второй будет регистрировать абсолютно все посещения web-страницы магазина с абсолютно всех адресов, и отличать посещения с ресурсов, участвующих в партнерской программе, от случайных переходов окажется весьма трудоемко.
Согласно стандартам, для того, чтобы через гиперссылку, ведущую на какую-нибудь web-страницу, передать программе на этой web-странице значения переменных, следует после адреса web-страницы, на которую ссылка ведет, поместить знак вопроса, имя переменной и ее значение после знака равенства - так, переход браузером по ссылке www.domen.ru?perem=100 передаст сценарию на web-странице www.domen.ru переменную perem со значением 100. (Можно передать и несколько переменных, записывая их одну за другой и разделяя амперсандом - символом "&": www.domen.ru?per1=100&per2=200). В результате в сценарии на странице окажется доступной переменная с соответствующими именем и значением.
Соответственно для того, чтобы иметь возможность выделять среди всего потока приходящих на какую-либо web-страницу тех посетителей, которые пришли от партнеров, нужно, чтобы ссылки на сайтах партнеров включали в себя определенную переменную - с разным значением для разных партнеров. Например, выглядели как "www.domen.ru?partner=ivanov" - собственно, как и выглядят реальные ссылки реальных партнерских программ.



Значение переменной, включаемой в партнерскую ссылку, именуется "идентификатором" партнера. У каждого партнера он свой.

Сохранение информации о переходе
Если в сценарии на web-странице, на которую ведет ссылка с определенной переменной, имеется команда отправки письма, то можно значение этой переменной включить в отправляемое письмо. Однако в Интернет-магазине вряд ли стоит осуществлять отправку заказа владельцу сразу же после загрузки web-страницы с магазином - в конце концов, надо же что-нибудь дать посетителю выбрать? В то же время в том случае, если отправку письма с заказом проводить не с той же самой страницы, на которую ведет партнерская ссылка, то возникает вопрос: а как, собственно, сохранить значение переданной переменной при переходах между страницами? Как "донести" значение партнерского идентификатора до команды отправки письма?
Можно, например, включить в сценарий команду вставки в web-страницу магазина скрытого поля со значением партнерского идентификатора - например, команду
echo ("<input type=hidden name=partid value=$partner");
если переменная с партнерским идентификатором имела имя partner, и соответственно изменить команду mail на странице отправки письма (в данном случае - включив в текст письма и значение переменной $partid). Можно - и если вы знакомы со сценарием Интернет-магазина, описанном в третьем номере "Подводной лодки", то труда это не составит.
Однако хотелось бы сделать более функциональную систему. В самом деле: а кто даст гарантию, что, перейдя по партнерской ссылке, посетитель обязательно сразу же отправит заказ? Естественное желание для любого человека, попавшего на доселе незнакомый сайт - получше его посмотреть, узнать, что это за ресурс и кто его авторы. И наверняка после попадания на сайт по партнерской ссылке посетитель вначале отправится на другие его страницы, посмотрит их, и лишь потом, если все же надумает, вернется в Интернет-магазин и сделает заказ. В таком случае вставка скрытого поля в страницу Интернет-магазина не будет хорошим решением: как только посетитель уйдет со страницы Интернет-магазина, на которую пришел по партнерской ссылке, так идентификатор партнера этой ссылки уже нельзя будет определить, и получить сведения о том, как посетитель узнал об этом магазине, станет невозможно.
Поэтому нужно сделать так, чтобы браузер посетителя как-то "помечался" после его перехода по партнерской ссылке и впоследствии эту пометку считывать при отправке письма. Тогда будет неважно, сколько страниц посетитель обойдет перед заказом - если его браузер имеет соответствующую метку, то он пришел по партнерской ссылке, а если нет - ну тогда нет.
Как такое реализовать? А с помощью так называемых cookies, которые и представляют из себя как раз такие вот "пометки браузеров". О том, что такое cookies и какими командами PHP с ними нужно работать, читайте на врезках, а на тех страницах сайта, на которые будут вести размещаемые партнерами ссылки, в самом их начале разместите примерно такой код:

<?php
if ($partner!="")
{ SetCookie("prtn",$partner); }
?>

В результате в том случае, если в ссылке окажется переменная partner, в браузер посетителя будет отправлен cookie под названием prtn с ее значением.
Помните, что установка cookie должна предшествовать любому выводу в выдаваемый документ - поэтому данный код должен стоять в самом начале документа, до каких-либо тэгов HTML! Если до установки cookies на web-страницу будет хотя бы что-то выведено - хотя бы пробел - то вы получите ошибку, а не cookie (рис.3).


Как только вы установите cookie, в сценариях на всех web-страницах вашего сайта автоматически появится переменная со значением, записанным в cookie (то есть идентификатором партнера) и именем $имя_cookie - в данном случае $prtn. Кроме того, это же значение будет доступно в элементах массивов $HTTP_COOKIE_VARS['имя_cookie'], $_COOKIE['имя_cookie'] - в данном случае $HTTP_COOKIE_VARS['prtn'], $_COOKIE['prtn']. (В зависимости от настроек и версии PHP переменная или элементы массивов могут быть и недоступными - так, если в файле настройки PHP установлен в on параметр register_globals, то получить значение cookie по переменной $имя_cookie будет невозможно.) Поэтому включить это значение, например, в текст отправляемого письма труда не составит - достаточно будет добавить всего одну строчку в команду mail. Так, команда отправки заказа в сценарии, описанном в 3-м номере "Подводной Лодки", будет выглядеть как

$zak="С адреса $email от заказчика с контактными данными $contact пришла заявка на приобретение товара:\n$zak\nКоличество заказанных товаров - $kolvo\nОбщая стоимость заказа - $stoim\nПартнерский идентификатор - ".$HTTP_COOKIE_VARS['prtn'];
mail ("электронный адрес владельца сайта", "Заказ на товар", $zak, "From: $email\nReply-To: $email\nContent-Type: text/plain; charset=windows-1251");?>

Вот и все. Если посетитель зашел на ваш сайт от партнера, то вы об этом узнаете из письма с заказом и сможете отправить партнеру причитающийся ему процент. Причем не будет играть роли, сразу ли после захода на страницу посетитель сделал заказ или некоторое время еще попутешествовал по сайту. Сведения о том, какой партнер его на ваш сайт привел, сохранятся в cookie и будут включены в письмо с заказом.

Если же вы укажете в третьем параметре команде установки cookie еще и его "время жизни", то сведения о партнере будут доступны команде отправки письма даже в том случае, если посетитель выключал свой компьютер в промежутке между моментами перехода по партнерской ссылке и окончательного оформления заказа. Например, решите, что если в течение недели после перехода по партнерской ссылке посетитель сделал заказ, то можно считать этот заказ сделанным под влиянием этого самого партнера.
Так как параметр "времени жизни" cookie должен быть равен числу секунд от 1 января 1970 года до момента окончания срока действия cookie, то для его установки можно сначала выполнить команду time для того, чтобы узнать, сколько секунд прошло от упомянутой даты до момента установки cookie, а потом просто прибавить к узнанной величине то количество секунд, которое cookie должен просуществовать после его установки на компьютер посетителя.

Партнерская программа: действия
Итак, чтобы добавить к вашему Интернет-магазину партнерскую программу, сделайте следующее:
1. Придумайте для каждого партнера оригинальный идентификатор и имя для переменной, в которой он будет передаваться сценариям на вашем сайте. Сообщите каждому партнеру ссылку на какую-либо страницу вашего сайта, включающую в себя эту переменную со значением, равным идентификатору, который вы для этого партнера придумали - например, вида http://www.site.ru?partner=andrey. . Эти ссылки партнеры должны будут установить на своих сайтах.
2. Разместите на странице, на которую ведут партнерские ссылки, код установки cookie со значением партнерского идентификатора. Например, если переменная, в которой передается партнерский идентификатор, именуется partner, то такой:

<?php
if ($partner!="")
{ SetCookie("prtn",$partner); }
?>

Или, если нужно установить "время жизни cookie" - такой:

<?php
if ($partner!="")
{ SetCookie("prtn",$partner, time()+нужное_число_секунд_жизни_cookie); }
?>

Эти фрагменты кода записывают значение партнерского идентификатора в cookie с именем prtn. Вы можете использовать и другое имя.
3. Используйте значение установленного cookie везде, где нужно определить, от какого партнера пришел посетитель - например, включите его в команду отправки письма с заказом. Значение cookie можно определить из одноименной cookie переменной, а также соответствующих элементов массивов $HTTP_COOKIE_VARS и $_COOKIE - например, cookie, установленные вышеприведенными сценариями, будут доступны в переменных $prtn, $HTTP_COOKIE_VARS['prtn'], $_COOKIE['prtn']. Обратите внимание, что в разных версиях PHP и при разных настройках в файле php.ini указанные переменная или элементы массивов могут быть недоступны.
4. При выполнении заказов обращайте внимание на наличие партнерского идентификатора в письме с заказом и в случае обнаружения такового - перечисляйте соответствующему партнеру оговоренный процент от стоимости заказа.

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

05.bmp
Рис.5. Сценарий, подсчитывающий заказы, сделанные с помощью партнеров.

Вы также можете создать для каждого партнера специальную "страницу статистики", на которую выводить данные этого самого счетчика. Доступ к таким страницам стоит регламентировать с помощью авторизации - например, путем использования сценария, описанного в "Подводной лодке" в конце 2002 года.
Ну, а как конкретно реализовать вышеописанное - придумайте сами: считайте это домашним заданием.
Удачи!
* * *
Врезка 1
Cookie
Cookie - это файл в специальном формате (рис.6), который присылается web-сервером браузеру посетителя сайта, расположенном на этом сервере. Cookie позволяет серверу хранить свою информацию на компьютерах посетителей и считывать ее оттуда при необходимости. Cookie отправляется браузеру при загрузке какой-либо web-страницы перед началом передачи ее содержимого.

06.bmp
Рис.6. Cookie изнутри.

Внутри cookie указывается адрес web-сервера, который этот cookie установил, имя cookie, по которому web-сервер будет потом считывать из него данные, а также так называемое "время жизни" cookie - то есть число секунд, после истечения которых с 1 января 1970 года cookie не должен считываться с компьютера посетителя (столь странная система исчисления связана с принципами измерения времени в операционных системах типа Unix, на базе которых изначально и организовывались web-серверы - точкой отсчета в Unix считается дата 01.01.1970, так сказать, "начало эпохи Unix). Ну и, разумеется, в cookie хранится информация, занесенная туда web-сервером - согласно стандартам, ее может быть не более 4 килобайт.
Web-сервер может и не записывать в cookie его "время жизни" - в этом случае cookie будет считаться недействительным с момента закрытия всех окон браузера после посещения сайта, установившего cookie.
Один web-сервер может установить в браузер посетителя и сразу несколько cookie, однако современные стандарты безопасности предусматривают, что каждый сервер может получить назад только те cookie, которые были установлены лично им, так что даже о том, какие сайты еще посещал посетитель, с помощью cookie узнать нельзя.
Место хранения cookies на компьютере посетителя зависит от модели и версии браузера, которым он пользуется. Так, браузер Microsoft Internet Explorer использует для хранения cookies специальную папку, которая по умолчанию так и называется - Cookies (рис.7). А браузер Opera все cookie помещает в один и тот же специальный файл друг за другом. Обычно по истечении "времени жизни" cookie не воспринимается web-сервером, но остается на жестком диске компьютера посетителя и удаляется оттуда лишь при очистке кэша браузера специальной командой.

07.bmp
Рис.7. Cookies, присланные браузеру Microsoft Internet Explorer,
находящиеся в служебной папке Windows.

* * *
Врезка 2
Команды, использованные в сценарии
setcookie ("имя cookie", "информация, записываемая в cookie", "время жизни cookie", "папка на сайте, сценариям в которой должен быть доступен этот cookie ", "адрес сайта, установившего cookie", "необходимость использования криптозащищенного соединения") - основная команда PHP для работы с cookie.
Для установки cookie достаточно, чтобы в этой команде были указаны два первых параметра - имя cookie и информация, помещаемая в него.
Как только cookie установлен, сценариям на всех страницах того сайта, на котором он был поставлен, становится доступны:
1. Переменная с тем же именем, что и у cookie, и тем содержимым, которое было записано в нем - если в файле настройки PHP php.ini (изменение его параметров - прерогатива администратора web-сервера) параметр register_globals имеет значение on (в PHP до версии 4.2 этот параметр включен по умолчанию, в более старших версиях его наличие зависит от воли администратора web-сервера).
2. Элемент массива $HTTP_COOKIE_VARS с тем же именем, что и у cookie, и тем содержимым, которое было записано в нем - если в файле php.ini установлен в on параметр track_vars.
3. Элемент массива $_COOKIE с тем же именем, что и у cookie, и тем содержимым, которое было записано в нем - если версия PHP больше или равна 4.1.

08.bmp
Рис.8. Файл php.ini.

Cookie должен быть отправлен в браузер до любого другого содержимого web-страницы! Если перед отправкой cookie в браузер будет послан хоть один символ (например, это возможно, если PHP-сценарий с отправкой cookie находится не в начале web-страницы или между открывающей его угловой скобкой и началом web-страницы находится пробел), то cookie установлен не будет, а сценарий выдаст ошибку.
Сookie не доступен сценариям на той web-странице, на которой он устанавливается.
В третьем параметре команды setcookie указывается "время жизни" cookie - количество секунд, после истечения которых с 1 января 1970 года cookie не должен считываться с компьютера посетителя. Если этот параметр не установлен - cookie будет доступно сценариям сайта, на котором он был установлен, до закрытия всех окон браузера посетителя.
Для установки времени жизни cookie можно сначала узнать текущее "время Unix" командой time() (просто вызвав ее без параметров), а потом просто прибавить к нему то количество секунд, которое cookie должен просуществовать после его установки на компьютер посетителя.
Для удаления cookie необходимо выполнить команду setcookie с единственным параметром - именем cookie.
Cookie могут быть организованы в массив. Для этого достаточно давать им имена, выглядящие как имена переменных массива: например, ck[1], ck[2] и т.д. При этом в браузер посетителя будет отправлен набор cookies с такими именами, однако для PHP-сценариев значения этих cookie будут доступны именно в массиве - например, в данном случае через переменные $ck[1], $HTTP_COOKIE_VARS['ck'][1], $_COOKIE['ck'][1].
Четвертый и пятый параметры (адреса папки и домена, на которых cookie должен быть доступен) необязательны. Их целесообразно использовать лишь в том случае, если есть возможность того, что cookie будет перехвачен в сценариях на других сайтах того же доменного имени, и такой перехват нежелателен (например, если cookie используется для регламентации доступа в различные папки сайта, которые администрируются разными web-мастерами). Во всех остальных случаях в команде setcookie эти адреса можно не указывать - соблюдаемого по умолчанию запрета на чтение cookies с других доменов достаточно для обеспечения конфиденциальности сохраненных в них данных.
Например, команда установки cookie может выглядеть так:
setcookie ("test", "Value", time()+3600, "/~direct/", ".site.ru", 1);
Cookie, установленный этой командой, будет доступен на сайте http://www.site.ru/~direct по защищенному соединению в течение часа после установки по имени test и станет содержать значение "Value".
Если в команде setcookie нужно пропустить какой-либо параметр (например, установить 1, 2 и 6-й параметры, оставив остальные неустановленными), то 3-й параметр следует заменить нулем, а 4-й и 5-й - пустыми строками: "":
setcookie ("test", "Value", 0, "", "", 1);

time() - сообщает, сколько секунд прошло с 0 часов 0 минут 1 января 1970 года. Расчет ведется исходя из показаний часов компьютера, на котором установлен web-сервер.

echo ("текст") - вывод на web-страницу какого-либо текста. Чтобы вывести на web-страницу значение какой-либо переменной, достаточно просто написать ее имя внутри выводимой строки: команда echo ("это цифра $a") выведет в web-страницу текст "это цифра 1", если ранее переменной $a было присвоено значение, равное единице. Однако для элементов массивов такой прием не работает - при включении их в выводимую строку следует применять операцию сложения строк - конкатенации, вызываемую знаком точки: команда echo("это цифра ".$a[1]) выведет в web-страницу текст "это цифра 1", если ранее элементу 1 массива $a было присвоено значение, равное единице. В случае необходимости использовать в выводимой строке кавычки или иные специальные символы перед этими символами следует ставить символ "\".

mail ("Кому", "Тема", "Текст сообщения", "Дополнительные заголовки") - отправка почтового сообщения. При выполнении данной команды на сервере в соответствии с указанными параметрами формируется электронное письмо и отправляется с помощью установленной на сервере почтовой программы. В качестве параметра "Кому" может выступать набор адресов, разделенных запятыми. "Дополнительные заголовки" могут быть любые (естественно, допустимые почтовыми протоколами!), разделяться они должны комбинацией символов /n, которая в PHP означает перевод строки. (Если среди "Дополнительных заголовков" не указано поле From, то оно заполняется по умолчанию, например, именем "Unprivileged User".)

PHP   Теги:

Читать IT-новости в Telegram
Информационные технологии
Мы в соцсетях ✉