Coinbase PHP(cURL) API报错:Scopes don't match current API version 求助
解决Coinbase PHP API的「Scopes don't match current API version」错误
这个错误提示看似和权限范围相关,但本质是你的API请求签名验证失败,或是密钥权限与API版本不兼容导致的。我帮你梳理下代码里的几个关键问题,以及对应的修复方案:
1. 时间戳不一致的核心问题
你已经获取了Coinbase服务器的时间$srvr_time,但在请求头的CB-ACCESS-TIMESTAMP里却用了本地的time(),这会导致签名里的时间和请求头的时间不匹配,直接触发API验证失败,进而抛出这个容易混淆的错误。
2. 签名构造不符合V2 API规范
Coinbase V2 API要求签名的格式是:timestamp + HTTP_METHOD + request_path + request_body(GET请求的body为空字符串)。你当前的$Datas只拼接了时间戳、方法和"accounts",但正确的request_path应该是完整的路径(比如/v2/accounts),而不是仅仅"accounts"。
3. 过时的API版本
你使用的CB-VERSION: 2017-08-07版本过于老旧,可能和当前Coinbase API的权限体系不兼容,建议更新到较新的稳定版本,比如2021-08-01。
4. 不安全的SSL设置
关闭CURLOPT_SSL_VERIFYHOST和CURLOPT_SSL_VERIFYPEER会让你的请求面临安全风险,建议移除这两行,让cURL默认验证SSL证书。
修正后的完整代码
<?php $COINBASE_API_KEY = '你的API密钥'; $COINBASE_API_SECRET = '你的API密钥Secret'; $api_base_url = 'https://api.coinbase.com/v2/'; $request_path = '/v2/accounts'; // 完整的请求路径 $method = 'GET'; $body = ''; // GET请求body为空 // 获取Coinbase服务器时间,确保时间戳一致 $server_time_response = json_decode(file_get_contents($api_base_url . 'time'), true); $timestamp = $server_time_response["data"]["epoch"]; // 构造签名字符串 $sign_string = $timestamp . $method . $request_path . $body; // 生成HMAC签名 $hmacSig = base64_encode(hash_hmac("sha256", $sign_string, base64_decode($COINBASE_API_SECRET), true)); $curl = curl_init($api_base_url . 'accounts'); curl_setopt($curl, CURLOPT_HTTPHEADER, array( 'Content-Type: application/json', 'CB-ACCESS-KEY: ' . $COINBASE_API_KEY, 'CB-ACCESS-TIMESTAMP: ' . $timestamp, // 使用服务器时间,和签名里的一致 'CB-VERSION: 2021-08-01', // 更新为较新的API版本 'CB-ACCESS-SIGN: ' . $hmacSig )); // 移除不安全的SSL设置,保持默认验证 // curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); // curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE); $response = curl_exec($curl); curl_close($curl); $output = json_decode($response, true); print_r($output); ?>
额外检查项
- 确认你的API密钥已经启用了
wallet:accounts:read权限(在Coinbase后台的API密钥设置里查看),如果权限不足也会触发类似的错误。 - 确保服务器时间和Coinbase服务器时间的误差在30秒内(如果你的服务器时间偏差太大,即使获取了服务器时间,也可能因为网络延迟导致验证失败,可以考虑同步服务器时间)。
内容的提问来源于stack exchange,提问作者Amit-Inex Patel
相关产品推荐
相关产品推荐

