Пишем result url так, чтобы система оплаты на сайте работала корректно

31 Декабря 2014 23:17

Кто читал мои предыдущие посты о настройке WebMoney для сайта на прием платежей и подключении его к Мерчанту может задаться вполне логичным вопросом: а как должна выглядеть та самая страница Result URL, которую достаточно поместить в корневой директории своего сайта, чтобы заработала система оплаты? Сразу же отмечу, что это даже не совсем страница, а сравнительно навороченный PHP-скрипт, пример которого представлен ниже:



<?php
// Соединение с БД
$link = mysqli_connect('', '', '', "tovari");
// Если запрос - предварительный, продолжаем
IF($_POST['LMI_PREREQUEST']==1) {
// Проверяем наличие товара с этим id в БД
// Если такого товара нет, появится уведомление об ошибке и работа скрипта будет прервана
$query = "SELECT id, cost FROM tovari WHERE id='$_POST[id]'";
$result = mysqli_query($link, $query);
$row = mysqli_fetch_row($result);
if(!$row[0] or $row[0]=="") {
echo "ERR: Такой товар отсутствует";
exit;
}

// Проверяем наличие подмены суммы
// Cравниваем цену товара из БД с переданной Мерчантом
// При не совпадении выводим ошибку и заканчиваем скрипт
if(trim($row[1])!=trim($_POST['LMI_PAYMENT_AMOUNT'])) {
echo "ERR: Цена указана неверно";
exit;
}
// Проверяем наличие подмены кошелька
// При несовпадении кошельков будет отображена ошибка и скрипт прервется
if(trim($_POST['LMI_PAYEE_PURSE'])!="Z300000000000") {
echo "ERR: Кошелек указан неверно";
exit;
}
// Проверяем наличие введенного email пользователя
// Если email не содержит символов, прерываем работу скрипта на ошибке
if(!trim($_POST['email']) or trim($_POST['email'])=="") {
echo "ERR: Email не указан";
exit;
}
}
// Если LMI_PREREQUEST отсутствует, значит - это оповещение о платежной операции
ELSE {
// Устанавливаем $secret_key для хеша
$secret_key = "1111222233dFBa";
// Совмещаем параметры в строку
$common_string=$_POST['LMI_PAYEE_PURSE'].$_POST['LMI_PAYMENT_AMOUNT'].$_POST['LMI_PAYMENT_NO'].
$_POST['LMI_MODE'].$_POST['LMI_SYS_INVS_NO'].$_POST['LMI_SYS_TRANS_NO'].$_POST['LMI_SYS_TRANS_DATE'].
$secret_key.$_POST['LMI_PAYER_PURSE'].$_POST['LMI_PAYER_WM'];

// Зашифруем полученную строку по алгоритму SHA256 и переведем ее на верхний регистр
$hash = strtoupper(hash("sha256",$common_string));
// При несовпадении контрольных сумм прерываем скрипт
if($hash!=$_POST['LMI_HASH']) {
echo "ERR: Ошибка ввода";
exit;
}
// Находим нужный товар в БД и вносим его в специально созданную переменную $tovar
$link1 = mysqli_connect('', '', '', "tovari");
$query1 = "SELECT tname FROM tovari WHERE id='$_POST[id]'";
$result1 = mysqli_query($link1, $query1);
$row1 = mysqli_fetch_array($result1);
$tovar = "$row1[0]";
// Подставляем данные покупки в таблицу pokupki
$link2 = mysqli_connect('', '', '', "tovari");
$query2 = "INSERT INTO pokupki SET id='$_POST[id]', odate='$_POST[LMI_SYS_TRANS_DATE]', purse='$_POST[LMI_PAYER_PURSE]', email='$_POST[email]', tovar='$tovar'";
$result2 = mysqli_query($link2, $query2);

// Отправляем указанный товар на электронную почту покупателя
$text = wordwrap("Ваш товар: ".$tovar, 70);
mail('$_POST[email]', 'Спасибо за покупку', $text);
mail('$_POST[email]', $text, 'Вы можете скачать приобретенный товар по этой ссылке: http://адрес.файла');
}
?>



Картинки до и после кода иллюстрируют происходящее в браузере до и после выполнения скрипта.

Здесь нужно еще выделить несколько моментов. Во-первых, файл "Result URL", находящийся в корне папки сайта на хосте и указываемый в соответствующей графе настроек кошелька, должен иметь расширение ".php", иначе он не будет правильно обработан модулем PHP5 на сервере. Конечно, возможно оформить страницу и в стандартном HTML-представлении, но это уже слегка отходит от темы, не так ли? Во-вторых, должно быть 2 таблицы в одной базе данных: из одной берется название товара, проверяется его цена и так далее; в другую таблицу заносится сам факт покупки (id, дата, название товара и так далее). В вышеприведенном случае БД называется "tovari" (значения '' в команде соединения нужно заменить именем хоста, логином и паролем в именно такой последовательности), а вложенные в нее таблицы - "tovari" и "pokupki". Кошелек и Secret Key, само-собой должны быть заменены собственными значениями, а также подразумевается, что по почте будет отправлен не сам файл книги, а общедоступная ссылка на него (например, генерируемая на сервисе "Dropbox").

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


Для каких товаров или услуг вы планируете использовать систему оплаты на сайте?

1 Января 2015 01:32

нечитаемо, попробуйте картинки по центру поставить

1 Января 2015 15:52

Jurij Stealth писал(а):
нечитаемо, попробуйте картинки по центру поставить


Учел и переформатировал)

1 Января 2015 17:12

Saa DJ писал(а):
Jurij Stealth писал(а):
нечитаемо, попробуйте картинки по центру поставить


Учел и переформатировал)


мда, лучше не стало)

18 Марта 2015 23:33

Отличный метод)спасибо автору)
Последние сообщения:
Мы в социальных сетях!