PayPal IPN 返回空白开机自检或获取



我最近发现了一个用于CodeIgniter的PayPal库,并一直在尝试从PayPal接收变量。然而,什么都没有回来。我试图var_dump GET和POST变量,但没有返回任何内容。

我已经成功地向PayPal付款,但退货总是空的。

我还取消了对PayPal、成功和通知的 csrf 保护。IPN 也已在我的PayPal帐户中设置

这是我正在使用的库

<?php if (!defined('BASEPATH')) exit('No direct script access allowed'); 
class paypal_lib {
var $last_error;            // holds the last error encountered
var $ipn_log;               // bool: log IPN results to text file?
var $ipn_log_file;          // filename of the IPN log
var $ipn_response;          // holds the IPN response from paypal   
var $ipn_data = array();    // array contains the POST values for IPN
var $fields = array();      // array holds the fields to submit to paypal
var $submit_btn = '';       // Image/Form button
var $button_path = '';      // The path of the buttons
var $CI;
function __construct()
{
$this->CI =& get_instance();
$this->CI->load->helper('url');
$this->CI->load->helper('form');
$this->CI->load->config('paypallib_config');
$sanbox = $this->CI->config->item('sandbox');
$this->paypal_url = ($sanbox == TRUE)?'https://www.sandbox.paypal.com/cgi-bin/webscr':'https://www.paypal.com/cgi-bin/webscr';
$this->last_error = '';
$this->ipn_response = '';
$this->ipn_log_file = $this->CI->config->item('paypal_lib_ipn_log_file');
$this->ipn_log = $this->CI->config->item('paypal_lib_ipn_log'); 
$this->button_path = $this->CI->config->item('paypal_lib_button_path');
// populate $fields array with a few default values.  See the paypal
// documentation for a list of fields and their data types. These defaul
// values can be overwritten by the calling script.
$businessEmail = $this->CI->config->item('business');
$this->add_field('business',$businessEmail);
$this->add_field('rm','2');           // Return method = POST
$this->add_field('cmd','_xclick');
$this->add_field('currency_code', $this->CI->config->item('paypal_lib_currency_code'));
$this->add_field('quantity', '1');
$this->button('Pay Now!');
}
function button($value)
{
// changes the default caption of the submit button
$this->submit_btn = form_submit('pp_submit', $value);
}
function image($file)
{
$this->submit_btn = '<input type="image" name="add" src="' . site_url($this->button_path .'/'. $file) . '" border="0" />';
}

function add_field($field, $value) 
{
// adds a key=>value pair to the fields array, which is what will be 
// sent to paypal as POST variables.  If the value is already in the 
// array, it will be overwritten.
$this->fields[$field] = $value;
}
function paypal_auto_form() 
{
// this function actually generates an entire HTML page consisting of
// a form with hidden elements which is submitted to paypal via the 
// BODY element's onLoad attribute.  We do this so that you can validate
// any POST vars from you custom form before submitting to paypal.  So 
// basically, you'll have your own form which is submitted to your script
// to validate the data, which in turn calls this function to create
// another hidden form and submit to paypal.
$this->button('Click here if you're not automatically redirected...');
echo '<html>' . "n";
echo '<head><title>Processing Payment...</title></head>' . "n";
echo '<body style="text-align:center;" onLoad="document.forms['paypal_auto_form'].submit();">' . "n";
echo '<p style="text-align:center;">Please wait, your order is being processed and you will be redirected to the paypal website.</p>' . "n";
echo $this->paypal_form('paypal_auto_form');
echo '</body></html>';
}
function paypal_form($form_name='paypal_form') 
{
$str = '';
$str .= '<form method="post" action="'.$this->paypal_url.'" name="'.$form_name.'"/>' . "n";
foreach ($this->fields as $name => $value)
$str .= form_hidden($name, $value) . "n";
$str .= '<p>'. $this->submit_btn . '</p>';
$str .= form_close() . "n";
return $str;
}
function validate_ipn()
{
// parse the paypal URL
$url_parsed = parse_url($this->paypal_url);       
// generate the post string from the _POST vars aswell as load the
// _POST vars into an arry so we can play with them from the calling
// script.
$post_string = '';   
if ($this->CI->input->post())
{
foreach ($this->CI->input->post() as $field=>$value)
{ 
$this->ipn_data[$field] = $value;
$post_string .= $field.'='.urlencode(stripslashes($value)).'&'; 
}
}
$post_string.="cmd=_notify-validate"; // append ipn command
// open the connection to paypal
$fp = fsockopen($url_parsed['host'],"80",$err_num,$err_str,30); 
if(!$fp)
{
// could not open the connection.  If loggin is on, the error message
// will be in the log.
$this->last_error = "fsockopen error no. $errnum: $errstr";
$this->log_ipn_results(false);       
return false;
} 
else
{ 
// Post the data back to paypal
fputs($fp, "POST $url_parsed[path] HTTP/1.1rn"); 
fputs($fp, "Host: $url_parsed[host]rn"); 
fputs($fp, "Content-type: application/x-www-form-urlencodedrn"); 
fputs($fp, "Content-length: ".strlen($post_string)."rn"); 
fputs($fp, "Connection: closernrn"); 
fputs($fp, $post_string . "rnrn"); 
// loop through the response from the server and append to variable
while(!feof($fp))
$this->ipn_response .= fgets($fp, 1024); 
fclose($fp); // close connection
}
if (preg_match("/VERIFIED/",$this->ipn_response))
{
// Valid IPN transaction.
$this->log_ipn_results(true);
return true;         
} 
else 
{
// Invalid IPN transaction.  Check the log for details.
$this->last_error = 'IPN Validation Failed.';
$this->log_ipn_results(false);  
return false;
}
}
function log_ipn_results($success) 
{
if (!$this->ipn_log) return;  // is logging turned off?
// Timestamp
$text = '['.date('m/d/Y g:i A').'] - '; 
// Success or failure being logged?
if ($success) $text .= "SUCCESS!n";
else $text .= 'FAIL: '.$this->last_error."n";
// Log the POST variables
$text .= "IPN POST Vars from Paypal:n";
foreach ($this->ipn_data as $key=>$value)
$text .= "$key=$value, ";
// Log the response from the paypal server
$text .= "nIPN Response from Paypal Server:n ".$this->ipn_response;
// Write to log
$fp=fopen($this->ipn_log_file,'a');
fwrite($fp, $text . "nn"); 
fclose($fp);  // close file
}

function dump() 
{
// Used for debugging, this function will output all the field/value pairs
// that are currently defined in the instance of the class using the
// add_field() function.
ksort($this->fields);
echo '<h2>ppal->dump() Output:</h2>' . "n";
echo '<code style="font: 12px Monaco, 'Courier New', Verdana, Sans-serif;  background: #f9f9f9; border: 1px solid #D0D0D0; color: #002166; display: block; margin: 14px 0; padding: 12px 10px;">' . "n";
foreach ($this->fields as $key => $value) echo '<strong>'. $key .'</strong>:    '. urldecode($value) .'<br/>';
echo "</code>n";
}

function curlPost($paypalurl,$paypalreturnarr)
{
$req = 'cmd=_notify-validate';
foreach($paypalreturnarr as $key => $value) 
{
$value = urlencode(stripslashes($value));
$req .= "&$key=$value";
}
$ipnsiteurl=$paypalurl;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $ipnsiteurl);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $req);
$result = curl_exec($ch);
curl_close($ch);
return $result;
}

}
?>

PayPal IPN 配置文件

<?php  if (!defined('BASEPATH')) exit('No direct script access allowed');
// ------------------------------------------------------------------------
// Paypal IPN Class
// ------------------------------------------------------------------------
// Use PayPal on Sandbox or Live
$config['sandbox'] = TRUE; // FALSE for live environment
// PayPal Business Email ID
$config['business'] = 'selleremail@email.com';
// If (and where) to log ipn to file
$config['paypal_lib_ipn_log_file'] = BASEPATH . 'logs/paypal_ipn.log';
$config['paypal_lib_ipn_log'] = TRUE;
// Where are the buttons located at 
$config['paypal_lib_button_path'] = 'buttons';
// What is the default currency?
$config['paypal_lib_currency_code'] = 'MYR';
?>

我的控制器

public function pay(){
//Set variables for paypal form
$returnURL = site_url(AGENT_ROLE.$this->data['controller']."/Success"); //payment success url
$cancelURL = site_url(AGENT_ROLE.$this->data['controller']."/Cancelled");//payment cancel url
$notifyURL = site_url(AGENT_ROLE.$this->data['controller']."/Notification"); //ipn url
//get particular product data
$product = "test product";
$userID = 1; //current user id
$logo = base_url().'assets/images/logo/logo.png';
$this->paypal_lib->add_field('return', $returnURL);
$this->paypal_lib->add_field('cancel_return', $cancelURL);
$this->paypal_lib->add_field('notify_url', $notifyURL);
$this->paypal_lib->add_field('item_name', $product);
$this->paypal_lib->add_field('custom', $userID);
$this->paypal_lib->add_field('item_number',  1);
$this->paypal_lib->add_field('amount',  100.00);        
$this->paypal_lib->image($logo);
$this->paypal_lib->paypal_auto_form();
}
function success(){
//get the transaction data
//        $paypalInfo = $this->input->get();
//        $paypalInfo2 = $this->input->post();
//        $data['item_number'] = $paypalInfo['item_number']; 
//        $data['txn_id'] = $paypalInfo["tx"];
//        $data['payment_amt'] = $paypalInfo["amt"];
//        $data['currency_code'] = $paypalInfo["cc"];
//        $data['status'] = $paypalInfo["st"];
//        $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'];
//pass the transaction data to view
var_dump(fsockopen ('https://www.sandbox.paypal.com/', 443, $errno, $errstr, 30));
var_dump($_POST);
}
function cancel(){
//        $this->load->view('paypal/cancel');
echo "Cancelled";
}
function ipn(){
//paypal return transaction details array
$paypalInfo    = $this->input->post();
$data['user_id'] = $paypalInfo['custom'];
$data['product_id']    = $paypalInfo["item_number"];
$data['txn_id']    = $paypalInfo["txn_id"];
$data['payment_gross'] = $paypalInfo["mc_gross"];
$data['currency_code'] = $paypalInfo["mc_currency"];
$data['payer_email'] = $paypalInfo["payer_email"];
$data['payment_status']    = $paypalInfo["payment_status"];
$paypalURL = $this->paypal_lib->paypal_url;  
//        $paypalURL = 'https://www.sandbox.paypal.com/cgi-bin/webscr';          
$result    = $this->paypal_lib->curlPost($paypalURL,$paypalInfo);
//check whether the payment is verified
if(preg_match("/VERIFIED/i",$result)){
//insert the transaction data into the database
//            $this->product->insertTransaction($data);
var_dump("IPN SUCCESS");
}
}

在 ipn 函数中添加以下代码,您希望在其中接收响应,

// STEP 1: read POST data
// Reading POSTed data directly from $_POST causes serialization issues with array data in the POST.
// Instead, read raw POST data from the input stream.
$raw_post_data  = file_get_contents('php://input');
$raw_post_array = explode('&', $raw_post_data);
$myPost         = array();
foreach ($raw_post_array as $keyval) {
$keyval = explode('=', $keyval);
if (count($keyval) == 2)
$myPost[$keyval[0]] = urldecode($keyval[1]);
}
// read the IPN message sent from PayPal and prepend 'cmd=_notify-validate'
$req = 'cmd=_notify-validate';
if (function_exists('get_magic_quotes_gpc')) {
$get_magic_quotes_exists = true;
}
foreach ($myPost as $key => $value) {
if ($get_magic_quotes_exists == true && get_magic_quotes_gpc() == 1) {
$value = urlencode(stripslashes($value));
} else {
$value = urlencode($value);
}
$req .= "&$key=$value";
}
log_message('error', "IPN DATA: " . $req);

要检查 ipn 响应,请检查日志文件夹中的日志

欲了解更多信息,请单击此处

还有一件事,您设置了ipn url,如下所示,因此PayPal将在控制器中的"通知"功能上发送响应

$notifyURL = site_url(AGENT_ROLE.$this->data['controller']."/Notification"); //ipn url

最新更新