【发布时间】:2018-01-05 01:24:51
【问题描述】:
我正在尝试使用 Coinbase 的 API 销售加密货币,但我不断收到 401 错误。下面的代码适用于我迄今为止尝试过的所有 GET 方法,但我无法弄清楚我的 POST 哪里出错了。
private static string GetWebResponse(string url, string command, string path, string body)
{
var timeStamp = EpochSeconds;
var request = (HttpWebRequest)WebRequest.Create(url);
request.Method = command;
request.ContentType = "application/json";
request.Headers.Add("CB-VERSION", VersionDate);
request.Headers.Add("CB-ACCESS-KEY", ApiKey);
request.Headers.Add("CB-ACCESS-SIGN", GetAccessSign(timeStamp, command, path, body));
request.Headers.Add("CB-ACCESS-TIMESTAMP", timeStamp);
if (command == "POST")
{
using (var streamWriter = new StreamWriter(request.GetRequestStream()))
{
streamWriter.Write(body);
streamWriter.Flush();
streamWriter.Close();
}
}
var response = (HttpWebResponse)request.GetResponse();
using (var reader = new StreamReader(response.GetResponseStream(), Encoding.ASCII))
{
return reader.ReadToEnd();
}
}
private static string GetAccessSign(string timestamp, string command, string path, string body)
{
var hmacKey = Encoding.UTF8.GetBytes(ApiSecret);
string data = timestamp + command + path + body;
using (var signatureStream = new MemoryStream(Encoding.UTF8.GetBytes(data)))
{
return new HMACSHA256(hmacKey).ComputeHash(signatureStream).Aggregate(new StringBuilder(), (sb, b) => sb.AppendFormat("{0:x2}", b), sb => sb.ToString());
}
}
我认为 POST 请求的正文有问题,但在我看来是正确的。
编辑:
为了澄清,我将展示身体是如何形成的......
var body = JsonConvert.SerializeObject(
new
{
commit = "false",
amount = Math.Round(sellAmount, 8).ToString(),
currency = "BTC",
payment_method = fiatWalletId
});
编辑 2:
我尝试了所有与以前相同的东西,但使用了 RestSharp,它返回了一个更具体的错误:
{\"errors\":[{\"id\":\"authentication_error\",\"message\":\"invalid signature\"}]}
编辑 3:
此 API 密钥已针对所有权限/范围设置,包括我对此请求所需的权限:
wallet:accounts:create
wallet:accounts:delete
wallet:accounts:read
wallet:accounts:update
wallet:addresses:create
wallet:addresses:read
wallet:buys:create
wallet:buys:read
wallet:checkouts:create
wallet:checkouts:read
wallet:contacts:read
wallet:deposits:create
wallet:deposits:read
wallet:notifications:read
wallet:orders:create
wallet:orders:read
wallet:orders:refund
wallet:payment-methods:delete
wallet:payment-methods:limits
wallet:payment-methods:read
wallet:sells:create
wallet:sells:read
wallet:transactions:read
wallet:transactions:request
wallet:transactions:send
wallet:transactions:transfer
wallet:user:email
wallet:user:read
wallet:user:update
wallet:withdrawals:create
wallet:withdrawals:read
【问题讨论】:
-
401 是未经授权的,所以我假设您已经检查过您的 api 密钥是否正确等?
-
尝试最简单的请求,也许是一个获取时间的 GET 请求,看看是否可行。 developers.coinbase.com/api/v2#time
-
我可以在 Coinbase 上的钱包上进行 GET,所以我知道请求格式正确,并且它通过了 GET 请求的授权(没有正文),所以我希望它与json 正文。
-
你的结论不正确。 401 是
unauthorized。你在调用什么 API?请指明具体的 URL。 Coinbase 有一个权限系统,因此您使用的帐户完全有可能没有为 POST 调用设置适当的权限。 -
请参阅my answer on a related question 了解我的意思。您需要为您的帐户添加适当的范围,以便您可以调用 POST 方法。我没有使用过 Coinbase 或其 API,我只是觉得这是我以前见过的东西。不是 100% 肯定这解释了您的问题。
标签: c# api coinbase-api