Paypal ipn + mysql

Статус
В этой теме нельзя размещать новые ответы.

indecline

Создатель
Регистрация
1 Окт 2007
Сообщения
44
Реакции
17
уже 4 скрипт тестю на своем сайте.

К примеру вот этот Для просмотра ссылки Войди или Зарегистрируйся

1. Скрипт проходит через через paypal sandbox с тестовым продавцом и покупателем акаунта (Для просмотра ссылки Войди или Зарегистрируйся) но в mysql никакие данные не отправляютя , пробовал обычные запросы тоже не работают.
2. Запись файла логов работает
3. Нажна ли сессия в ipn файле?
4. В чем может быть трабла.

Спасибо за все ответы.
 
при проведении платежа в форме заказа должны присутствовать поля:

Код:
<input type="hidden" name="return" value="http://myhost.com/payment_success.php"> 
<input type="hidden" name="cancel_return" value="http://myhost.com/payment_cancel.html">

Есть такие поля в вашей форме? Скрипт payment_success.php или payment_cancel.html вызывается?
 
да есть . Много чего перепробовал но никаких признаков комуницации между скриптом и mysql нету . хмм .

<?php
// subscribe.php
$paypalemail = "cli_1237029563_biz@gmail.com"; // e-mail продавца
$currency = "EUR"; // валюта
$price = "3.00"; // стоимость подписки

echo <<<FORM
<form method="post" action= "https://www.sandbox.paypal.com/cgi-bin/webscr">
<input type="hidden" name="cmd" value="_xclick-subscriptions">
<input type="hidden" name="business" value="$paypalemail">
<input type="hidden" name="item_name" value="Subscription">
<input type="hidden" name="return" value="http://site/succes.php">
<input type="hidden" name="rm" value="1">
<input type="hidden" name="cancel_return" value="http://site/cancel.php">
<input type="hidden" name="no_shipping" value="1">
<input type="hidden" name="currency_code" value="$currency">
<input type="hidden" name="notify_url" value="http://site/ipn.php">
<input type="hidden" name="a3" value="$price">
<input type="hidden" name="p3" value="3">
<input type="hidden" name="t3" value="M">
<input type="submit" value="Subscribe"> </FORM>
FORM;
?>
 
Должен дергаться скрипт, когда проводится платеж

Код:
<input type="hidden" name="return" value="http://site/succes.php">

Если скрипт дергается, то дальше будем смотреть непосредственно в скрипте, почему он не пишет в базу.

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

Код:
mysql_connect($server, $username, $password);
mysql_select_db($database);
 
сори но что значит дергаться?
у меня все проходит ладно вcе платится при тесте

в succes у меня

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Payment Gateway Tests - Paypal Success</title>
</head>
<body>
<h1>Payment Gateway Tests - Paypal Success</h1>
<p>Thank you!</p>
<p>We have received your order and have started processing it. We will let you know as soon as it is being confirmed by Paypal.</p>
</body>
</html>

а в ipn.php

<?

session_start();
include "inc/config.php";

// ipn.php
$paypalemail = "cli_1237029563_biz@gmail.com"; // e-mail продавца
$adminemail = "support@site"; // e-mail администратора
$currency = "EUR"; // валюта
$price = 3.00; // стоимость одиски
$cycle = "3 M"; // длительность основного цикла

/********
запрашиваем подтверждение транзакции
********/
$postdata="";
foreach ($_POST as $key=>$value) $postdata.=$key."=".urlencode($value)."&";
$postdata.="cmd=_notify-validate";
$curl = curl_init("https://www.sandbox.paypal.com/cgi-bin/webscr");
curl_setopt ($curl, CURLOPT_HEADER, 0);
curl_setopt ($curl, CURLOPT_POST, 1);
curl_setopt ($curl, CURLOPT_POSTFIELDS, $postdata);
curl_setopt ($curl, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt ($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($curl, CURLOPT_SSL_VERIFYHOST, 1);
$response = curl_exec ($curl);
curl_close ($curl);
if ($response != "VERIFIED") exit;

/********
проверяем получателя платежа и тип транзакции, и выходим,
если не наш аккаунт или IPN не требует обработки
в $paypalemail - наш primary e-mail, поэтому проверяем receiver_email
********/
if ($_POST['receiver_email'] != $paypalemail
|| $_POST["txn_type"] != "subscr_signup"
|| $_POST["txn_type"] != "subscr_eot"
|| $_POST["txn_type"] != "subscr_payment")
exit;


/*
здесь код, подключающийся к базе данных
*/

/********
подписка ?
********/
if ($_POST["txn_type"] == "subscr_signup")
{
$r = mysql_query("SELECT payer_id FROM subscribers WHERE payer_id='".$_POST["payer_id"]."'");
list($duplicate) = mysql_fetch_row($r);
mysql_free_result($r);
if ($duplicate) exit; // овторный IPN - игнорируем
if (isset($_POST["p3"])
|| $_POST["mc_currency"] != $currency
|| $_POST["mc_amount3"] != $price
|| $_POST["period3"] != $cycle) exit; // неверные араметры одиски
$subscr_date = date("Y-m-d H:i:s",strtotime ($_POST["subscr_date"]));
mysql_query("INSERT INTO subscribers SET
subscr_id = '".$_POST["subscr_id"]."',
subscr_date = '$subscr_date',
payer_id = '".$_POST["payer_id"]."',
email = '".$_POST["payer_email"]."',
limited = 1");
/*
здесь можно отправить e-mail с именем пользователя и паролем,
я этого не делаю, так как пароль сгенерирован PayPal
и доступен подписчику на сайте PayPal в панели управления аккаунтом
*/
}
/********
оплата ?
********/
elseif ($_POST["txn_type"] == "subscr_payment")
{
if ($_POST["mc_currency"] != $currency
|| ($_POST["payment_status"] != "completed" && $_POST["pending_reason"] != "intl")
|| $_POST["mc_gross"] != $price) exit;
// после первого платежа даем полный доступ
mysql_query("UPDATE subscribers SET limited=0 WHERE subscr_id='".$_POST["subscr_id"]."'");
}
/********
окончание подписки ?
********/
elseif ($_POST["txn_type"] == "subscr_eot")
{
mysql_query("DELETE FROM subscribers WHERE subscr_id='".$_POST["subscr_id"]."'");
}
?>
 
Вот в этом месте

Код:
/*
здесь код, подключающийся к базе данных
*/

надо вставить

Код:
mysql_connect($server, $username, $password);
mysql_select_db($database);
 
в inc/config у меня :) :

//base
$dbhost = "host";
$dbuname = "dbname";
$dbpass = "pass";
$dbname = "table";

//connect
mysql_connect("$dbhost", "$dbuname", "$dbpass") || die ("error");
mysql_select_db("$dbname") || die ("error");

пробовал тоже самое и в самом файле . может что то связаное с htaccess?
 
А если вставить логирование всех mysql команд?

т.е. вместо команд
Код:
mysql_query("UPDATE subscribers SET limited=0 WHERE subscr_id='".$_POST["subscr_id"]."'");

ставим

Код:
$cmd = "UPDATE subscribers SET limited=0 WHERE subscr_id='".$_POST["subscr_id"]."'";
$res = mysql_query($cmd);
if ($res) {
  $cmd .= ' -> result ok';
} else {
  $err = mysql_error();
  $cmd .= " ->result: $err"; 
}
do_log($cmd);

Залогировать так все mysql команды. В скрипте нет mysql-команд INSERT, строка в базе должна уже существовать, идет только обновление строки с занесением данных платежа. Из лога будет видно, какая строка обновляется, и тогда в базе посмотреть, а точно такая строка там присутствует (с таким subscr_id).
 
do_log такого ненашел так что я сделал просто echo . но вот только эту инфу я посмотреть в отрытом виде не смогу так как все скрывается payapalom ?

поиставил конект в самом начале

выдало :

UPDATE subscribers SET limited=0 WHERE subscr_id='' -> result ok

значит в самом скрипте трабла ? а не в базах
 
да есть . Много чего перепробовал но никаких признаков комуницации между скриптом и mysql нету . хмм .


Цитата:
<?php
// subscribe.php
$paypalemail = "cli_1237029563_biz@gmail.com"; // e-mail продавца
$currency = "EUR"; // валюта
$price = "3.00"; // стоимость подписки

echo <<<FORM
<form method="post" action= "https://www.sandbox.paypal.com/cgi-bin/webscr">
<input type="hidden" name="cmd" value="_xclick-subscriptions">
<input type="hidden" name="business" value="$paypalemail">
<input type="hidden" name="item_name" value="Subscription">
<input type="hidden" name="return" value="http://site/succes.php">
<input type="hidden" name="rm" value="1">
<input type="hidden" name="cancel_return" value="http://site/cancel.php">
<input type="hidden" name="no_shipping" value="1">
<input type="hidden" name="currency_code" value="$currency">
<input type="hidden" name="notify_url" value="http://site/ipn.php">
<input type="hidden" name="a3" value="$price">
<input type="hidden" name="p3" value="3">
<input type="hidden" name="t3" value="M">
<input type="submit" value="Subscribe"> </FORM>
FORM;
?>

Вы используете форму подписки, это когда paypal снимает платеж с покупателя периодически.

Если Вы хотите провести платеж, то нужна форма оплаты

Код:
<?php 
  // checkout.php 
   
  $paypalemail  = "my@email.com";     // e-mail продавца 
  $currency     = "USD";              // валюта 
  $cart_id=intval($_COOKIE['cart_id']); 

  /* 
    здесь код, подключающийся к базе данных  
    и выводящий содержимое корзины 
  */ 

  $r=mysql_query("SELECT sum(price*quantity) FROM cart WHERE cart_id=".$cart_id); 
  list ($total)=mysql_fetch_row($r); 
  mysql_free_result($r); 
  $total=number_format($total,2); 
  echo <<<FORM 
<form method="post" action= "https://www.paypal.com/cgi-bin/webscr"> 
<input type="hidden" name="cmd" value="_xclick"> 
<input type="hidden" name="business" value="$paypalemail"> 
<input type="hidden" name="item_name" value="Shopping cart"> 
<input type="hidden" name="item_number" value="$cart_id"> 
<input type="hidden" name="amount" value="$total"> 
<input type="hidden" name="no_shipping" value="0"> 
<input type="hidden" name="return" value="http://myhost.com/payment_success.php"> 
<input type="hidden" name="rm" value="2"> 
<input type="hidden" name="cancel_return" value="http://myhost.com/payment_cancel.html"> 
<input type="hidden" name="no_shipping" value="0"> 
<input type="hidden" name="currency_code" value="$currency"> 
<input type="submit" value="Checkout">  
</FORM> 
FORM; 
?>

Запись данных по оплате производится в скрипте payment_success.php

Код:
<?php 
  // payment_success.php 
  $paypalemail = "my@email.com";     // e-mail продавца 
  $adminemail  = "admin@email.com";  // e-mail  администратора 
  $currency    = "USD";              // валюта 

  /******** 
  запрашиваем подтверждение транзакции 
  ********/ 
  $postdata=""; 
  foreach ($_POST as $key=>$value) $postdata.=$key."=".urlencode($value)."&"; 
  $postdata .= "cmd=_notify-validate";  
  $curl = curl_init("https://www.paypal.com/cgi-bin/webscr"); 
  curl_setopt ($curl, CURLOPT_HEADER, 0);  
  curl_setopt ($curl, CURLOPT_POST, 1); 
  curl_setopt ($curl, CURLOPT_POSTFIELDS, $postdata); 
  curl_setopt ($curl, CURLOPT_SSL_VERIFYPEER, 0);  
  curl_setopt ($curl, CURLOPT_RETURNTRANSFER, 1); 
  curl_setopt ($curl, CURLOPT_SSL_VERIFYHOST, 1); 
  $response = curl_exec ($curl); 
  curl_close ($curl); 
  if ($response != "VERIFIED") die("You should not do that ...");  

  /******** 
  проверяем получателя платежа и тип транзакции, и выходим, если не наш аккаунт 
  в $paypalemail - наш  primary e-mail, поэтому проверяем receiver_email 
  ********/ 
  if ($_POST['receiver_email'] != $paypalemail  
    || $_POST["txn_type"] != "web_accept") 
      die("You should not be here ..."); 

  /* 
    здесь код, подключающийся к базе данных  
  */  

  /********  
    убедимся в том, что эта транзакция не  
    была обработана ранее  
  ********/ 
  $r = mysql_query("SELECT order_id FROM orders WHERE txn_id='".$_POST["txn_id"]."'"); 
  list($duplicate) = mysql_fetch_row($r); 
  mysql_free_result($r); 
  if ($duplicate) die ("I feel like I met you before ...");  
  /******** 
    проверяем сумму платежа 
  ********/  
  $cart_id = intval($_POST['item_number']); 
  $r = mysql_query( "SELECT sum(price*quantity), COUNT(cart_id) FROM cart  
                      WHERE cart_id=".$cart_id); 
  list ($total,$nitems) = mysql_fetch_row($r); 
  mysql_free_result($r); 
  if (!$nitems) // не удалось восстановить содержимое корзины 
  { 
    mail($adminemail, "IPN error", "Unable to restore cart contents\r\nCart ID: ". 
      $cart_id."\r\nTransaction ID: ".$_POST["txn_id"]); 
    die("I cannot recall what you paid for ... Please contact ".$adminemail);  
  } 
  if ($total != $_POST["mc_gross"] || $_POST["mc_currency"] != $currency) 
  { 
    mail($adminemail, "IPN error", "Payment amount mismatch\r\nCart ID: " 
      . $cart_id."\r\nTransaction ID: ".$_POST["txn_id"]); 
    die("Out of money? Please contact ".$adminemail); 
  } 
   /******** 
     проверки завершены. формируем заказ 
  ********/ 
  $order_date = date("Y-m-d H:i:s",strtotime ($_POST["payment_date"]));  
  mysql_query("INSERT INTO orders SET  
    txn_id      = '".$_POST["txn_id"]."', 
    order_date  = '$order_date', 
    order_total = $total, 
    email       = '".$_POST["payer_email"]."', 
    first_name  = '".mysql_escape_string($_POST["first_name"])."', 
    last_name   = '".mysql_escape_string($_POST["last_name"])."', 
    street      = '".mysql_escape_string($_POST["address_street"])."',  
    city        = '".mysql_escape_string($_POST["address_city"])."',  
    state       = '".mysql_escape_string($_POST["address_state"])."',  
    zip         = '".mysql_escape_string($_POST["address_zip"])."',  
    country     = '".mysql_escape_string($_POST["address_country"])."'" ); 
  $order_id = mysql_insert_id();  
  $r = mysql_query("SELECT * FROM cart WHERE cart_id=".$cart_id); 
  while ($row = mysql_fetch_assoc($r)) 
  { 
    mysql_query("INSERT INTO order_details SET  
      order_id = $order_id,  
      item_id = ".$row['item_id'].", 
      price = ".$row['price'].", 
      quantity = ".$row['quantity']); 
  } 
  mysql_free_result($r);  
  mysql_query("DELETE FROM cart WHERE cart_id=".$cart_id); 
  mail($adminemail, "New order", "New order\r\nOrder ID: ". $order_id."\r\nTransaction ID: " 
    .$_POST["txn_id"]); 
  /*  
    сообщаем, что заказ принят, благодарим за покупку и  
    предлагаем купить еще что-нибудь */  
?>
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху