Оплата заказа
После создания заказа, система предлагает оплатить его (см. рис. 3.25). При нажатии на кнопку Оплатить предлагается выбор — автоматическая оплата через сервис либо WM (Merchant.webmoney.ru), либо ONPAY(http://onpay.ru) (рис. 3.26).
Рис. 3.26. Выбор формы оплаты
Оплата Webmoney
Функция Oplata_Zakaz, расположенная в файле prgoplata/ oplata_zakaz.php (листинг 3.52), создает форму выбора оплаты.
Листинг 3.52
<?php
//Функция округления для md5 function to_float($sum)
{
if (strpos($sum, "."))
{$sum=round($sum,2);} else
{$sum=$sum.".0";}
return $sum;
}
//
function Oplata_Zakaz($Id)
{
$objResponse = new xajaxResponse();
$objResponse->assign("flag_ajax","value",’yes’);
// очистить блок centercaption1
$objResponse->assign( "centercaption1","innerHTML","<table></table>");
// очистить блок centercaption1
$objResponse->assign("center1","innerHTML","<table></table>"); require_once("my.php");
// подключиться к базе данных
require_once("mybaza.php");
$query1="SELECT * FROM zakaz WHERE id=’".$Id."’ ";
$rez1=mysql_query($query1);
$row1=mysql_fetch_assoc($rez1);
$text1.="<center>";
$text1.="<br><br>Заказ ".$row1[id]."<br>";
$text1.="<br><br>К оплате ".($row1[summa_rub]-
$row1[summa_rub_oplata])." руб.<br><br>";
// WebMoney
$text1.="<form action=’https://merchant.webmoney.ru/lmi/payment.asp’ method=’post’ target=’_blank’>
<input type=’hidden’ name=’LMI_PAYMENT_AMOUNT’ value=’".($row1[summa_rub]-$row1[summa_rub_oplata])."’>
<input type=’hidden’ name=’LMI_PAYMENT_DESC’ value=’
Оплата по заказу ".$row1[id]." в магазине’>
<input type=’hidden’ name=’LMI_PAYEE_PURSE’ value=’".LMI_PAYEE_PURSE_R."’>
<input type=’hidden’ name=’LMI_PAYMENT_NO’ value=’".$row1[id]."’>
<input type=’hidden’ name=’LMI_SIM_MODE’ value=’0′>
<input type=’submit’ id=’button_oplata_wm’ value=’Оплатить WM’
onclick=’this.disabled=true;this.value=\"Подождите…\";’>
</form>";
// end WebMoney
// ONPAY
$key=OP_KEY;
$code=$row1[id];
$summa=$row1[summa_rub]-$row1[summa_rub_oplata];
$sum_for_md5=to_float($summa);
//Создаем проверочную строку, которая защищает платежную ссылку от
// изменений
$md5check=md5("fix;$sum_for_md5;RUR;$code;yes;$key");
$url_onpay="http://secure.onpay.ru/pay/".OP_LOGIN."?pay_mode= fix&pay_for=".$code;
$url_onpay.="&price=".$summa."¤cy=RUR&convert= yes&md5=".$md5check;
$url_onpay.="&price=".$summa."¤cy=RUR&convert=yes";
//$url_onpay.="&url_success=".OP_PATH;
$text1.="<form action=’javascript:void();’ onclick=’ window.open(\"".$url_onpay."\",\"\",\"\");’>
input type=’submit’ id=’button_oplata_wm’ value=’
Оплатить ONPAY ‘
disabled=true onclick=’this.disabled=true;this.value=
\"Подождите…\";’></form>";
// end ONPAY
$text1.="<br><br><input type=button value=’Выйти’ onclick=’ document.getElementById(\"center5\").innerHTML=\"\"; document.getElementById(\"centercaption5\").innerHTML=\"\"; ‘>";
$text1.="</center>";
$zag=f_zag1("Форма оплаты");
$objResponse->assign("centercaption5","innerHTML",$zag);
$objResponse->assign("center5","innerHTML",$text1);
$objResponse->script("document.getElementById(‘center5’)
.scrollIntoView();");
$objResponse->assign("flag_ajax","value",’no’); return $objResponse;
}
?>
При нажатии на кнопку Оплатить WM клиент перенаправляется на специальный сайт Мерчант-сервиса, где производит авторизацию и затем оплату со своего кошелька. При этом передаются следующие параметры:
LMI_PAYMENT_AMOUNT — сумма платежа;
LMI_PAYMENT_DESC — назначение платежа;
LMI_PAYEE_PURSE — номер кошелька;
LMI_PAYMENT — номер платежа в магазине.
Сразу же после оплаты сам сервис связывается с сервером магазина и извещает его о том, что произведена оплата такого-то заказа на такую-то сумму. Данные передаются скрипту prgoplata/wm_result.php (листинг 3.53). Скрипт магазина изменяет статус заказа в базе данных, а также формирует уведомления по e-mail и сервису мгновенных оповещений покупателю и администратору об успешной оплате заказа.
Листинг 3.53
<?php require_once("../my.php"); require_once("../mybaza.php"); require_once("function_create_message_header4.php");
// Если это форма предварительного запроса, то идем дальше…
IF($_POST[‘LMI_PREREQUEST’]==1)
{
// 1) Проверяем, не произошла ли подмена суммы и кошелька.
if( trim($_POST[‘LMI_PAYEE_PURSE’])==LMI_PAYEE_PURSE_R )
{
echo "YES"; exit;
} else
{
echo "ERR: Неверный кошелек или сумма платежа "; exit;
}
}
// Если нет LMI_PREREQUEST, следовательно, это форма оповещения о //платеже…
ELSE
{
// Задаем значение $secret_key.
// Оно должно совпадать с Secret Key, указанным нами в настройках кошелька.
$secret_key=SECRET_KEY;
// Склеиваем строку параметров
$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’];
// Шифруем полученную строку в MD5 и переводим ее в верхний регистр
$hash = strtoupper(md5($common_string));
// Прерываем работу скрипта, если контрольные суммы не совпадают
if($hash!=$_POST[‘LMI_HASH’])
exit; else
{
$summa_rub=$_POST[‘LMI_PAYMENT_AMOUNT’];
$kod=$_POST[‘LMI_SYS_TRANS_NO’];
$id_zakaz=$_POST[‘LMI_PAYMENT_NO’];
$query1="UPDATE oplata SET data=’".date("Y-m-d H:i:s")."’,id_zakaz=’".$id_zakaz."’, kod=’".$kod."’, plat_system=’wm’,summa_rub=’".$summa_rub."’ ";
$rez1=mysql_query($query1);
$query1="INSERT INTO oplata SET data=’".date("Y-m-d H:i:s")."’,id_zakaz=’".$id_zakaz."’, kod=’".$kod."’,plat_system=’wm’,summa_rub=’".$summa_rub."’ ";
$rez1=mysql_query($query1);
$query11="SELECT summa_rub_oplata,summa_rub FROM zakaz WHERE id=’".$id_zakaz."’ ";
$summa_rub_oplata=mysql_result (mysql_query($query11),0,"summa_rub_oplata");
$summa_rub_zakaz=mysql_result(mysql_query($query11),0,"summa_rub");
$summa_rub_oplata_new=$summa_rub_oplata+$summa_rub;
$query12="UPDATE zakaz SET summa_rub_oplata=’".$summa_rub_oplata_new."’ WHERE id=’".$id_zakaz."’ ";
$rez12=mysql_query($query12);
$Id=$id_zakaz; if($summa_rub_oplata_new>=$summa_rub_zakaz)
{
$query13="UPDATE zakaz SET pay=’yes’ WHERE id=’".$Id."’ ";
$rez13=mysql_query($query13);
// создание ссылок
$data=date(‘Y-m-d’,strtotime(‘now+10days’));
$query2="SELECT id,id_tovar FROM zakaz_table WHERE id_zakaz=".$Id." ";
$rez2=mysql_query($query2); while($row2=mysql_fetch_assoc($rez2))
{
$query3="SELECT arhiv FROM tovars WHERE id=’".$row2[id_tovar]."’ ";
$link=mysql_result(mysql_query($query3),0);
$query4="SELECT id_user FROM zakaz WHERE id=’".$Id."’ ";
$id_user=mysql_result(mysql_query($query4),0);
$query5="INSERT INTO link_downloads SET id_user=’".$id_user."’, file=’".$link."’,status=’yes’,data=’".$data."’,id_zakaz=’".$Id."’ ";
$rez5=mysql_query($query5);
$id_link=mysql_insert_id();
$query6="UPDATE zakaz_table SET id_link=’".$id_link."’ WHERE id=’".$row2[id]."’ ";
$rez6=mysql_query($query6);
}
}
$query7="SELECT id FROM users WHERE type=’9′ ";
$id_user1=mysql_result(mysql_query($query7),0,"id");
$query8="SELECT id_user FROM zakaz WHERE id=’".$id_zakaz."’ ";
$id_user2=mysql_result(mysql_query($query8),0,"id_user");
// message_header4
f_create_message_header4(6,$id_zakaz, $id_user1," ".date(‘Y-m-d H:i:s’)." оплата по заказу ".$id_zakaz." на сумму ".$summa_rub." руб. ");
f_create_message_header4(6,$id_zakaz, $id_user2," ".date(‘Y-m-d H:i:s’)." оплата по заказу ".$id_zakaz." на сумму
".$summa_rub." руб. ");
}
}
?>
Источник: Петин В. А., Сайт на AJAX под ключ. Готовое решение для интернет-магазина. — СПб.: БХВ-Петербург, 2011. — 432 с.: ил. + CD-ROM — (Профессиональное программирование)