За последние 24 часа нас посетили 20298 программистов и 1726 роботов. Сейчас ищут 2179 программистов ...

автоматическая организация платного доступа к разделу сайта

Тема в разделе "Сделайте за меня", создана пользователем iracwet, 22 июл 2014.

  1. iracwet

    iracwet Новичок

    С нами с:
    21 янв 2014
    Сообщения:
    24
    Симпатии:
    0
    Здравствуйте, подскажите, что не так в этом коде файл index.php
    Код (Text):
    1. <?php
    2. /* В настройках кабинета необходимо указать "Проверять md5 на ссылках",
    3. чтобы нельзя было заплатить сумму отличную от заданной в переменной $summa */
    4. $summa=50; //Стоимость доступа к платному разделу, в рублях
    5. $period=60*60*24*2; //Время доступа, в секундах (60 секунд * 60 минут * 24 часа * 2 суток = 172800 секунд). Исчисляется от времени поступления оплаты за код доступа.
    6. $login='demo1'; //Ваше "Имя пользователя" (логин) в системе Onpay.ru
    7. $key='a2su3ig8y'; //Ваш "Секретный пароль для API IN" в системе Onpay.ru
    8. /* Для того, чтобы закрыть доступ к папке, данный код необходимо размещать в индексном файле (index.php) */
    9. $path='http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF']; //Путь к файлу с этим кодом (определяется автоматически), например: http://onpay.ru/dir/index.php
    10. $access=0; //Запрещаем доступ, по умолчанию (0 = доступ закрыт, 1 = доступ открыт)
    11. $code='';
    12. $error='';
    13. //Функция округления для md5
    14. function to_float($sum) {
    15. if (strpos($sum, ".")) {$sum=round($sum,2);}
    16. else {$sum=$sum.".0";}
    17. return $sum;
    18. }
    19. /* Подключаемся к базе данных, если нажали на кнопку оплатить или ввели код доступа */
    20. if(isset($_POST['pay']) || isset($_POST['code'])) {
    21. $db_host='localhost'; //Хост сервера базы данных (домен или IP-адрес)
    22. $db_user='root'; //Имя пользователя БД
    23. $db_pass=''; //Пароль БД
    24. $db_name='pays'; //Название базы данных
    25. $db_tabl='payments'; //Название таблицы в которой будут храниться платежи
    26. if(!mysql_connect($db_host, $db_user, $db_pass)) {echo 'Невозможно подключиться к серверу баз данных';exit;} //Подключение к серверу баз данных
    27. if(!mysql_select_db($db_name)) {echo 'Не получилось выбрать базу данных '.$db_name;exit;} //Выбор базы данных
    28. }
    29. /* Разбираем данные, отправленные через форму*/
    30. if(isset($_POST['pay'])) { //Если нажали на кнопку покупки кода, то генерируем код, сохраняем его в базу данных и выводим форму оплаты:
    31. if(is_numeric($summa)) { //Если сумма введена корректно
    32. $sql = "INSERT INTO $db_tabl SET ".
    33. "path='$path',".
    34. "sum='$summa',".
    35. "payed=0,".
    36. "date=".time().",".
    37. "ip='".$_SERVER['REMOTE_ADDR']."';"; //Запрос в базу данных на создание новой записи
    38. $result=mysql_query($sql); //Добавляем новую строку в базу данных
    39. if($result) { //Если сохранено в базу данных без ошибок
    40. $id=mysql_insert_id(); //Получаем id записи
    41. $code=$id.substr(time(),-7); //Создаем секретный код - соединяем уникальный номер строки в базе данных (id) и последние 7 знаков текущего времени в секундах (коды доступа не должны повторяться)
    42. $sql = "UPDATE $db_tabl SET code='$code' WHERE id='$id';"; //Запрос в базу данных, для добавления кода доступа
    43. $result=mysql_query($sql); //Сохраняем код в базу данных
    44. if($result) { //Если сохранено в базу данных без ошибок
    45. $sum_for_md5=to_float($summa);
    46. $md5check=md5("fix;$sum_for_md5;RUR;$code;yes;$key"); //Создаем проверочную строку, которая защищает платежную ссылку от изменений
    47. $url="http://secure.onpay.ru/pay/$login?pay_mode=fix&pay_for=$code&price=$summa&currency=RUR&convert=yes&md5=$md5check&url_success=".$path; //Формируем платежную ссылку
    48. /*Выводим код*/
    49. ?><p style="font-size:14pt;color:blue;">Ваш код доступа: <b><?=$code; //Выводим код ?></b> (сохраните его в надежном месте)<?php
    50. /*Выводим форму оплаты*/
    51. ?><h1><a target="_blank" href="<?=$url; //Выводим платежную ссылку ?>">Оплатить код доступа:</a></h1>
    52. <iframe src="<?=$url; //Выводим платежную ссылку ?>" width="195" height="600" frameborder=no scrolling=no></iframe><?php
    53. } else unset($_POST['pay']); //Удаляем элемент массива (чтобы выводилась кнопка покупки кода)
    54. } else unset($_POST['pay']);
    55. } else unset($_POST['pay']); //Конец условия if(is_numeric($summa)) { //Если сумма введена корректно
    56. } elseif(isset($_POST['code'])) { //Если ввели код, то проверяем его в базе данных и если верный, то сохраняем в COOKIE
    57. $code=intval($_POST['code']); //Код должен быть целым числом
    58. $sql = "SELECT * FROM $db_tabl WHERE code='$code' AND path='$path' AND payed>=sum AND date>=".time().";"; //Проверка кода
    59. $result=mysql_query($sql); //Сохраняем код в базу данных
    60. if($result) { //Если сохранено в базу данных без ошибок
    61. if($row=mysql_fetch_assoc($result)) { //Если в базе данных найдена строка с введенным кодом для данной директории и он не просрочен, то сохраняем код
    62. $access=1; //Разрешаем доступ
    63. } else $error='Введен неправильный код доступа.';
    64. }
    65. } //
    66. if($access == 0) { //Если доступ запрещен, то выводим форму для покупки или ввода оплаченного кода
    67. ?><p style="font-size:14pt;font-weight:bold;">Доступ закрыт.<?php
    68. ?><p style="font-size:14pt;font-weight:bold;color:red;"><?=$error; //Выводим ошибки?><?php
    69. if(!isset($_POST['pay'])) { //Если не выведена форма оплаты
    70. ?><form method="POST" action="<?=$path; //Выводим путь на который будет отправлена форма (на текущую страницу) ?>">
    71. <input style="font-size:16pt;font-weight:bold;color:red;" type="submit" name="pay" value="Купить доступ до <?=date('H:i:s d.m.Y',time()+$period); //Выводим дату ?> всего за <?=$summa; //Выводим сумму ?>&nbsp;руб.">
    72. </form><?php
    73. }
    74. ?><p><form method="POST" action="<?=$path; //Выводим путь на который будет отправлена форма (на текущую страницу) ?>">
    75. <input style="font-size:14pt;" type="text" name="code" value="<?=$code; //Выводим текущий код доступа, при его наличии ?>">
    76. <input style="font-size:14pt;" type="submit" value="Ввести оплаченный код доступа">
    77. </form><?php
    78. exit; //Прекращаем выполнение скрипта и выходим
    79. /*Все, что расположено ниже этой строки - не выводится без верного кода доступа. */
    80. } //Конец условия if($access == 0) { if(isset($_POST['pay'])) {
    81. ?>
    82. <h1>Доступ по коду <u><?=$row['code'];?></u> разрешен до <?=date('H:i:s d.m.Y',$row['date']);?></h1>
    83. <p>Получено: <?=$row['payed'];?>&nbsp;руб.
    84. <p>Цена продления: <?=$row['sum'];?>&nbsp;руб.
    85. <p>onpay_id: <?=$row['onpay_id'];?>
    86. <p><a href=" <?=$row['path'];?>">Секретная ссылка</a>
    создана таблица в БД create table payments
    (
    id int(11) unsigned auto_increment not null,
    code bigint(16) unsigned,
    path char(255),
    sum float(7,2),
    payed float(7,2),
    onpay_id int(8) unsigned,
    date int(8) unsigned,
    ip char(255),
    primary key (id)
    );
    и файл api.php
    Код (Text):
    1. <?php
    2. $period=60*60*24*2; //Время доступа, в секундах (60 секунд * 60 минут * 24 часа * 2 суток = 172800 секунд). Исчисляется от времени поступления оплаты за код доступа.
    3. $login='demo1'; //Ваше "Имя пользователя" (логин) в системе Onpay.ru
    4. $key='a2su3ig8y'; //Ваш "Секретный пароль для API IN" в системе Onpay.ru
    5. $db_host='localhost'; //Хост сервера базы данных (домен или IP-адрес)
    6. $db_user='root'; //Имя пользователя БД
    7. $db_pass=''; //Пароль БД
    8. $db_name='pays'; //Название базы данных
    9. $db_tabl='payments'; //Название таблицы в которой будут храниться платежи
    10. if(!mysql_connect($db_host, $db_user, $db_pass)) {echo 'Невозможно подключиться к серверу баз данных';exit;} //Подключение к серверу баз данных
    11. if(!mysql_select_db($db_name)) {echo 'Не получилось выбрать базу данных '.$db_name;exit;} //Выбор базы данных
    12. if($_REQUEST['type']=='check') { //Ответ на запрос check от Onpay (проверка наличия кода в базе данных)
    13. $error=0;
    14. $order_amount=$_REQUEST['order_amount'];
    15. $order_currency=$_REQUEST['order_currency'];
    16. $code=$pay_for=$_REQUEST['pay_for'];
    17. $md5=$_REQUEST['md5'];
    18. $sum=floatval($order_amount);
    19. $code=intval($code); //Код должен быть целым числом
    20. $sql = "SELECT * FROM $db_tabl WHERE code='$code';"; //Проверка кода и переводимой за него суммы
    21. $result=mysql_query($sql); //Сохраняем код в базу данных
    22. if($result) { //Если сохранено в базу данных без ошибок
    23. if(mysql_num_rows($result)) { //Если в базе данных найдена строка с введенным кодом для данной директории и он не просрочен, то отвечаем ОК
    24. $rezult=answer($_REQUEST['type'],0,$pay_for,$order_amount,$order_currency,'OK'); //Отвечаем серверу Onpay, что все хорошо, можно принимать деньги
    25. } else $error=1;
    26. } else $error=1;
    27. if($error==1)
    28. $rezult=answer($_REQUEST['type'],2,$pay_for,$order_amount,$order_currency,'Error code pay_for: '.$code); //Сообщаем ошибку
    29. }
    30. if($_REQUEST['type']=="pay") { //Ответ на запрос pay от Onpay (прием оплаты за код)
    31. $onpay_id=$_REQUEST['onpay_id'];
    32. $code=$pay_for=$_REQUEST['pay_for'];
    33. $order_amount=$_REQUEST['order_amount'];
    34. $order_currency=$_REQUEST['order_currency'];
    35. $balance_amount=$_REQUEST['balance_amount'];
    36. $balance_currency=$_REQUEST['balance_currency'];
    37. $exchange_rate=$_REQUEST['exchange_rate'];
    38. $paymentDateTime=$_REQUEST['paymentDateTime'];
    39. $md5=$_REQUEST['md5'];
    40. $error='';
    41. //Проверка входных данных
    42. if (empty($onpay_id)) {$error .="Не указан id<br>";}
    43. else {if (!is_numeric(intval($onpay_id))) {$error .="Параметр не является числом<br>";}}
    44. if (empty($order_amount)) {$error .="Не указана сумма<br>";}
    45. else {if (!is_numeric($order_amount)) {$error .="Параметр не является числом<br>";}}
    46. if (empty($balance_amount)) {$error .="Не указана сумма<br>";}
    47. else {if (!is_numeric(intval($balance_amount))) {$error .="Параметр не является числом<br>";}}
    48. if (empty($balance_currency)) {$error .="Не указана валюта<br>";}
    49. else {if (strlen($balance_currency)>4) {$error .="Параметр слишком длинный<br>";}}
    50. if (empty($order_currency)) {$error .="Не указана валюта<br>";}
    51. else {if (strlen($order_currency)>4) {$error .="Параметр слишком длинный<br>";}}
    52. if (empty($exchange_rate)) {$error .="Не указана сумма<br>";}
    53. else {if (!is_numeric($exchange_rate)) {$error .="Параметр не является числом<br>";}}
    54. if (!$error) { //Если нет ошибок
    55. if(is_numeric($code)) {//Если pay_for - число
    56. $code=intval($code); //Код должен быть целым числом
    57. $sum=floatval($order_amount);
    58. $rezult=mysql_query("SELECT * FROM $db_tabl WHERE code='$code'"); //Проверяем, что код есть в базе данных, и оплачиваема сумма не меньше допустимой
    59. if(mysql_num_rows($rezult) == 1) {
    60. //Создаем строку хэша с присланных данных
    61. $md5fb=strtoupper(md5($_REQUEST['type'].";".$pay_for.";".$onpay_id.";".$order_amount.";".$order_currency.";".$key.""));
    62. //Сверяем строчки хеша (присланную и созданную нами)
    63. if ($md5fb != $md5) {$rezult=answerpay($_REQUEST['type'],7,$pay_for,$order_amount,$order_currency,'Md5 signature is wrong',$onpay_id);}
    64. else {
    65. $time=time();
    66. $rezult1=mysql_query("UPDATE $db_tabl SET date='".(time()+$period)."',payed=payed+'$sum',onpay_id='$onpay_id' WHERE code='$code';"); //Добавляем сумму оплаты и устанавливаем срок действия кода доступа
    67. if ($rezult1) {$rezult=answerpay($_REQUEST['type'],0,$pay_for,$order_amount,$order_currency,'OK',$onpay_id);} //Если занесение информации в базу данных прошло без ошибок,
    68. else {$rezult=answerpay($_REQUEST['type'],3,$pay_for,$order_amount,$order_currency,'Error in mechant database queries: operation or balance tables error',$onpay_id);}
    69. }
    70. } 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);}
    71. } else {//Если pay_for - не правильный формат
    72. $rezult=answerpay($_REQUEST['type'],3,$pay_for,$order_amount,$order_currency,'Error in parameters data',$onpay_id);
    73. }
    74. } else {//Если есть ошибки
    75. $rezult=answerpay($_REQUEST['type'],3,$pay_for,$order_amount,$order_currency,'Error in parameters data',$onpay_id);
    76. }
    77. }
    78. echo $rezult;
    79. //Функция выдает ответ для сервиса Onpay в формате XML на чек запрос
    80. function answer($type,$code,$pay_for,$order_amount,$order_currency,$text) {
    81. global $key;
    82. $md5=strtoupper(md5("$type;$pay_for;$order_amount;$order_currency;$code;$key"));
    83. 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>";
    84. }
    85. //Функция выдает ответ для сервиса Onpay в формате XML на pay запрос
    86. function answerpay($type,$code,$pay_for,$order_amount,$order_currency,$text,$onpay_id) {
    87. global $key;
    88. $md5=strtoupper(md5("$type;$pay_for;$onpay_id;$pay_for;$order_amount;$order_currency;$code;$key"));
    89. 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>";
    90. }
    91. ?>
    Эти файлы показаны как пример организации платного доступа к сайту onpay.ru
    файл api.php подключила в кабинете продавца. Тестовый платеж проходит, на почту приходит сообщение об успешном платеже, в БД все поля заполняются, кроме onpay_id , код доступа появляется сразу еще до приема платежа(тот который прописался в бд), но при вводе кода доступа выводится сообщение, о том что он не правильный.В первый раз пытаюсь такое сделать помогите советом, что надо исправить.