Подключение приема платежей в автоматическом режиме через ONPAY Merchant API
Cкрипт подключения приема платежей в автоматическом режиме через ONPAY Merchant API находится в файле prgoplata/onpay.php (листинг 3.62).
Листинг 3.62
<?php
// подключение к файлу настроек
require_once("../my.php");
// подключение к базе данных
require_once("../mybaza.php");
// подключение к файлу формирования доступа к товарам
require_once("../arhivtovar/create_new_htaccess.php");
$key=OP_KEY;
$ff=fopen("1.txt","w");
//Ответ на запрос check от OnPay (проверка наличия заказа в базе данных)
if($_REQUEST['type']==’check’)
{
$error=0;
$order_amount=$_REQUEST['order_amount'];
$order_currency=$_REQUEST['order_currency'];
$code=$pay_for=$_REQUEST['pay_for'];
$md5=$_REQUEST['md5'];
$sum=floatval($order_amount);
$code=intval($code); //Код должен быть целым числом
//Проверка кода и переводимой за него суммы
$txt=$order_amount.";".$order_currency.";".$code.";".$md5.";".$sum.";"; fwrite($ff,$error.$txt);
fclose($ff);
//поиск заказа в базе
$query1="SELECT * FROM zakaz WHERE id=’".$code."’;";
$rez1=mysql_query($query1); if($rez1)
{ if(mysql_num_rows($rez1))
{
$rezult=answer($_REQUEST['type'],0,$pay_for,
$order_amount,$order_currency,’OK’);
//Отвечаем серверу OnPay, что все хорошо, можно принимать деньги
} else
$error=1;
} else
$error=1; if($error==1)
$rezult=answer($_REQUEST['type'],2,$pay_for,
$order_amount,$order_currency,’Error code pay_for: ‘.$code);
//Сообщаем ошибку
}
//Ответ на запрос pay от OnPay if($_REQUEST['type']=="pay")
{
$onpay_id=$_REQUEST['onpay_id'];
$code=$pay_for=$_REQUEST['pay_for'];
$order_amount=$_REQUEST['order_amount'];
$order_currency=$_REQUEST['order_currency'];
$balance_amount=$_REQUEST['balance_amount'];
$balance_currency=$_REQUEST['balance_currency'];
$exchange_rate=$_REQUEST['exchange_rate'];
$paymentDateTime=$_REQUEST['paymentDateTime'];
$md5=$_REQUEST['md5'];
$error=”;
//Проверка входных данных
$txt=$onpay_id.";".$code.";".$order_amount.";".$order_currency.";";
$txt.=$balance_amount.";".$balance_currency.";".$exchange_rate.";";
$txt.=$paymentDateTime.";".$md5; if (empty($onpay_id))
{
$error .="Не указан id<br>";
} else
{
if (!is_numeric(intval($onpay_id)))
{$error .="Параметр не является числом<br>";}
}
if (empty($order_amount))
{$error .="Не указана сумма<br>";}
else
{
if (!is_numeric($order_amount))
{$error .="Параметр не является числом<br>";}
}
if (empty($balance_amount))
{$error .="Не указана сумма<br>";}
else
{
if (!is_numeric(intval($balance_amount)))
{$error .="Параметр не является числом<br>";}
}
if (empty($balance_currency))
{$error .="Не указана валюта<br>";}
else
{
if (strlen($balance_currency)>4)
{$error .="Параметр слишком длинный<br>";}
}
if (empty($order_currency))
{$error .="Не указана валюта<br>";}
else
{
260
if (strlen($order_currency)>4)
{$error .="Параметр слишком длинный<br>";}
} Часть II. Проект интернет-магазина
if (empty($exchange_rate))
{$error .="Не указана сумма<br>";}
else
{
if (!is_numeric($exchange_rate))
{$error .="Параметр не является числом<br>";}
}
//********** //Если нет ошибок
if (!$error)
{
//** fwrite($ff,$txt); fclose($ff);
//** if(is_numeric($code))
{//Если pay_for число
$code=intval($code); //Код должен быть целым числом
$sum=floatval($order_amount);
//Проверяем, что код есть в базе данных, и оплачиваемая сумма не меньше допустимой
$query1="SELECT * FROM zakaz WHERE id=’".$code."’;";
$rez1=mysql_query($query1); if(mysql_num_rows($rez1) == 1)
{
//Создаем строку хэша с присланных данных
$md5fb=strtoupper(md5($_REQUEST['type'].";".$pay_for.";".$onpay_id.";".$order_ amount.";".$order_currency.";".$key.""));
//Сверяем строчки хеша (присланную и созданную нами)
if ($md5fb != $md5)
{$rezult=answerpay($_REQUEST['type'],7,$pay_for,$order_amount,$order_currency,’Md5 signature is wrong’,$onpay_id);}
else
{
// изменение статуса заказа
$Id=$code; require_once("mybaza.php");
$query1="UPDATE zakaz SET pay=’yes’ WHERE id=’".$Id."’ ";
$rez1=mysql_query($query1);
// создание ссылок
$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);
}
// изменения в файле .htaccess
create_new_htaccess();
//******************** if ($rezult1)
//Если занесение информации в базу данных прошло без ошибок,
{
$rezult=answerpay($_REQUEST['type'],0,$pay_for,
$order_amount,$order_currency,’OK’,$onpay_id);
} else
{
$rezult=answerpay($_REQUEST['type'],3,$pay_for,
$order_amount,$order_currency,’Error in mechant database queries: operation or balance tables error’,$onpay_id);
}
}
} else
{
$rezult=answerpay($_REQUEST['type'],3,$pay_for,
$order_amount,$order_currency,’Cannot find any pay
rows acording to this parameters: wrong payment’,$onpay_id);
}
}
else {
//Если pay_for не правильный формат
$rezult=answerpay($_REQUEST['type'],3,$pay_for,
$order_amount,$order_currency,’Error in parameters data’,$onpay_id);
}
}
//Если есть ошибки
else
{ fwrite($ff,$error.$txt); fclose($ff);
$rezult=answerpay($_REQUEST['type'],3,$pay_for,
$order_amount,$order_currency,’Error in parameters data’,
$onpay_id);
}
}
echo $rezult;
//Функция выдает ответ для сервиса onpay в формате XML на pay-запрос
function answerpay($type,$code,$pay_for,$order_amount,$order_currency,$text,
$onpay_id)
{
global $key;
$md5=strtoupper(md5("$type;$pay_for;$onpay_id;$pay_for;$order_amount;
$order_currency; $code;$key"));
return "<?xml version=\"1.0\" encoding=\"UTF-8\"?".">\n<result>\n<code>".
$code."</code>\n <comment>".$text."</comment>\n<onpay_id>".$onpay_id.
"</onpay_id>\n <pay_for>".$pay_for."</pay_for>\n<order_id>".$pay_for.
"</order_id>\n<md5>".$md5."</md5>\n</result>";
}
//Функция выдает ответ для сервиса onpay в формате XML на чек-запрос
function answer($type,$code,$pay_for,$order_amount,$order_currency,$text)
{
global $key;
$md5=strtoupper(md5("$type;$pay_for;$order_amount;$order_currency;$code;$key")); return "<?xml version=\"1.0\" encoding=\"UTF-8\"?".">\n<result>\n<code>".
$code."</code>\n<pay_for>".$pay_for."</pay_for>\n<comment>".$text."</comment>\
n<md5>".$md5."</md5>\n</result>";
}
?>
При успешной оплате скрипт изменяет статус заказа в базе данных, формирует уведомления по e-mail и сервису мгновенных оповещений покупателю и администратору об успешной оплате заказа.
Источник: Петин В. А., Сайт на AJAX под ключ. Готовое решение для интернет-магазина. — СПб.: БХВ-Петербург, 2011. — 432 с.: ил. + CD-ROM — (Профессиональное программирование)