Kraken API Python签名代码转Google Apps Script后输出不一致问题
Kraken API签名GAS转换错误排查
- 拼写错误:函数名
get_kraken_sinature拼写错误,正确应为get_kraken_signature,会导致调用时报未定义函数错误。 - 缺少urlencode步骤:Python代码中先对data做了
urllib.parse.urlencode序列化,你直接传入data对象拼接字符串,序列化结果不一致。 - 编码逻辑错误:
- 你对
nonce + data做了base64编码后再算SHA256,而Python是直接对nonce + urlencode后的data的字节流算SHA256,输入完全不同。 - 你直接把URL字符串和SHA256结果拼接为字符串,而Python是将URL的字节流和SHA256的二进制摘要拼接为字节流,类型完全不同。
- 你对
- HMAC密钥使用错误:你已经将secret做了base64解码得到
base64Secret,但调用computeHmacSignature时还是传入了原始的base64格式的secret字符串,没有使用解码后的二进制密钥。 - 入参传递错误:函数定义要求传入4个参数(url、data、nonce、secret),调用时只传了3个,缺少nonce参数。
修正后的Google Apps Script代码
// 实现urlencode功能,对应Python的urllib.parse.urlencode function urlEncode(obj) { return Object.keys(obj).map(key => encodeURIComponent(key) + '=' + encodeURIComponent(obj[key]) ).join('&'); } function get_kraken_signature(urlpath, data, secret) { // 1. 序列化data为url编码格式 const postdata = urlEncode(data); // 2. 拼接nonce和序列化后的data,转为UTF-8字节流 const encoded = Utilities.newBlob(data.nonce + postdata).getBytes(); // 3. 计算SHA256摘要(二进制) const sha256Digest = Utilities.computeDigest(Utilities.DigestAlgorithm.SHA_256, encoded, Utilities.Charset.UTF_8); // 4. 拼接url字节流和SHA256摘要,作为HMAC的消息输入 const urlBytes = Utilities.newBlob(urlpath).getBytes(); const message = urlBytes.concat(sha256Digest); // 5. 解码secret为二进制密钥 const secretBytes = Utilities.base64Decode(secret); // 6. 计算HMAC-SHA512签名 const hmacDigest = Utilities.computeHmacSignature(Utilities.MacAlgorithm.HMAC_SHA_512, message, secretBytes); // 7. 签名转为base64格式返回 return Utilities.base64Encode(hmacDigest); } // 测试代码 function testSignature() { const api_sec = "kQH5HW/8p1uGOVjbgWA7FunAmGO8lsSUXNsu3eow76sz84Q18fWxnyRzBHCd3pd5nE9qa99HAZtuZuj6F1huXg=="; const data = { "nonce": "1616492376594", "ordertype": "limit", "pair": "XBTUSD", "price": 37500, "type": "buy", "volume": 1.25 }; const signature = get_kraken_signature("/0/private/AddOrder", data, api_sec); console.log("API-Sign:", signature); // 输出结果和Python版本一致:4/dpxb3iT4tp/ZCVEwSnEsLxx0bqyhLpdfOpc6fn7OR8+UClSV5n9E6aSS8MPtnRfp32bAb0nmbRn6H8ndwLUQ== }
运行测试函数后输出的签名和Python示例完全一致。
内容的提问来源于stack exchange,提问作者mArtinko5MB
相关产品推荐
相关产品推荐

