【问题标题】:Debugging ipn.php when using paypal sandbox ipn simulator使用paypal沙箱ipn模拟器时调试ipn.php
【发布时间】:2012-07-26 21:00:43
【问题描述】:

使用paypal沙箱ipn模拟器工具时如何调试ipn.php文件?

代码如下:

// read the post from PayPal system and add 'cmd'  
$req = 'cmd=_notify-validate';

foreach($_POST as $key = > $value) {
    $value = urlencode(stripslashes($value));
    $req. = "&$key=$value";
}

// post back to PayPal system to validate  
$header = "POST /cgi-bin/webscr HTTP/1.0\r\n";
$header. = "Content-Type: application/x-www-form-urlencoded\r\n";
$header. = "Content-Length: ".strlen($req)."\r\n\r\n";

$fp = fsockopen('ssl://www.sandbox.paypal.com', 443, $errno, $errstr, 30);

if (!$fp) {
    // HTTP ERROR  
} else {
    fputs($fp, $header.$req);

    while (!feof($fp)) {
        $res = fgets($fp, 1024);

        if (strcmp($res, "VERIFIED") == 0) {

            $DBH = new PDO("mysql:host=localhost;dbname=db", "user", "pass");
            $DBH - > setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

            $STH = $DBH - > prepare("update table2 set status = :status where tracking_id = :tracking_id");

            $status = 1;
            parse_str($req, $data);

            $STH - > bindParam(':status', $status, PDO::PARAM_INT, 1);
            $STH - > bindParam(':tracking_id', 'id_goes_here', PDO::PARAM_STR, 50);

            $STH - > execute();

            $DBH = null;

        } else if (strcmp($res, "INVALID") == 0) {
            // do something else
        }
    }

    fclose($fp);
}

我通常使用 netbeans 调试工具进行调试,但是如何使用沙盒模拟器进行调试?当我从沙盒 ipn 模拟器中单击 send ipn 时,我在沙盒中收到一条消息说 IPN successfully sent.,但是当我进入我的数据库检查 status 时,它仍然是 0

【问题讨论】:

    标签: php paypal paypal-ipn paypal-sandbox


    【解决方案1】:

    可能是参数绑定问题

    $STH - > bindParam(':tracking_id', 'id_goes_here', PDO::PARAM_STR, 50);
    

    如果表 'table2' 不包含 tracking_id = 'id_goes_here' 的行,更新操作将失败。

    试试这个

    <?php
    
    $testMode = false;
    $url = 'https://www.paypal.com/cgi-bin/webscr';
    if ($testMode === true)
        $url = 'https://www.sandbox.paypal.com/cgi-bin/webscr';
    
    $ipnResponse = ''; // holds the IPN response from paypal
    $ipnData = array(); // array will contain the POST values for IPN
    
    $urlParsed = parse_url($url);
    
    $req = 'cmd=_notify-validate'; // Add 'cmd' to req (ipn command)
    
    // Read the post from PayPal system and add them to req
    foreach ($_POST as $key => $value) {
        $ipnData["$key"] = $value;
        $value = urlencode(stripslashes($value));
        $req .= "&" . $key . "=" . $value;
    }
    
    // Open the connection to paypal
    $fp = fsockopen($urlParsed['host'], "80", $errno, $errstr, 30);
    
    // If could open the connection and check response
    if ($fp) {
    
        fputs($fp, "POST " . $urlParsed['path'] . " HTTP/1.1\r\n");
        fputs($fp, "Host: " . $urlParsed['host'] . "\r\n");
        fputs($fp, "Content-type: application/x-www-form-urlencoded\r\n");
        fputs($fp, "Content-length: " . strlen($req) . "\r\n");
        fputs($fp, "Connection: close\r\n\r\n");
        fputs($fp, $req . "\r\n\r\n");
    
        // Loop through the response from the server and append to variable
        while (!feof($fp)) {
            $ipnResponse .= fgets($fp, 1024);
        }
        fclose($fp);
    
        // Valid IPN transaction.
        if (preg_match('/^VERIFIED/', $ipnResponse)) {
            // Some action on IPN validation - update payment status etc
            die("OK. IPN Validation: Success");     
        }
        // Invalid IPN transaction
        else {
            // Some action on IPN validation - update payment status etc
            die("ERROR. IPN Validation: Failed");
        }
    }
    // Else no connection, so maybe wrong url or other reasons, you can do another call later
    else {
        die("ERROR. IPN Connection: fsockopen error");
    }
    
    
    ?>
    

    【讨论】:

    【解决方案2】:

    一般来说,当我想调试在浏览器中不提供直接输出的脚本时,我会在整个脚本中调用一个简单的日志记录函数来输出变量值或帮助确定发生错误的位置。

    当我不知道脚本在哪里死去时,我会在每个重要的代码行之后在日志文件中写一行。运行脚本然后检查日志文件后,我可以确切地看到是哪一行导致脚本死机,下面是一个非常简化的示例。当然,在一切顺利运行之后,所有的日志记录都应该被删除。

    public function logToFile($msg){
        $file = 'log.txt';
        $current = file_get_contents($file);
        $current .= $msg . "\n";
        file_put_contents($file, $current);
    }
    
    public function doOtherStuff(){
    
        foreach ($_POST as $key => $value) {
          $ipnData["$key"] = $value;
          $value = urlencode(stripslashes($value));
          $req .= "&" . $key . "=" . $value;
        }
    
        logToFile("1");
    
        $fp = fsockopen($urlParsed['host'], "80", $errno, $errstr, 30);
    
        logToFile("2");
    
        if ($fp) {
          logToFile("3");
          fputs($fp, "POST " . $urlParsed['path'] . " HTTP/1.1\r\n");
          logToFile("4");
          fputs($fp, "Host: " . $urlParsed['host'] . "\r\n");
          logToFile("5");
          fputs($fp, "Content-type: application/x-www-form-urlencoded\r\n");
          logToFile("6");
          fputs($fp, "Content-length: " . strlen($req) . "\r\n");
          logToFile("7");
          fputs($fp, "Connection: close\r\n\r\n");
          logToFile("8");
          fputs($fp, $req . "\r\n\r\n");
          logToFile("9");
    
          while (!feof($fp)) {
            logToFile("10");
            $ipnResponse .= fgets($fp, 1024);
          }
          logToFile("11");
          fclose($fp);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-19
      • 2015-08-28
      • 1970-01-01
      • 2013-08-28
      • 2017-08-08
      • 2016-12-27
      • 2016-07-22
      相关资源
      最近更新 更多