1

这是我上一篇文章的后续。我终于设法解决了我遇到的贝宝 IPN 问题。它发送信息,并将信息记录到我的数据库中。所以没有问题了。

但是现在我需要将他们在成功付款后支付的信用额度记入用户帐户。

我有一个数据库,其中有一个名为 members 的表和一个名为 balance 的列。

付款成功后如何更新会员余额字段?

这是 ipn.php 文件代码:

<?php
// Database variables
$host = "localhost"; //database location
$user = "XXXXXXX"; //database username
$pass = "XXXXXXX"; //database password
$db_name = "XXXXXXXX"; //database name
$test_email="";
// PayPal settings
$paypal_email = 'XXXXXXX@gmail.com';
$return_url = 'http://www.XXXX/successful.php';
$cancel_url = 'http://www.XXXX/payment-cancelled.htm';
$notify_url = 'http://www.XXXXXX/payments.php';
$item_name = 'Test Item';
$item_amount = 'amount';
// 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['amount'] = $_POST['amount'];
$data['custom'] = $_POST['custom'];
$payment_status = $_POST['payment_status'];

// 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";

//  $paypal_url = "www.paypal.com";
$paypal_url = "www.sandbox.paypal.com";
  $fp = fsockopen ($paypal_url, 80, $errno, $errstr, 30);

if (!$fp) {
  // HTTP ERROR
} else {
  fputs ($fp, $header . $req);
  while (!feof($fp)) {
   $res = fgets ($fp, 4096);

   if($payment_status == "Completed" || $payment_status == "Pending"){
        // 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  
          @mail($test_email, "PAYPAL DEBUGGING", "Payment has been made & successfully inserted into the Database");
          exit();   
         }else{    
          // Error inserting into DB
          // E-mail admin or alert user
          @mail($test_email, "PAYPAL DEBUGGING", "Error inserting into DB");
          exit();
         }
        }else{  
         // Payment made but data has been changed
         // E-mail admin or alert user

         //
         @mail($test_email, "PAYPAL DEBUGGING", "Payment made but data has been changed");
         exit();
        }        


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

        // Used for debugging
        @mail($test_email, "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  
          @mail($test_email, "PAYPAL DEBUGGING", "Payment has been made & successfully inserted into the Database");    
         }else{    
          // Error inserting into DB
          // E-mail admin or alert user
          @mail($test_email, "PAYPAL DEBUGGING", "Error inserting into DB");
         }
        }else{  
         // Payment made but data has been changed
         // E-mail admin or alert user

         //
         @mail($test_email, "PAYPAL DEBUGGING", "Payment made but data has been changed");
        }        

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

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

        // Used for debugging
        @mail($test_email, "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);
        }
}
?>

function.php 文件与 ipn.php 文件一起使用,以便将信息来回发送到 paypal 并更新 mysql 数据库。

任何帮助,将不胜感激。

谢谢

4

0 回答 0