贝宝 IPN 集成到 PHP

Posted

技术标签:

【中文标题】贝宝 IPN 集成到 PHP【英文标题】:Paypal IPN Integration into PHP 【发布时间】:2012-08-06 04:26:18 【问题描述】:

我无法将 Paypal 的 IPN 集成到我的 php 中,我有以下脚本,当在 paypal 沙箱中进行付款时,它一直处于默认情况。

任何帮助将不胜感激!

$request = "cmd=_notify-validate"; 
    foreach ($_POST as $varname => $varvalue)
        $email .= "$varname: $varvalue\n";  
        if(function_exists('get_magic_quotes_gpc') and get_magic_quotes_gpc())  
            $varvalue = urlencode(stripslashes($varvalue)); 
        
        else  
            $value = urlencode($value); 
         
        $request .= "&$varname=$varvalue"; 
     
    $ch = curl_init();
    curl_setopt($ch,CURLOPT_URL,"https://www.sandbox.paypal.com/cgi-bin/webscr");
    //curl_setopt($ch,CURLOPT_URL,"https://www.paypal.com");
    curl_setopt($ch,CURLOPT_POST,true);
    curl_setopt($ch,CURLOPT_POSTFIELDS,$request);
    curl_setopt($ch,CURLOPT_FOLLOWLOCATION,false);
    curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
    $result = curl_exec($ch);
    curl_close($ch);

    switch($result)
        case "VERIFIED":
                    mail('test@test.com','worked','worked');
            break;
        case "INVALID":
            mail('test@test.com','invaild','invaild');
            break;
        default:
            mail('test@test.com','failed','failed');
    

如果我给自己发电子邮件 $result 它只是空白。

编辑:我发现这是我的 LAMP 的服务器端问题,但不确定如何解决。

注意:我确实在服务器上安装了 curl,但我不确定它是否配置正确。

【问题讨论】:

【参考方案1】:

我建议使用 var_dump 和 Paypal 的测试工具进行一些调试:https://developer.paypal.com/cgi-bin/devscr?cmd=_ipn-link-session

我可以理解,使用第三方服务会变得困难且耗时。

可能值得简单地获取 POST 数据,将其序列化并将其应用于变量,这样您就可以在 PayPal 不触发回调的情况下进行测试。

我最初会做这样的事情来获取 PayPal POST。

<?php
   file_put_contents(serialize($_POST), 'post.log');
   //Now you have the post request serialized we can grab the contents and apply it to a variable for fast testing.
?>

代码的开始:

<?php
    $_POST = unserialize(file_get_content('post.log'));
    //Now you can execute the script via command line or within your browser without requiring PayPal's testing tool. Use var_dump to investigate what's the issue.
    $request = "cmd=_notify-validate"; 
    foreach ($_POST as $varname => $varvalue)
        $email .= "$varname: $varvalue\n";  
        if(function_exists('get_magic_quotes_gpc') and get_magic_quotes_gpc())  
            $varvalue = urlencode(stripslashes($varvalue)); 
        
        else  
            $value = urlencode($value); 
         
        $request .= "&$varname=$varvalue"; 
    
?>

现在:这在测试方面更加有效和高效。在您的示例中,您正在向自己发送电子邮件,但在邮件函数正文中的任何位置都没有包含 $result。 http://php.net/manual/en/function.mail.php

PayPal 的 IPN 示例使用 fsock,尽管 CURL 更有效且更易于使用。 PayPal 的沙盒更改最近也出现了一些问题。 https://www.paypal-community.com/t5/Selling-on-your-website/IPN-response-problem/m-p/519862/message-uid/519862#U519862

另外:要确定主要原因是什么,正如您所说,这似乎是您的 LAMP 堆栈。检查您的日志目录(通常是 /var/log/),通常从他们那里您将能够查明失败的原因。

【讨论】:

我解决了这个问题,看起来贝宝在通过 SSL 与我的服务器通信时遇到问题,我在下面的行中输入了它并且它有效:curl_setopt($ch,CURLOPT_SSL_VERIFYPEER, false);

以上是关于贝宝 IPN 集成到 PHP的主要内容,如果未能解决你的问题,请参考以下文章

支付 IPN - 支付集成问题 - 1 个贝宝帐户上的多个订阅

贝宝集成类型混淆

Paypal IPN 集成问题

贝宝 IPN 验证

Paypal IPN 订阅协议

Asp.net MVC - 贝宝 ipn