0

我正在使用这个类

<?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 函数)。

我也只是尝试直接返回原始卷曲响应

return $response;

或者

return $this->response;

或者也

return $this->parse_string;

但每次我只收到“1”或“已验证”......

非常感谢

4

2 回答 2

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

?>

die此外,如果 curl 请求有问题,您的验证器将调用。它可能应该返回 false ,或者最好还是抛出一个你可以用try...catch. 您不希望您的整个过程仅仅因为 Paypal 速度慢并且请求超时而吐出带有神秘错误代码的白屏。处理错误,不要die。最后,与验证器一样,您应该将 url 注入构造函数,而不是将其硬编码到类中。这样您就可以从外部在实时和沙盒之间切换,而无需修改类文件。

于 2013-11-08T03:35:50.513 回答
0

我很困惑。$_POST是一个超全球。所以你不需要这个类来告诉你这些值,因为你已经有了它们。VERIFIED 响应是让您知道数据是真实的。

于 2013-11-08T03:28:40.960 回答