贝宝PDT / IPN无法获取错误:4003

时间:2018-10-28 17:09:10

标签: php paypal paypal-ipn

我正在使用通过PDT和IPN执行的以下功能(出于可靠性考虑,我同时使用这两种方法,即如果客户未自动返回我的网站,则PDT无法使用,这就是为什么我将IPN方法用作后备)。

function paypal_verify() {
    global $CONFIG;

    $txn_id = isset($_GET['tx']) ? $_GET['tx'] : ''; /* come via PDT */

    if (isset($_POST['txn_id'])) {
        $txn_id = $_POST['txn_id']; /* come via IPN */
    }

    if (!preg_match('#^[a-z\d]{17}$#iD', $txn_id)) {
         return false;
    }

    if ($CONFIG['test']) {
        $pp_hostname = 'www.sandbox.paypal.com';
    } else {
        $pp_hostname = 'www.paypal.com';
    }

    $req = "cmd=_notify-synch&tx={$txn_id}&at={$CONFIG['identity_token']}";

    $header = "POST /cgi-bin/webscr HTTP/1.1\r\n";
    $header .= "Content-Type: application/x-www-form-urlencoded\r\n";
    $header .= "Host: {$pp_hostname}\r\n";
    $header .= "Connection: close\r\n";
    $header .= "Content-Length: " . strlen($req) . "\r\n\r\n";

    $fp = fsockopen("ssl://{$pp_hostname}", 443, $errno, $errstr, 30);

    if (!$fp) {
        return false;
    } else {
        fputs ($fp, $header . $req);
        $res = '';
        $header_done = false;
        while (!feof($fp)) {
            $line = fgets ($fp, 1024);
            if (strcmp($line, "\r\n") == 0) {
                $header_done = true;
            } elseif ($header_done) {
                $res .= $line;
            }
        }

        //validate $res here...
        //etc.
}

现在问题是$ res返回“错误:失败错误:4003”。我已确保PDT身份令牌正确无误,并已收到有效的交易ID。

我的网站没有很多客户/流量,并且该代码以前运行正常。但是,当客户付款但由于代码失败而导致我的数据库未更新时,出现了问题。我已经检查了PayPal的IPN历史记录工具,可以正常访问执行该功能的页面,而且我还尝试让PayPal多次重新访问它,而我尝试进行调试但仍得到相同的错误响应。

有什么想法吗?

0 个答案:

没有答案