Найти в Дзене

Как сделать платное скачивание файлов с сайта

В статье "Как сделать скачивание файлов с сайта" мы рассказали, как правильно организовать данную функцию на своём сайте; теперь пришла очередь рассказать, как сделать данную функцию платной, т.е. что бы пользователь покупал ваш контент. !!! Имейте в виду, что для создания платного скачивания сайт должен работать по протоколу HTTPS! !!! В качестве платёжной системы в данном материале будет использована Yoomoney (не путать с Юkassa!), позволяющая принимать платежи с мобильного телефона, кошелька этой же системы или любой банковской карты. Разобравшись в принципе работы, вы сможете без проблем установить любую другую систему приёма платежей, так как общие принципы довольно схожи, разница только в условиях обслуживания. Так же будем считать, что у вас уже есть кошелёк в платёжной системе Yoomoney. Обратите внимание: по новым правилам кошелёк, получающий любые платежи и переводы, должен быть идентифицированным - это касается любой платёжной системы! Кроме того, платёжный сервис Yoomoney х
Оглавление
Web Development School: Как сделать платное скачивание файлов с сайта
Web Development School: Как сделать платное скачивание файлов с сайта

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

!!! Имейте в виду, что для создания платного скачивания сайт должен работать по протоколу HTTPS!

!!! В качестве платёжной системы в данном материале будет использована Yoomoney (не путать с Юkassa!), позволяющая принимать платежи с мобильного телефона, кошелька этой же системы или любой банковской карты. Разобравшись в принципе работы, вы сможете без проблем установить любую другую систему приёма платежей, так как общие принципы довольно схожи, разница только в условиях обслуживания. Так же будем считать, что у вас уже есть кошелёк в платёжной системе Yoomoney. Обратите внимание: по новым правилам кошелёк, получающий любые платежи и переводы, должен быть идентифицированным - это касается любой платёжной системы! Кроме того, платёжный сервис Yoomoney хотя и позволяет принимать платежи, на серьёзный бизнес он не рассчитан. Для сайта с большими продажами используйте системы Юkassa, ЮBusiness или Юkassa для самозанятых.

Файлы скачиваемого контента должны располагаться в отдельной папке, расположенной в корне сайта; будем считать, что такая папка уже существует и имеет название my_content, а в ней расположены три файла: content.zip content.jpg content.pdf .

Так же необходимо создать в базе данных новую таблицу для хранения всех данных о скачиваемых файлах (назовём её download_content) со столбцами:

id - номер строки таблицы, который понадобиться для работы PHP-функции while;

btn_name - идентификатор кнопки, по которому будет определяться запрошенный пользователем файл (содержимое атрибута value кнопки);

full_name - полное название файла, заголовок, который будет указан в карточке на странице загрузок;

name - имя скачиваемого файла, например, my_content.zip;

type - типа файла, например, .zip, потребуется для диалогового окна;

path - путь к файлу (без имени самого файла) например, /my_content/;

img_file - изображение для карточки файла, тип столбца - mediumblob;

text - пояснительный текст, информация о файле.

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

!!! Обратите внимание: для удобства восприятия кода некоторые строки имеют переносы, которые при написании кода в текстовом редакторе можно (и нужно!) убрать! Например, тег <img ... /> занимает в данном коде 5-6 строк; в текстовом редакторе следует писать всё в одну строку.

Принципиальная схема процесса платного скачивания файлов с сайта

Принципиальная схема платного скачивания выглядит так:

Принципиальная схема платного скачивания файлов (изображение с сайта web-development-school.ru)
Принципиальная схема платного скачивания файлов (изображение с сайта web-development-school.ru)

Разберём всё по порядку.

Блоки с информацией о скачиваемых файлах

Обычно на сайте организуется отдельная страница, на которую выводится весь скачиваемый контент. Для каждой позиции (файла) создаётся отдельный блок, содержащий какое-либо связанное с файлом изображение, название, пояснительную информацию и кнопку "Скачать". Вся информация о скачиваемых файлах, как уже было сказано ранее, хранится в таблице download_content, поэтому в самом начале необходимо подключиться к базе данных (смотрите справочную информацию к вашей системе управления контентом) и получить номер последней строки указанной таблицы; для CMS Joomla это будет выглядеть так:

Подключение к БД
Подключение к БД

Далее необходимо создать заголовок страницы, например, такой:

Создание заголовка
Создание заголовка

Так как при "нажатии" на любую из кнопок (для загрузки контента) на сервер будет отправляться определённая информация, все блоки (карточки) скачиваемых файлов должны быть расположены внутри формы, поэтому в следующей строке прописывается тег <form>:

Форма для отправки данных на сервер
Форма для отправки данных на сервер

Блоки с информацией о скачиваемых файлах должны содержать название, изображение, пояснительный текст, характеристики и кнопку для скачивания. Эти блоки выводятся при помощи PHP-функции while:

Вывод блоков на страницу
Вывод блоков на страницу

В начале каждого блока создаётся общий контейнер (<div> / </div>). Тег <hr> создаёт линию, отделяющую блоки друг от друга; при желании её можно убрать.

Далее создаётся запрос к БД, в результате чего скрипт получает массив из данных всех ячеек указанной в переменной $id строки. Обратите внимание, что обработка строк идёт от последней к первой, а данная переменная не только указывает номер строки, но и управляет циклом: при каждом цикле она уменьшается на единицу (последняя строка) и как только значение станет равным нулю, цикл остановится.

Первым в блоке идёт изображение; в данном случае для него установлено выравнивание по левому краю (т.е. оно будет располагаться слева), обтекание справа (float: left). Обратите внимание, что изображение (<img ... />) так же вложено в контейнер <div>...</div>.

В правой части блока вверху расположено название (<h2>...</h2>), под ним - пояснительная информация к файлу. В самом низу находится последний элемент блока - кнопка для скачивания.

Здесь нужно обратить внимание на весьма важную особенность, за счёт которой будет работать обработчик формы: все кнопки в блоках должны иметь одинаковое имя (аргумент name), в данном случае - btn, но разные значения (аргумент value): file_001, file_002, file_003 и так далее; по ним обработчик будет определять, какая кнопка "нажата" (подробно об этом будет рассказано ниже). Если вы предполагаете наличие на сайте большого количества скачиваемых файлов, то увеличьте количество нулей в начале аргумента value, например, file_000001!

!!! Здесь может возникнуть вопрос: а будет ли корректно работать скрипт с одинаковыми именами кнопок? Ответ: да, будет. Вы можете в этом убедиться, перейдя вот на эту страницу сайта: там расположены в одной форме три кнопки с одинаковыми именами, но разными значениями; при "нажатии" любой из них будет открываться страница, выводящая переданную методом POST информацию, доказывающую, что данный метод прекрасно работает.

На этом создание кода страницы закончено (не забудьте про закрывающий тег </form>!). Ещё раз уточним, что при "нажатии" пользователем на какую либо кнопку на сервер будет передан POST-запрос с данными в виде "ключ->значение", где ключом всегда будет btn (так как у всех кнопок одинаковые имена), а значением - содержимое атрибута value данной кнопки.

!!! Для этой страницы необходимо создать отдельный пункт в главном меню сайта!

Обработчик формы

Задача любого обработчика формы проста: принять запрос и произвести какое либо действие в зависимости от полученных данных. В нашем случае, после "нажатия" пользователем какой-либо кнопки (т.е. выбора файла для скачивания) этот обработчик создаёт страницу ввода данных о платеже, на которой пользователь указывает сумму, выбирает способ оплаты и запускает процесс оплаты.

Обработчик в первую очередь должен определить, какая кнопка была "нажата"; это легко сделать по значению в переменной $_POST['btn']:

Получение данных от пользователя
Получение данных от пользователя
!!! Обратите внимание: перед любыми действиями с переменными из массива $_POST необходимо проверить, была ли установлена переменная значением, отличным от null - если этого не делать, система может выдать ошибку в версиях PHP выше 7.0! Такая проверка должна проводиться перед первым использованием таких переменных в скрипте.

Далее необходимо получить id пользователя на вашем сайте, это потребуется для дальнейших операций. Как это сделать при помощи PHP-кода, вы можете узнать из справочной информации для вашей CMS; например, в Joomla нужно прописать две строки:

Получение id пользователя сайта (CMS Joomla)
Получение id пользователя сайта (CMS Joomla)

Теперь создадим переменную для дальнейших операций:

Создание переменной для дальнейших операций
Создание переменной для дальнейших операций

В результате при "нажатии" на вторую кнопку пользователем с id равным 762 в переменной $label появится примерно такое содержимое: file_001_id=762.

Далее обработчик формы создаёт страницу ввода данных об оплате. Вначале, как обычно, следует заголовок, какое-либо изображение (необязательно) и пояснительный текст:

Заголовок, изображение, текст
Заголовок, изображение, текст

Затем создаётся сама форма ввода:

Код формы ввода платёжных данных
Код формы ввода платёжных данных

Не трудно догадаться, что здесь имеется открывающий тег <div>, создающий контейнер для всей формы ввода данных, далее следует название поля ввода и само поле, которое пользователь должен обязательно заполнить (аргумент required); так же в поле предлагается ввести какую-то сумму (в данном случае 300), которую можно изменить.

Далее необходимо ввести в форму переключатель способа оплаты:

Переключатель способа оплаты для формы ввода данных
Переключатель способа оплаты для формы ввода данных

Здесь применён обычный переключатель (аргумент type='radio' для тега input), имеющий три позиции, одну из которых может выбрать пользователь. Для наглядности и улучшения оформления для каждой позиции установлено небольшое изображение (это делать необязательно, но так лучше!); в данном случае это изображения мобильного телефона, банковской карты и кошелька Yoomoney.

Обратите внимание на значения аргументов name и value: их изменять нельзя, это уже требование платёжной системы. В данном случае АС означает выбор оплаты картой, РС - кошельком Yoomoney и МС - для оплаты с мобильного.

В конце находится скрытое поле, принимающее и передающее в форме значение переменной $label, полученное в самом начале.

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

Кнопка для отправления формы
Кнопка для отправления формы

Здесь ничего сложного нет, обычный код кнопки, однако стоит обратить внимание на значение аргумента value: этот, казалось бы, бессмысленный набор символов будет использован в следующем коде.

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

Итак, с этим обработчиком формы разобрались; теперь переходим к следующему, получающему данные о платеже, введённые пользователем.

Обработчик страницы ввода данных об оплате

Этот скрипт обрабатывает данные о платеже, полученные из предыдущей формы. В его задачу входит проверка правильности введённых и подстановка недостающих значений, а так же формирование и отправка запроса на страницу платёжной системы.

Проверять входящие данные нужно хотя бы для того, что бы убедиться в правильности их ввода; кроме того, здесь вы можете установить определённую минимальную сумму и если введённое значение окажется меньше, то произойдёт возврат к предыдущей форме и вывод соответствующего предупреждения.

Если в вашей форме имеются дополнительные поля для ввода email, комментариев, адресов, номеров телефонов и т.п., то их тоже необходимо тщательно проверять во избежании использования злоумышленниками этих полей для введения вредоносного кода.

Начнём с контроля входящих данных.

Контроль входящих данных
Контроль входящих данных

В данном коде сначала проверяется, была ли установлена переменная $_POST['btn_perevod'] значением, отличным от null, далее уточняется, соответствует ли переданное значение (аргумент value кнопки) указанному в коде; если в обоих случаях будет получено true, то объявляются переменные для всех переданных данных. Этим переменным присваивается содержимое массива $_POST, которое предварительно проверяется PHP-функцией mb_eregi_replace.

Данная функция осуществляет замену символов в соответствии с регулярным выражением; при этом поддерживаются многобайтовые символы (это необходимо для работы с кириллическими символами) без учёта регистра. Это значит, что если при чтении переданной информации будет обнаружен символ, указанный в регулярном выражении, он будет заменён. Для чего это делается?

Посмотрите на пятую строку кода: здесь переменной $f_sum присваивается то, что ввёл пользователь в поле "Сумма"; это могут быть только цифры, о чём говорит регулярное выражение [^0-9]: если попадётся другой символ, он будет заменён на '' (одинарные кавычки, между которыми нет ни символов, ни пробела), т.е. просто удалён. Тоже самое происходит и с другими переменными: $f_type может принимать только заглавные буквы латинского алфавита, $f_comment текст и некоторые знаки препинания и т.д. Все остальные символы будут удалены.

!!! Обратите внимание: таким образом должны быть обработаны все входящие данные из массива $_POST.

Если сумма вводится пользователем, а не используется какое-либо фиксированное значение, то после проверки входящих данных вы можете применить конструкцию, которая будет обрабатывать введённую сумму и возвращать обратно на страницу ввода в случае, если данные введены неправильно (например, сумма окажется меньше). Такой код будет выглядеть приблизительно так:

Проверка введённого значения
Проверка введённого значения

Теперь если окажется, что введённая пользователем сумма меньше указанной (в данном случае 500), выполнение скрипта будет остановлено, а пользователю снова откроется страница ввода данных об оплате, но уже с выводом предупреждения. Что бы такая информация выводилась на экран, необходимо после заголовка страницы дописать следующее:

Вывод информации об ошибке
Вывод информации об ошибке

Принцип работы здесь очень прост: если в адресе страницы присутствует переменная mn, то будет выведено соответствующее сообщение. Так же обратите внимание на то, что небольшие части кода PHP вставляются в код HTML.

Вернёмся к обработчику. На данный момент получены и обработаны все входящие данные (массив $_POST). Теперь нужно вывести на страницу одно единственное короткое слово "Подождите..." и подготовить форму для отправки на сервер платёжной системы:

Создание формы для отправки на сервер платёжной системы Yoomohey
Создание формы для отправки на сервер платёжной системы Yoomohey

Здесь ничего сложного нет, но важно помнить, что значения аргументов type, name, value и data-type изменять нельзя!

Скрытые поля в данной форме передают следующие данные:

quickpay-form - тип формы (donate, shop, small). Данная информация большой роли не играет; donate означает, что форма создана для сбора денег, shop - форма для принятия платежей, small - просто кнопка;
receiver - номер вашего счёта (кошелька), куда придут деньги;
targets - назначение платежа* (будет указано в качестве заголовка);
sum - сумма для перевода;
paymentType - способ оплаты;
formcomment - название перевода в кошельке отправителя*;
short-dest - название на странице скачивания*;
label - метка перевода; содержит значение переменной $label, которое составлено из кода скачиваемого файла и id пользователя (в выше приведённом примере - file_001_id=762);
successURL - адрес страницы, которую нужно открыть после перевода. Указывает адрес страницы, на которую нужно перейти после обработки платежа; это должен быть адрес обработчика ответа платёжной системы (см. ниже).

* В данных полях лучше указать один и тот же текст; обычно это указатель назначения платежа или наименования товара, услуги. Поля formcomment и short-dest можно вообще не использовать.

!!! Обратите внимание: если вы используете дополнительные поля (e-mail, адрес, комментарии и т.п.), не забудьте добавить их и в этот обработчик формы так же в виде скрытых полей!

И закрывает код обработчика скрипт на языке JavaScript, автоматически отправляющий данную форму на сервер платёжной системы:

Скрипт для автоматического отправления данных формы на сервер
Скрипт для автоматического отправления данных формы на сервер

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

Что происходит после оплаты

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

!!! Обратите внимание, что получения таких подтверждений необходимо подключить данную функцию в Настройках кошелька (Настройки -> Пакеты и другие сервисы -> Сбор денег -> Уведомления -> Настроить). Здесь нужно вписать адрес вашего обработчика ответа платежной системы, получить секретный код, а так же поставить чекбокс "Отправлять уведомления". При помощи кнопки "Протестировать", находящейся здесь же, вы можете по окончании работы отправить тестовое уведомление и проверить работу всей установленной на сайт системы оплаты.

Данные, передаваемые в уведомлении

Подробно обо всех уведомлениях вы можете узнать в справочной информации платёжной системы; здесь рассмотрим только основное.

В уведомлении вы получите:

  • информацию о переводе: дату и время (поле 'datetime');
  • идентификатор проведённой операции (поле 'operation_id');
  • сумму, которую система списала у отправителя (поле 'amount');
  • сумму, которая была зачислена в кошелёк (поле 'withdraw_amount');
  • номер кошелька отправителя (поле 'sender');
  • метку платежа (значение переменной $label);
  • SHA-1 hash параметров уведомления (поле 'sha1_hash', см. ниже);
  • unaccepted - информация о зачислении (поле 'unaccepted');
  • запрошенные вами дополнительные данные о пользователе.
Ещё раз напомним, что для осуществления безопасных платежей и использования всех описанных функций сайт должен работать по протоколу HTTPS!

Обработчик ответа платёжной системы

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

Проверка ответа на подлинность и безопасность

Итак, как было сказано выше, вначале следует проверка полученных данных:

Проверка данных, полученных в уведомлении от платёжной системы
Проверка данных, полученных в уведомлении от платёжной системы

Данный код проверяет, была ли установлена переменная из массива $_POST значением, отличным от NULL (об этом было сказано ранее) и в случае true присваивает это значение другой переменной для дальнейших операций; если false, то этой переменной присваивается пустое значение (не путать с NULL!).

Далее при помощи PHP-функции mb_eregi_replace и регулярного выражения проверяется безопасность полученных данных (функция удаляет любые символы, не соответствующие регулярному выражению):

Проверка поступивших данных на безопасность
Проверка поступивших данных на безопасность

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

Проверка подлинности ответа от платёжной системы
Проверка подлинности ответа от платёжной системы

Переменная $secret получает секретный код - тот самый, который вы получили при настройке Личного кабинета. Далее составляется строка из обработанных ранее переменных с разделителем в виде символа &.

В следующей строке кода используется PHP-функция sha1() , которая возвращает SHA1-хеш строки, вычисленный по алгоритму US Secure Hash Algorithm 1 (подробно об этой функции читайте здесь). В результате переменная $hash_ctrl, изначально имеющая строку, собранную из обработанных переменных, получает SHA1-хеш этой строки.

В заключение сравниваются значения двух переменных: полученной $sha_ctrl и $sha1_hash, содержащей значение, присланное в  уведомлении ($_POST['sha1_hash']): если значения совпали - полученный ответ подлинный; при этом создаётся переменная $h_value cо значением 'Y' (подлинный ответ) или  'N' (поддельный ответ). Это пригодится чуть позже.

!!! Обратите внимание на то, что в данном случае используется оператор сравнения "Тождественно равно" (===), а не просто "Равно" - это важно.

!!! При необходимости здесь может быть применена и третья переменная, например, 'Z'. Об этом читайте ниже.

Обработка даты и времени

Это необязательная часть кода, которая приводит дату и время в привычный вид: ЧЧ:ММ:СС (24 часовая система) и ДД:ММ:ГГГГ. Дело в том, что информация о времени и дате транзакции приходит от платёжной системы не в самом удобно читаемом варианте, поэтому есть её переделать.

Обработка даты и времени
Обработка даты и времени

В начале переменная $dt_arr при помощи PHP-функции str_split() получает массив из символов строки в переменной $datetime (время транзакции). Далее переменные $date и $time получают соответствующие значения уже в обработанном виде.

Получение названия файла и ID пользователя

Напомним, что переменная $label содержит данные о файле и пользователе, скачивающем данный файл (см. раздел "Обработчик формы"); теперь пришло время разделить эти данные:

Получение названия файла и ID пользователя
Получение названия файла и ID пользователя

В начале проверяется наличие данных в исходной переменной: если их там по какой-то причине не окажется, на экран будет выведено сообщение, а выполнение скрипта остановлено.

Далее переменная $arr_lbl при помощи PHP-функции str_split получает массив из символов текста в переменной $label, после чего составляются два отдельных значения - название файла ($name_value) и id пользователя ($id_value).

!!! Обратите внимание: если вы используете бóльшее количество нулей в названии файла (см. раздел "Блоки с информацией о скачиваемых файлах"), то не забудьте отредактировать код составления строк для переменных $name_value и $id_value, а так же переменную $arr_lbl[15] (см. ниже).

И последний вопрос: для чего нужна конструкция if/else? Дело в том, что количество пользователей, зарегистрированных на сайте, может быть разным, а значит, если их станет более тысячи, то значение id станет четырёхзначным; именно это и проверяет данная конструкция: в случае, если в id присутствует четвёртый символ, он будет дописан в соответствующую переменную. Если у вас количество пользователей может превысить (или уже превысило) 9999, то допишите ещё одну такую же конструкцию для пятого символа и так далее.

Сохранение полученных и обработанных данных

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

Откройте phpMyAdmin и вручную создайте таблицу (назовём её admin_yoomoney) со следующими столбцами (не путайте очерёдность!):

id - то будет порядковый номер строки БД);

h_value - в данной ячейке будет храниться значение переменной $h_value ('Y' или 'N' проверка подлинности);

notification_type - ячейка для хранения значения одноимённой переменной (тип операции, вариант оплаты);

withdraw_amount - сохранение суммы, списанной у пользователя;

amount - сохранение суммы, зачисленной на ваш счёт;

operation_id - сохраняет идентификатор операции;

date - сохраняет значение переменной $date (отредактированная дата транзакции);

time - сохраняет значение переменной $time (отредактированное время транзакции);

codepro - сохранение кода протекции (см. подробно в инструкциях Yoomoney);

sender - сохранение номера кошелька отправителя;

currency - код валюты (для рублей - всегда 643);

unaccepted - хранит данные о зачислении или не зачислении перевода (см. подробно в инструкциях Yoomoney);

code_file - полученное из $label имя файла;

id_user -полученный из $label идентификатор пользователя.

Теперь самое время произвести подключение к базе данных; у каждой CMS для этого есть свои методы, поэтому воспользуйтесь (при необходимости) справочной информации к своей Системе Управления Контентом; ниже мы приведём вариант кода для CMS Joomla:

CMS Joomla: подключение к базе данных
CMS Joomla: подключение к базе данных

Далее создаётся запрос к базе для получения номера последней строки:

CMS Joomla: создание запроса для получения номера последней строки
CMS Joomla: создание запроса для получения номера последней строки

Аналогичный SQL-запрос будет выглядеть так:

SQL-запрос для получения номера последней строки
SQL-запрос для получения номера последней строки

В любом случае переменная $id получает соответствующее значение, но если в таблице ещё нет сторок, значение окажется NULL, поэтому следует добавить вот такую конструкцию:

Изменение значения переменной
Изменение значения переменной

Выше указанный код либо присвоит переменной $id значение 1, либо увеличит уже имеющееся на единицу.

Теперь осталось составить запрос на внесение данных в базу:

CMS Joomla: запрос к базе данных на внесение новой строки
CMS Joomla: запрос к базе данных на внесение новой строки

Обычный SQL-запрос в данном случае будет такой:

SQL-запрос к базе данных на внесение новой строки
SQL-запрос к базе данных на внесение новой строки

Отправка сообщения пользователю

Теперь нужно отправить сообщение пользователю о том, что он может скачать купленный файл в Личном Кабинете. Здесь применяется стандартная система отправления email с сайта; для разных CMS код может различаться, поэтому стоит обратиться к документации своей системы управления контентом. В данной статье приведём пример кода для CMS Joomla; тем, кто использует другие CMS, важно понять основной смысл происходящего.

!!! Обратите внимание: изменять данный код (в т.ч. имена полей, таблицы и переменной $to) нельзя!

Сначала нужно получить e-mail пользователя, который он указал при регистрации; это можно легко сделать по его id:

CMS Joomla: получение e-mail пользователя по его id
CMS Joomla: получение e-mail пользователя по его id

!!! Если у вас используется другая CMS, ваша задача получить значение для переменной $to в виде адреса электронной почты пользователя.

Далее создаём текст сообщения (письма):

Создание сообщения для пользователя
Создание сообщения для пользователя

Если значение переменной $h_value равно Y, т.е. ответ платёжной системы прошёл SHA-контроль, пользователю будет отправлено сообщение о том, что он может скачать купленный файл; если же значение указанной переменной N, пользователю будет отправлено сообщение с извинениями.

Далее осталось создать недостающие переменные и составить код отправки.

CMS Joomla: создание переменных для отправки e-mail
CMS Joomla: создание переменных для отправки e-mail

Тут всё просто: $config получает файл конфигурации (CMS Joomla), затем из него в переменную $email_from вводится адрес почты сайта; переменная в последней строке получает текст для темы.

И последнее:

Отправка сообщения пользователю
Отправка сообщения пользователю

В начале переменная $message получает тело письма, после чего переменной $headers передаются необходимые для отправки заголовки. В конце PHP-функция mail осуществляет отправку письма.

Страница личных загрузок пользователя

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

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

Принцип работы здесь прост: сначала определяется id пользователя, запрашивающего страницу, затем начиная с конца перебираются строки таблицы БД, хранящей все данные о транзакциях; при этом принадлежащие данному пользователю загрузки определяются по последнему столбцу id_user. Каждое найденное совпадение оформляется соответствующим образом.

CMS Joomla: страница личных загрузок пользователя
CMS Joomla: страница личных загрузок пользователя

В четвёртой строке переменная $user_id получает ID пользователя, после чего производится подключение к БД с проверкой соединения и создаётся запрос для получения номера последней строки, который вводится в переменную $row_num. Последние строки кода создают на странице форму и заголовок.

Далее при помощи PHP-функции while производиться переборка строк таблицы БД:

Обработка строк таблицы БД
Обработка строк таблицы БД

Создаваемая в начале переменная $i_com получит значение 1 если обнаружится хотя бы один файл для вывода; если же значение останется без изменений, то на страницу будет выведена фраза "Загрузок не найдено..." (см. в конце скрипта). Далее запускается цикл while, управляет которым переменная $row_num: во время выполнения каждого цикла её значение будет уменьшаться на единицу, в результате чего при значении равным нулю цикл остановится.

Во время выполнения каждого цикла создаются один или два запроса к базе данных: первый получает строку из таблицы admin_yoomoney, и если значение в столбце id_user совпадёт с id пользователя (т.е. пользователь оплатил скачивание данного файла), будет произведён второй запрос, уже к таблице download_content, в результате чего будут полученные данные, которые необходимо вывести на страницу. Далее значение переменной $row_num уменьшается на единицу и запускается следующий цикл.

Если же значение в id_user не совпадают с id пользователя, то никаких данных о файле на страницу не выводятся, а только уменьшается значение $row_num и запускается цикл обработки следующей строки.

Вывод данных о файле

Рассмотрим подробно код вывода блока для скачивания файла на странице личных загрузок пользователя (его необходимо вписать в выше указанный код вместо фразы "вывод блока файла":

Блок для скачивания файла
Блок для скачивания файла

Весь блок помещён в контейнер <div> ... </div> (2 и последняя строки): так с ним удобнее работать при настройке внешнего вида.

Первым делом следует запрос к БД download_content, содержащей сведения о скачиваемых файлах. Далее, как и в карточке файла на странице загрузок (см. в самом начале статьи), в левой части выводится изображение (по тому же принципу). Справа от изображения располагается название файла и одна из двух кнопок:

Изображение на кнопке для скачивания
Изображение на кнопке для скачивания

Синяя (можно сделать зелёную), позволяет скачать оплаченный файл, а красная, которая, в принципе, является не кнопкой (с точки зрения HTML), а лишь её изображением, ничего не скачивает, поэтому для неё необходимо обязательно прописать (в атрибуте title или где-то рядом при помощи тегов <p> ... </p>) информацию почему пользователь не может в данный момент произвести скачивание; так как для определения цвета кнопки используется значение h_value из строки базы данных, то красная "кнопка" может означать ошибку в ответе сервера платёжной системы.

!!! В этом случае пользователь может обратиться к администратору вашего сайта, однако будет намного лучше, если подобные ошибки будут выявляться администратором до обращений клиентов.

Обратите внимание на то, что на странице личных загрузок пользователя, так же как и на странице загрузок, все кнопки имеют одинаковое имя (аргумент name), но разные значения (атрибут value); именно по этому значению и будет определяться, какую кнопку "нажал" пользователь (см. раздел "Блоки с информацией о скачиваемых файлах").

Вывод диалогового окна для загрузки

И последнее, что осталось сделать - прописать код обработчика, который будет после "нажатия" кнопки выводить пользователю диалоговое окно с предложением скачать выбранный файл; использование отдельного обработчика важно ещё по той причине, что пользователю не виден адрес запрашиваемого контента.

Рассмотрим данный код на примере CMS Joomla:

Вывод диалогового окна для загрузки файла
Вывод диалогового окна для загрузки файла

В начале, что вполне обычно для любого обработчика, проверяется наличие переданной переменной (значение, отличное от NULL) $_POST['btn_component'] если данная переменная окажется NULL, то будет выведено сообщение и выполнение скрипта прекращено.

В следующей строке переменная $value получает данные, переданные в $_POST['btn_component']; в данном случае это значение аргумента value "нажатой" пользователем кнопки.

После подключения к БД, создаётся запрос к таблице download_content, причём искомая строка идентифицируется не по её номеру, а по столбцу btn_name. Из данной строки выбираются данные из ячеек name, type и path; эти значения подставляются в заголовки, передаваемые браузеру пользователя, при получении которых будет создано диалоговое окно с предложением скачать запрошенный файл. Имя файла останется таким же, как и на сайте, но при желании можно подставить другое, изменив значение в filename.

Как тестировать систему оплаты

Первым делом зайдите в свой кошелёк, выберите Настройки -> Пакеты и другие сервисы -> Сбор денег -> Уведомления -> Настроить и кликните на кнопку "Протестировать" (см. раздел "Что происходит после оплаты"). Через несколько секунд откройте таблицу БД admin_yoomoney: если всё сделано правильно, то в ней должна появиться новая строка. Это контрольная строка, поэтому не все ячейки будут иметь какие-либо данные, но в любом случае вы будете знать, что основная часть работы выполнена правильно.

Далее тестируется проведение платежа - т.е. те действия, которые будет выполнять пользователь. Для этого вам понадобиться другой кошелёк этой платёжной системы (самому себе оплата не пройдёт!) или карта.

!!! Перед тестированием на время измените заголовок одного из скачиваемых файлов (на странице "Загрузки") на "Тестовый платёж"! Это нужно для того, что бы система понимала, что вы делаете в данном случае. По окончании не забудьте вернуть правильное название обратно.

Войдите на сайт как пользователь (желательно для этой цели иметь дополнительный аккаунт, который не будет восприниматься как аккаунт администратора или SuperUser), откройте страницу "Загрузки", выберите переименованный на время файл ("Тестовый платёж"), нажмите кнопку "Скачать"; у вас должна открыться страница ввода платёжных данных. Введите сумму (небольшую, например, 2 или 10 рублей), выберите соответствующий способ оплаты и нажмите "Оплатить".

Теперь у вас должна открыться страница платёжной системы, где вы проведёте платёж. После платежа вы получите уведомление на вашу почту. Откройте PhpMyAdmin и проверьте, все ли данные правильно записаны в ячейках новой строки.

Теперь откройте через главное меню страницу "Мои загрузки" - здесь должна появиться карточка только что "купленного" вами контента и синяя (зелёная) кнопка. Кликните на неё и через пару секунд долно появится диалоговое окно с предложением загрузки. 

Если весь указанный сценарий выполнился - вы всё сделали правильно.

И последнее: протестируйте работу красной "кнопки" (как вы помните, это не на самом деле это не кнопка, а только её изображение). Для этого в PhpMyAdmin измените значение в таблице с "Y" на "N" и проверьте, какую "кнопку" выводит страница "Мои загрузки".

По окончании удалите данную строку.

Что сделать дополнительно

Так "Загрузки" и "Мои загрузки" это обычные страницы, то не забывайте об обязательных атрибутах любых страниц: тегах Description, Keywords, Title, а так же Robots: для "Загрузок" обязательно укажите "index, follow" (что бы роботы поисковых систем обходили страницу и переходили по ссылкам), а для "Мои загрузки" наоборот - "noindex, nofollow": там индексировать нечего.

Не забывайте указывать метатеги для изображений - это так же важно для поисковиков.

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

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

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

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

*Как вносить в таблицу БД различные данные, включая изображения, будет отдельно рассказано в другой статье. Подписывайтесь на наш канал!

Удачной вам работы!

#web development school #платное скачивание фалов #как сделать #платный контент #система оплаты контента