0

我不确定为什么会出现这种行为?我正在尝试在我的 PHP 脚本中实现 Blockchain.com Web API。他们的文档指出我应该使用file_get_contentsPHP 函数来查询它,我这样做:

$xpub = "xpub123455";
$callback_url = "https://example.com";
$APIKey = "12345";
$url = "https://api.blockchain.info/v2/receive?xpub=".urlencode($xpub).'&callback='.urlencode($callback_url).'&key='.urlencode($APIKey);
//echo("URL: ".htmlentities($url)."<br><br>");
$res = @file_get_contents($url);
if($res)
{
    echo("RES: ".htmlentities(var_export($res, true)));
}
else
{
    $err = error_get_last();
    echo("err: ".($err && isset($err['message']) ? $err['message'] : "-"));
}

在这种情况下file_get_contents返回false,如果我再调用error_get_last,我会收到以下错误:

错误:file_get_contents(-url-):打开流失败:HTTP 请求失败!HTTP/1.1 401 未经授权

但是,如果我只是复制要传递的 URLfile_get_contents并将其粘贴到Chrome 的地址栏中:

https://api.blockchain.info/v2/receive?xpub=xpub123455&callback=https%3A%2F%2Fexample.com&key=12345

它返回一个有效的 JSON 数据:

在此处输入图像描述

为什么这两个输出不同?我怎样才能得到 JSON 响应file_get_contents

4

2 回答 2

1

allow_url_fopen 函数可能受到限制。

最好使用 cURL 而不是 file_get_contents:

function url_get_contents ($Url) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $Url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $output = curl_exec($ch);
    curl_close($ch);
    return $output;
}

那么你可以使用这个功能:

$res = @url_get_contents($url);
于 2020-02-06T02:54:51.007 回答
0

要回答这个问题:

以及如何从 file_get_contents 获得 JSON 响应?

您可以从 with 获取 json 响应file_get_contents(我http.ignore_errors在这里添加了一个标志,这将防止 PHP 抛出错误):

$xpub = "xpub123455";
$callback_url = "https://example.com";
$APIKey = "12345";
$url = "https://api.blockchain.info/v2/receive?xpub=".urlencode($xpub).'&callback='.urlencode($callback_url).'&key='.urlencode($APIKey);

//add http.ignore_errors flag here 
$res = file_get_contents($url, false, stream_context_create([
    "http" => [
      'ignore_errors' => true
    ]
]));

/*
 * string(40) "{message" : "API Key is not valid"}"
 */
var_dump($res);

您能否分享 api 密钥,因为帮助有点困难,因为在获得 api 密钥之前您必须经过审查过程。因此无法重现该错误。

于 2021-11-17T10:33:25.510 回答