gpt4 book ai didi

php - Paypal IPN 返回空白 POST 或 GET

转载 作者:太空宇宙 更新时间:2023-11-03 16:16:16 24 4
gpt4 key购买 nike

我最近为 CodeIgniter 找到了一个 PayPal 库,并且一直在尝试从 PayPal 接收变量。然而,什么都没有返回。我已尝试对 GET 和 POST 变量进行 var_dump,但没有返回任何内容。

我已成功向 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.1\r\n");
fputs($fp, "Host: $url_parsed[host]\r\n");
fputs($fp, "Content-type: application/x-www-form-urlencoded\r\n");
fputs($fp, "Content-length: ".strlen($post_string)."\r\n");
fputs($fp, "Connection: close\r\n\r\n");
fputs($fp, $post_string . "\r\n\r\n");

// 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 . "\n\n");

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';

?>

我的 Controller

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 响应,检查日志,在日志文件夹中

更多信息click here

还有一件事你已经设置了 ipn url 如下,所以 paypal 将在你的 Controller 中发送对“通知”功能的响应

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

关于php - Paypal IPN 返回空白 POST 或 GET,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45906032/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com