Magento:来自Paypal API IPN端点的空响应

时间:2017-11-28 14:07:18

标签: php magento paypal

下午好,

我们的客户今天早上收到了一封电子邮件通知,说明:

请检查处理PayPal即时付款通知(IPN)的服务器。发送到以下网址的即时付款通知失败:

https://www.domain1.com/paypal/ipn

https://www.domain2.com/paypal/ipn

我查看了处理这些端点的代码,发现由于以下端点的响应为空而引发异常:

https://www.paypal.com/cgi-bin/webscr

app / code / core / Mage / Paypal / Model / Ipn.php(133)中的代码:

protected function _postBack(Zend_Http_Client_Adapter_Interface $httpAdapter)
{
    $postbackQuery = http_build_query($this->_request) . '&cmd=_notify-validate';
    $postbackUrl = $this->_config->getPaypalUrl();
    $this->_debugData['postback_to'] = $postbackUrl;

    $httpAdapter->setConfig(array('verifypeer' => $this->_config->verifyPeer));
    $httpAdapter->write(
        Zend_Http_Client::POST,
        $postbackUrl,
        '1.1',
        array('Connection: close'),
        $postbackQuery
    );

    try {
        $postbackResult = $httpAdapter->read();
    } catch (Exception $e) {
        $this->_debugData['http_error'] = array('error' => $e->getMessage(), 'code' => $e->getCode());
        throw $e;
    }

    /*
     * Handle errors on PayPal side.
     */
    $responseCode = Zend_Http_Response::extractCode($postbackResult);
    if (empty($postbackResult) || in_array($responseCode, array('500', '502', '503'))) {
        if (empty($postbackResult)) {
            $reason = 'Empty response.';
        } else {
            $reason = 'Response code: ' . $responseCode . '.';
        }
        $this->_debugData['exception'] = 'PayPal IPN postback failure. ' . $reason;
        throw new Mage_Paypal_UnavailableException($reason);
    }

    $response = preg_split('/^\r?$/m', $postbackResult, 2);
    $response = trim($response[1]);
    if ($response != 'VERIFIED') {
        $this->_debugData['postback'] = $postbackQuery;
        $this->_debugData['postback_result'] = $postbackResult;
        throw new Exception('PayPal IPN postback failure. See ' . self::DEFAULT_LOG_FILE . ' for details.');
    }
}

我设置了同一网站的沙箱版本,在处理付款时,我仍然收到来自https://www.sandbox.paypal.com/cgi-bin/webscr的空回复

因为响应为空,所以抛出异常并且响应头被设置为503 Service Unavailable,这是我认为触发了客户端收到的电子邮件。

我在这里看到了一些类似的问题,但是实际上导致响应为空的是什么没有结论?这是Paypal的问题,还是我们的结局有问题?为了完整起见,我们最近进入了一个新的服务器(虽然这个问题似乎只出现在最后一天左右)。

1 个答案:

答案 0 :(得分:0)

因此,在承诺自己已经用尽了我的询问后,我似乎已经开枪了。

我们的防火墙已将白名单api-3t.paypal.com列入白名单,这是大多数其他API调用的终端。

但正如您所见,这一个请求将转至www.paypal.com(或www.sandbox.paypal.com)

更糟糕的是,我将www.paypal.com添加到了防火墙,但没有添加到www.sandbox.paypal.com,这意味着即使我已经“修复”了生产环境,我的沙盒环境也出现了错误......