2013-02-09 67 views
1

由于某种原因,贝宝IPN不会将数据输入到mysql数据库中! 我正在使用贝宝沙箱和付款经过,他们显示在我的沙箱帐户,但细节不会显示在MySQL!paypal IPN不会将数据添加到MySQL?

这是我的IPN文件。尽管我将它称为payments.php,并且我还使用IPN模拟器指向它,并且它表示IPN已成功发送。所以,我不知道这个问题是在这里什么:

<?php 
// Database variables 
$host = "localhost"; //database location 
$user = "my details"; //database username 
$pass = "pass"; //database password 
$db_name = "my details"; //database name 

// PayPal settings 
$paypal_email = '[email protected]'; 
$return_url = 'http://some site/'; 
$cancel_url = 'http://some site/'; 
$notify_url = 'http://some site/thanks.php'; 

$item_name = 'Test Item'; 
$item_amount = 5.00; 

// Include Functions 
include("functions.php"); 

//Database Connection 
$link = mysql_connect($host, $user, $pass); 
mysql_select_db($db_name); 

// Check if paypal request or response 
if (!isset($_POST["txn_id"]) && !isset($_POST["txn_type"])){ 

    // Firstly Append paypal account to querystring 
    $querystring .= "?business=".urlencode($paypal_email)."&"; 

    // Append amount& currency (£) to quersytring so it cannot be edited in html 

    //The item name and amount can be brought in dynamically by querying the $_POST['item_number'] variable. 
    $querystring .= "item_name=".urlencode($item_name)."&"; 
    $querystring .= "amount=".urlencode($item_amount)."&"; 

    //loop for posted values and append to querystring 
    foreach($_POST as $key => $value){ 
     $value = urlencode(stripslashes($value)); 
     $querystring .= "$key=$value&"; 
    } 

    // Append paypal return addresses 
    $querystring .= "return=".urlencode(stripslashes($return_url))."&"; 
    $querystring .= "cancel_return=".urlencode(stripslashes($cancel_url))."&"; 
    $querystring .= "notify_url=".urlencode($notify_url); 

    // Append querystring with custom field 
    //$querystring .= "&custom=".USERID; 

    // Redirect to paypal IPN 
    header('location:https://www.sandbox.paypal.com/cgi-bin/webscr'.$querystring); 
    exit(); 

}else{ 

    // Response from Paypal 

    // read the post from PayPal system and add 'cmd' 
    $req = 'cmd=_notify-validate'; 
    foreach ($_POST as $key => $value) { 
     $value = urlencode(stripslashes($value)); 
     $value = preg_replace('/(.*[^%^0^D])(%0A)(.*)/i','${1}%0D%0A${3}',$value);// IPN fix 
     $req .= "&$key=$value"; 
    } 

    // assign posted variables to local variables 
    $data['item_name']   = $_POST['item_name']; 
    $data['item_number']  = $_POST['item_number']; 
    $data['payment_status']  = $_POST['payment_status']; 
    $data['payment_amount']  = $_POST['mc_gross']; 
    $data['payment_currency'] = $_POST['mc_currency']; 
    $data['txn_id']    = $_POST['txn_id']; 
    $data['receiver_email']  = $_POST['receiver_email']; 
    $data['payer_email']  = $_POST['payer_email']; 
    $data['custom']    = $_POST['custom']; 

    // post back to PayPal system to validate 
    $header = "POST /cgi-bin/webscr HTTP/1.0\r\n"; 
    $header .= "Content-Type: application/x-www-form-urlencoded\r\n"; 
    $header .= "Content-Length: " . strlen($req) . "\r\n\r\n"; 

    $fp = fsockopen ('ssl://www.sandbox.paypal.com', 443, $errno, $errstr, 30); 

    if (!$fp) { 
     // HTTP ERROR 
    } else {  

     fputs ($fp, $header . $req); 
     while (!feof($fp)) { 
      $res = fgets ($fp, 1024); 
      if (strcmp($res, "VERIFIED") == 0) { 

       // Used for debugging 
       //@mail("[email protected]", "PAYPAL DEBUGGING", "Verified Response<br />data = <pre>".print_r($post, true)."</pre>"); 

       // Validate payment (Check unique txnid & correct price) 
       $valid_txnid = check_txnid($data['txn_id']); 
       $valid_price = check_price($data['payment_amount'], $data['item_number']); 
       // PAYMENT VALIDATED & VERIFIED! 
       if($valid_txnid && $valid_price){    
        $orderid = updatePayments($data);  
        if($orderid){     
         // Payment has been made & successfully inserted into the Database        
        }else{        
         // Error inserting into DB 
         // E-mail admin or alert user 
        } 
       }else{     
        // Payment made but data has been changed 
        // E-mail admin or alert user 
       }      

      }else if (strcmp ($res, "INVALID") == 0) { 

       // PAYMENT INVALID & INVESTIGATE MANUALY! 
       // E-mail admin or alert user 

       // Used for debugging 
       //@mail("[email protected]", "PAYPAL DEBUGGING", "Invalid Response<br />data = <pre>".print_r($post, true)."</pre>"); 
      }  
     }  
    fclose ($fp); 
    } 
} 
?> 

更新:这里是function.php ..我希望这可以帮助别人来帮我解决这个!

<?php 
// functions.php 
function check_txnid($tnxid){ 
    global $link; 
    return true; 
    $valid_txnid = true; 
    //get result set 
    $sql = mysql_query("SELECT * FROM payments WHERE txnid = '$tnxid'", $link);  
    if($row = mysql_fetch_array($sql)) { 
     $valid_txnid = false; 
    } 
    return $valid_txnid; 
} 

function check_price($price, $id){ 
    $valid_price = false; 
    //you could use the below to check whether the correct price has been paid for the product 

    /* 
    $sql = mysql_query("SELECT amount FROM `products` WHERE id = '$id'");  
    if (mysql_numrows($sql) != 0) { 
     while ($row = mysql_fetch_array($sql)) { 
      $num = (float)$row['amount']; 
      if($num == $price){ 
       $valid_price = true; 
      } 
     } 
    } 
    return $valid_price; 
    */ 
    return true; 
} 

function updatePayments($data){ 
    global $link; 
    if(is_array($data)){     
     $sql = mysql_query("INSERT INTO payments (txnid, payment_amount, payment_status, itemid, createdtime) VALUES (
       '".$data['txn_id']."' , 
       '".$data['payment_amount']."' , 
       '".$data['payment_status']."' , 
       '".$data['item_number']."' , 
       '".date("Y-m-d H:i:s")."' 
       )", $link); 
    return mysql_insert_id($link); 
    } 
} 
?> 
+0

那么,我们不想修复您的BIG php文件。告诉我们你先得到的错误。 – j0k 2013-02-09 08:19:08

+0

updatePayments函数的内容是什么? updatePayments函数是否曾被调用? – 2013-02-09 08:21:26

+0

@ j0k,我不认为这是一个“BIG”php文件。尤其是对于知道自己在做什么的人。不,我根本没有任何错误。没有错误,但它也不起作用。 – user2056633 2013-02-09 08:28:58

回答

0

尝试Print ING或echo荷兰国际集团这些值替换 - // Payment has been made & successfully inserted into the Database

print $data['item_name']; print $data['item_number'];.......

从那里我可以更新,直到它是正确的,从那里是错误的。

+0

谢谢,但这并没有帮助。还是行不通。我的意思是付款经过,因为他们应该但数据库仍然没有通过贝宝IPNs更新! – user2056633 2013-02-09 08:49:47

+0

再次感谢,我添加了$ data = array();当我在我的沙盒帐户中使用IPN模拟器时,我在paypal中得到了这个错误:IPN交付失败。 HTTP错误代码404:未找到。 – user2056633 2013-02-09 09:24:32

+0

好吧尝试我提供的最后一次更新并删除'$ data = array();' – 2013-02-09 09:30:07

0

它看起来好像你的工作有点'盲',因为这是一个'无头'脚本,你不知道它在哪里失败。

在各个点添加一些error_log行,以便您可以检查脚本中的流程。特别是,在执行数据库查询之前添加error_log($ sql)将会将语句打印到错误日志中。以此尝试在数据库中独立运行它。这可能是一些表约束失败,而不是在PHP中的错误在这些点添加日志行在各个点通过流量和打印变量也将帮助您诊断故障发生的地方,并希望让你更精确地查明错误。

+0

为了这个目的,我遵循本教程,显然它适用于其他人。所以为什么不是我:(我一直在这个工作18个小时没有睡眠和食物,我只是不明白为什么会发生这种情况。教程位于这里:http://www.evoluted.net/thinktank/web-开发/贝宝的PHP集成 – user2056633 2013-02-09 09:54:46