使用paypal沙箱ipn模拟器时调试ipn.php


Debugging ipn.php when using paypal sandbox ipn simulator

使用贝宝沙箱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

也许问题出在参数绑定中

$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");
}

?>

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

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

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