Paypal IPN:如何从此类中获取 POST?
Posted
技术标签:
【中文标题】Paypal IPN:如何从此类中获取 POST?【英文标题】:Paypal IPN: how get the POSTs from this class? 【发布时间】:2013-11-19 17:58:29 【问题描述】:我正在使用这个类
<?php
class paypalIPN
//sandbox:
private $paypal_url = 'https://www.sandbox.paypal.com/cgi-bin/webscr';
//live site:
//private $paypal_url = 'https://www.paypal.com/cgi-bin/webscr';
private $data = null;
public function __construct()
$this->data = new stdClass;
public function isa_dispute()
//is it some sort of dispute.
return $this->data->txn_type == "new_case";
public function validate()
// parse the paypal URL
$response = "";
$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 = '';
foreach ($_POST as $field=>$value)
$this->data->$field = $value;
$post_string .= $field.'='.urlencode(stripslashes($value)).'&';
$post_string.="cmd=_notify-validate"; // append ipn command
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $this->paypal_url);
//curl_setopt($ch, CURLOPT_VERBOSE, 1);
//keep the peer and server verification on, recommended
//(can switch off if getting errors, turn to false)
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_string);
$response = curl_exec($ch);
if (curl_errno($ch))
die("Curl Error: " . curl_errno($ch) . ": " . curl_error($ch));
curl_close($ch);
return $response;
if (preg_match("/VERIFIED/", $response))
// Valid IPN transaction.
return $this->data;
else
return false;
我记得在这种模式下:
public function get_ipn()
$ipn = new paypalIPN();
$result = $ipn->validate();
$logger = new Log('/error.log');
$logger->write(print_r($result));
但我只获得“VERIFIED”或“1”(whitout 或使用 print_r 函数)。
我也尝试直接返回原始 curl 响应
return $response;
或
return $this->response;
也可以
return $this->parse_string;
但每次我只收到“1”或“已验证”......
非常感谢
【问题讨论】:
【参考方案1】:Paypal IPN 通知作为发布数据进入您的脚本。您可以在该类中看到,代码使用超全局 $_POST
来引用此传入数据。您可以直接使用发布的数据,而不是使用该类。
危险在于它可能不是来自 Paypal。
您在此处显示的脚本正在执行回发验证——也就是说,它正在获取您认为 Paypal 发布给您的信息并将其直接返回给他们;你问他们,“这是真的吗?”。 Paypal 正在验证,是的,这些信息来自他们。您在该代码中看到的 $response
变量仅包含来自 Paypal 的确认。
在您的代码中,当您调用$result = $ipn->validate();
时,有趣的数据是验证器返回的带有return $this->data;
行的数据(相同的数据仍在$_POST
中)。根据您的代码,它将位于变量$result
中。这就是你想要使用的东西,它有交易数据,它是 IPN 通知。同样,来自类内部的 $response
值只是 Paypal 的一个无趣的点头,让您知道您将要使用的数据是真实的。
顺便说一句,这个类有点凌乱而且不是很灵活。教程代码?几点建议:最好将数据注入到 validate 方法中,而不是直接读取$_POST
:
<?php
...
public function validate($data)
...
foreach ($data as $field=>$value)
...
...
//use
$result = $ipn->validate($_POST);
?>
此外,如果 curl 请求有问题,您的验证器将调用 die
。它可能应该返回 false,或者最好还是抛出一个您可以使用 try...catch
处理的异常。您不希望您的整个过程仅仅因为 Paypal 速度慢并且请求超时而吐出带有神秘错误代码的白屏。处理错误,不要die
。最后,与验证器一样,您应该将 url 注入构造函数,而不是将其硬编码到类中。这样您就可以从外部在实时和沙盒之间切换,而无需修改类文件。
【讨论】:
print_r 关于什么?而且,您是否修改了课程?完全按照此处发布的方式查看您的代码,return $response;
行需要删除,其他一切都应该没问题。
首先感谢您的帮助。刚刚用你的指示修改了类,现在以这种方式调用:$ipn = new paypalIPN(); $result = $ipn->validate($_POST); $logger = new Log('/res.log'); $logger->write(print_r($result));
在日志中我只有一个“1”。如果我删除退货 $response,PayPal 会说“我们无法发送 IPN”
好的!刚刚解决!即,在我获得 CONFIRMED VALUE 之后,我需要重新扫描 $_POST .... 现在一切正常!非常感谢!【参考方案2】:
我很困惑。 $_POST
是一个超全球。所以你不需要这个类来告诉你这些值,因为你已经有了它们。 VERIFIED 响应是为了让您知道数据是真实的。
【讨论】:
以上是关于Paypal IPN:如何从此类中获取 POST?的主要内容,如果未能解决你的问题,请参考以下文章
未设置 PayPal IPN $_POST['txn_id']