PayPal IPN日志但不插入MySQL

时间:2013-01-06 03:56:23

标签: php mysql paypal-ipn

我有这个脚本应该将信息插入到MySQL表中,但由于某种原因,它只会将其保存在ipn.log文件中,但不会运行插入查询。这是我的代码。

<?php 

//Lets do MySql connection stuff 
$mysql_host = 'SERVER'; //Leave at localhost 
$mysql_user = 'USER'; //DB User 
$mysql_pass = 'PASSWORD'; //DB Pass 
$mysql_db = 'DATABASE'; //DB Name 

//------------------------------------------------------------------ 
// Open log file (in append mode) and write the current time into it. 
// Open the DB Connection. Open the actual database. 
//------------------------------------------------------------------- 
$log = fopen("ipn.log", "a"); 
fwrite($log, "\n\nipn - ".gmstrftime("%b %d %Y %H:%M:%S", time())."\n"); 
$db = mysql_connect($mysql_host, $mysql_user, $mysql_pass); 
mysql_select_db($mysql_db, $db); 

//------------------------------------------------ 
// Read post from PayPal system and create reply 
// starting with: 'cmd=_notify-validate'... 
// then repeating all values sent - VALIDATION. 
//------------------------------------------------ 
$postvars = array(); 

while(list($key, $value) = each($_POST)) 
{ 
  $postvars[] = $key; 
} 
$req = 'cmd=_notify-validate'; 

for($var = 0; $var < count($postvars); $var++) 
{ 
  $postvar_key = $postvars[$var]; 
  $postvar_value = $$postvars[$var]; 
  $req .= "&".$postvar_key."=".urlencode($postvar_value); 
} 

//-------------------------------------------- 
// Create message to post back to PayPal... 
// Open a socket to the PayPal server... 
//-------------------------------------------- 
$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("www.paypal.com", 80, $errno, $errstr, 30); 

//--------------------------------------------- 
fwrite($log, "Vals: ". $invoice." ". $receiver_email." ". $item_name." ". $item_number." ". $quantity." ". $payment_status." ". $pending_reason." ".$payment_date." ". $payment_gross." ". $payment_fee." ". $txn_id." ". $txn_type." ". $first_name." ". $last_name." ". $address_street." ". $address_city." ". $address_state . " ".$address_zip." ". $address_country." ". $address_status." ". $payer_email. " ". $payer_status." ". $payment_type." ". $notify_version." ". $verify_sign. "\ n"); 

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

//---------------------------------------------------------------------- 
// Check HTTP connection made to PayPal OK, If not, print an error msg 
//---------------------------------------------------------------------- 
if(!$fp) 
{ 
  echo $errstr."(".$errno.")"; 
  fwrite($log, "Failed to open HTTP connection!"); 
  $res = "FAILED"; 
} 
//-------------------------------------------------------- 
// If connected OK, write the posted values back, then... 
//-------------------------------------------------------- 
else 
{ 
  fputs($fp, $header . $req); 
  //------------------------------------------- 
  // ...read the results of the verification... 
  // If VERIFIED = continue to process the TX... 
  //------------------------------------------- 
  while(!feof($fp)) 
  { 
    $res = fgets($fp, 1024); 
    if(strcmp($res, "VERIFIED") == 0) 
    { 
      //-------------------------------------- 
      // Insert Transaction details into DB. 
      //-------------------------------------- 
      $qry = "INSERT INTO DONATIONS (invoice, receiver_email, item_name, item_number, quantity, payment_status, pending_reason, payment_date, payment_gross, payment_fee, txn_id, txn_type, first_name, last_name, address_street, address_city, address_state, address_zip, address_country, address_status, payer_email, payer_status, payment_type, notify_version, verify_sign) VALUES('$invoice', '$receiver_email', '$item_name', '$item_number', '$quantity', '$payment_status', '$pending_reason', '$payment_date', '$payment_gross', '$payment_fee', '$txn_id', '$txn_type', '$first_name', '$last_name', '$address_street', '$address_city', '$address_state', '$address_zip', '$address_country', '$address_status', '$payer_email', '$payer_status ', '$payment_type', '$notify_version', '$verify_sign')"; 
      $result = mysql_query($qry); 
    } 
  } 
} 
//------------------------------------------- 
// Close PayPal Connection, Log File and DB. 
//------------------------------------------- 
fclose($fp); 
fclose($log); 
mysql_close($db); 

?>

2 个答案:

答案 0 :(得分:1)

最好的方法是通过在代码中放置一些测试以查看错误的位置来找出“某些原因”:

连接到mysql db的地方:

$db = mysql_connect($mysql_host, $mysql_user, $mysql_pass);
if (!$db) {
    die('Could not connect: ' . mysql_error());
} else {
$db_selected = mysql_select_db($mysql_db, $db);
if (!$db_selected) {
    die ('Can\'t use selected db : ' . mysql_error());
    } 
}

在db:

中插入数据的位置
$result = mysql_query($qry); 
  if (!$result) {
    die('Could not insert in db: ' . mysql_error());
  }

现在,您可以通过查看错误找出数据未输入数据的原因。

还要确保在开发时将其添加到php文件的开头以在屏幕上显示错误:

<?php
ini_set('display_errors', 1); error_reporting(E_ALL);  

这将在屏幕上显示错误并报告所有类型的错误,这将简化您的编码。

我希望这是解决问题的良好开端。

答案 1 :(得分:0)

我不确定我的做法有多么不同,但放弃了桌子并重新创建了它。现在它有效。