Paypal ipn + mysql

Тема в разделе "PHP", создана пользователем indecline, 14 мар 2009.

Статус темы:
Закрыта.
Модераторы: latteo
  1. indecline

    indecline Создатель

    Регистр.:
    1 окт 2007
    Сообщения:
    45
    Симпатии:
    15
    уже 4 скрипт тестю на своем сайте.

    К примеру вот этот http://phpclub.ru/detail/article/paypal#subscribe

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

    Спасибо за все ответы.
     
  2. jik

    jik

    Регистр.:
    11 мар 2009
    Сообщения:
    243
    Симпатии:
    133
    при проведении платежа в форме заказа должны присутствовать поля:

    Код:
    <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 вызывается?
     
  3. indecline

    indecline Создатель

    Регистр.:
    1 окт 2007
    Сообщения:
    45
    Симпатии:
    15
    да есть . Много чего перепробовал но никаких признаков комуницации между скриптом и mysql нету . хмм .

     
  4. jik

    jik

    Регистр.:
    11 мар 2009
    Сообщения:
    243
    Симпатии:
    133
    Должен дергаться скрипт, когда проводится платеж

    Код:
    <input type="hidden" name="return" value="http://site/succes.php">
    Если скрипт дергается, то дальше будем смотреть непосредственно в скрипте, почему он не пишет в базу.

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

    Код:
    mysql_connect($server, $username, $password);
    mysql_select_db($database);
     
  5. indecline

    indecline Создатель

    Регистр.:
    1 окт 2007
    Сообщения:
    45
    Симпатии:
    15
    сори но что значит дергаться?
    у меня все проходит ладно вcе платится при тесте

    в succes у меня

    а в ipn.php

     
  6. jik

    jik

    Регистр.:
    11 мар 2009
    Сообщения:
    243
    Симпатии:
    133
    Вот в этом месте

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

    Код:
    mysql_connect($server, $username, $password);
    mysql_select_db($database);
     
  7. indecline

    indecline Создатель

    Регистр.:
    1 окт 2007
    Сообщения:
    45
    Симпатии:
    15
    в inc/config у меня :) :

    пробовал тоже самое и в самом файле . может что то связаное с htaccess?
     
  8. jik

    jik

    Регистр.:
    11 мар 2009
    Сообщения:
    243
    Симпатии:
    133
    А если вставить логирование всех 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).
     
  9. indecline

    indecline Создатель

    Регистр.:
    1 окт 2007
    Сообщения:
    45
    Симпатии:
    15
    do_log такого ненашел так что я сделал просто echo . но вот только эту инфу я посмотреть в отрытом виде не смогу так как все скрывается payapalom ?

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

    выдало :

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

    значит в самом скрипте трабла ? а не в базах
     
  10. jik

    jik

    Регистр.:
    11 мар 2009
    Сообщения:
    243
    Симпатии:
    133
    Вы используете форму подписки, это когда 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"]); 
      /*  
        сообщаем, что заказ принят, благодарим за покупку и  
        предлагаем купить еще что-нибудь */  
    ?> 
     
Статус темы:
Закрыта.