我正在使用此课程
<?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));
}
但我只获得“已验证”或“1”(whitout或使用print_r函数)。
我还尝试使用
直接返回原始卷曲响应return $response;
或
return $this->response;
或
return $this->parse_string;
但每次我只收到“1”或“已验证”.......
非常感谢
答案 0 :(得分:1)
Paypal IPN通知作为发布的数据进入您的脚本。您可以在该类中看到代码使用超级全局$_POST
来引用此传入数据。您可以直接使用已发布的数据,而不是使用该类。
危险在于它可能不是来自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注入构造函数,而不是将其硬编码到类中。这样你就可以从外部切换live和sandbox,而不是修改类文件。
答案 1 :(得分:0)
我很困惑。 $_POST
是超全球的。因此,您不需要此类来告诉您值,因为您已经拥有它们。 VERIFIED响应是为了让您知道数据是真实的。