在Amazon Marketplace API请求上获得响应状态码为0的内部错误


Getting internal error with Response Status Code 0 on Amazon Marketplace API Requests

我已经下载了Amazon的Marketplace SDK,我正在试用样本目录中的一个样本。然而,每当我尝试它时,我都会得到以下详细信息的异常:

Caught Exception: Internal Error
Response Status Code: 0
Error Code: 
Error Type: 
Request ID: 
XML: RequestId: , ResponseContext: , Timestamp: 
ResponseHeaderMetadata: 

我已经启用了CURL与SSL以及。我做错了什么?

这个答案供以后参考。有关深入的故障排除,请参阅对问题的评论。

空响应表示与Amazon服务器的连接失败。在这种情况下,HTTP工作得很好,但HTTPS不行。由于在cURL设置中关闭CURLOPT_SSL_VERIFYPEER解决了这个问题,因此亚马逊服务器似乎没有使用有效的SSL证书。

打开CURLOPT_SSL_VERIFYPEER检查请求的主机是否有有效的证书,如果没有,则让cURL返回false。当CURLOPT_SSL_VERIFYPEER关闭时,接受无效证书(如自签名证书),并返回常规响应。

供将来参考。在新版本的SDK中,这些选项在client.php中被引用,如下所示

private function getDefaultCurlOptions() {
    return array (
      CURLOPT_POST => true,
      CURLOPT_USERAGENT => $this->config['UserAgent'],
      CURLOPT_VERBOSE => true,
      CURLOPT_HEADERFUNCTION => array ($this, 'headerCallback'),
      CURLOPT_RETURNTRANSFER => true,
      CURLOPT_SSL_VERIFYPEER => true,
      CURLOPT_SSL_VERIFYHOST => 2
    );
  }

设置

CURLOPT_SSL_VERIFYPEER => false,

在我的例子中起了作用。但是,由于我不是安全专家,因此不从这一角度提出建议。至少它起作用了,你可能不会像我那样浪费一整天的时间。

我在使用Amazon时也遇到过类似的连接问题。它是与Amazon php api捆绑的样例文件,其中包含以下配置数组:

$config = array (
  'ServiceURL' => $serviceUrl,
  'ProxyHost' => null,
  'ProxyPort' => -1,
  'MaxErrorRetry' => 3,
);

,如果这是复制而不修改

'ProxyPort' => -1,

将导致尝试通过代理端口-1连接,这当然会失败(通过检查curl错误跟踪问题)。