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-&gt;validate(); 时,有趣的数据是验证器返回的带有return $this-&gt;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-&gt;validate($_POST); $logger = new Log('/res.log'); $logger-&gt;write(print_r($result)); 在日志中我只有一个“1”。如果我删除退货 $response,PayPal 会说“我们无法发送 IPN” 好的!刚刚解决!即,在我获得 CONFIRMED VALUE 之后,我需要重新扫描 $_POST .... 现在一切正常!非常感谢!【参考方案2】:

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

【讨论】:

以上是关于Paypal IPN:如何从此类中获取 POST?的主要内容,如果未能解决你的问题,请参考以下文章

Paypal IPN - 获取 + 然后丢失数据?

paypal IPN 获取买家交易ID

未设置 PayPal IPN $_POST['txn_id']

如何使用 sandbox.paypal 获取 IPN 进行支付

Paypal IPN,缺少 POST 数据

IPN 验证返回 INVALID,因为 PayPal 在 POST 中向 IPN 侦听器发送了不正确的字符集