调用 API:如何提供这些参数(密钥、随机数和签名)
Posted
技术标签:
【中文标题】调用 API:如何提供这些参数(密钥、随机数和签名)【英文标题】:Calling API: How to provide these parameters (key, nonce and signature) 【发布时间】:2013-10-29 04:07:15 【问题描述】:我正在尝试实现一个 API。通常这很简单,但这给我带来了问题。 但是,我很确定问题出在我身上,而不是 API。
此特定 API 的网址:
https://www.bitstamp.net/api/
我想对“帐户余额”进行 POST 调用。目前我得到以下答案:
"error": "Missing key, signature and nonce parameters"
我尝试使用以下代码:
var path = "https://www.bitstamp.net/api/user_transactions";
var nonce = GetNonce();
var signature = GetSignature(nonce);
using (WebClient client = new WebClient())
byte[] response = client.UploadValues(path, new NameValueCollection()
"key", Constants.ThirdParty.BitStamp.ApiKey ,
"signature", signature ,
"nonce", nonce,
);
var str = System.Text.Encoding.Default.GetString(response);
return 0.0m;
这是我的两个辅助函数:
private string GetSignature(int nonce)
string msg = string.Format("012", nonce,
Constants.ThirdParty.BitStamp.ClientId,
Constants.ThirdParty.BitStamp.ApiKey);
return HelperFunctions.sign(Constants.ThirdParty.BitStamp.ApiSecret, msg);
public static int GetNonce()
return (int) (DateTime.Now - new DateTime(1970, 1, 1)).TotalSeconds;
我的加密签名函数是这个:
public static String sign(String key, String stringToSign)
System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
byte[] keyByte = encoding.GetBytes(key);
HMACSHA256 hmacsha256 = new HMACSHA256(keyByte);
return Convert.ToBase64String(hmacsha256.ComputeHash(encoding.GetBytes(stringToSign)));
知道为什么我会收到“丢失钥匙”错误吗?有什么明显的我做错了吗(可能是:))?
编辑:
Fiddler 告诉我我发布了以下数据:
key=mykeymykey&signature=PwhdkSek6GP%2br%2bdd%2bS5aU1MryXgrfOD4fLH05D7%2fRLQ%3d&nonce=1382299103%2c21055
编辑#2:
更新了生成签名的代码:
private string GetSignature(int nonce)
string msg = string.Format("012", nonce,
Constants.ThirdParty.BitStamp.ClientId,
Constants.ThirdParty.BitStamp.ApiKey);
return HelperFunctions.ByteArrayToString(HelperFunctions.SignHMACSHA256(
Constants.ThirdParty.BitStamp.ApiSecret, msg)).ToUpper();
public static byte[] SignHMACSHA256(String key, byte[] data)
HMACSHA256 hashMaker = new HMACSHA256(Encoding.ASCII.GetBytes(key));
return hashMaker.ComputeHash(data);
public static byte[] StrinToByteArray(string str)
byte[] bytes = new byte[str.Length * sizeof(char)];
System.Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length);
return bytes;
public static string ByteArrayToString(byte[] ba)
return BitConverter.ToString(ba).Replace("-", "");
【问题讨论】:
我已经添加了 fiddler 的响应(并稍作编辑) 哈哈总是一个好点。我有以下 POST 标头: POST /api/user_transactions HTTP/1.1 。非常感谢您的尝试:) Lars,我收到“无效签名”错误,如果你修复了它,你能否分享一些代码。 【参考方案1】:我认为问题在于您使用的是base64(Convert.ToBase64String
),但是在API docs的相关部分中,它是这样写的:
签名是 HMAC-SHA256 编码的消息,包含:nonce、客户端 ID 和 API 密钥。这 HMAC-SHA256 代码必须使用您的 API 密钥生成的密钥生成。 此代码必须转换为十六进制表示(64 个大写字符)。
因此您必须将字节数组转换为十六进制字符串。请参阅此question 以获取有关如何执行此操作的一些示例。
【讨论】:
非常感谢您的建议。根本没有修复错误:-) 我做了一个测试,发现问题出在你使用的网址上。如果您向https://www.bitstamp.net/api/user_transactions
发送POST,您将被重定向到https://www.bitstamp.net/api/user_transactions/
(注意最后的斜线)。 WebClient
自动跟随重定向,但不重新上传值。您应该尝试 POST 到带有结尾斜杠的 URL。
帮助太大了!我终于得到了一个新的错误,我可以实际使用它!谢谢,谢谢,谢谢:)以上是关于调用 API:如何提供这些参数(密钥、随机数和签名)的主要内容,如果未能解决你的问题,请参考以下文章