You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python脚本调用KuCoin API创建订单返回kc invalid sign问题排查

KuCoin API创建订单返回“kc invalid sign”错误排查

你的代码核心问题出在POST请求参数传递方式和签名/密码短语的格式处理上,以下是具体问题和修复方案:

问题点分析

  • POST参数位置错误:你当前把订单参数通过params=params放到了URL查询参数中,但KuCoin创建订单的POST接口要求参数放在JSON格式的请求体里。这会导致签名时使用的json_params和实际发送的参数内容不匹配,直接触发签名验证失败。
  • 签名/密码短语未转字符串:base64.b64encode()返回的是bytes对象,直接放入请求头会导致格式错误,服务器无法正确解析。
  • JSON序列化可能存在差异:默认json.dumps()可能生成带空格的JSON字符串,和请求体自动序列化的结果不一致,也会导致签名不匹配。

修复后的完整代码

import base64
import hashlib
import hmac
import json
import time

import requests

api_key = '.....'
api_secret = '.....'
api_passphrase = '....'

url = 'https://api.kucoin.com/api/v1/orders'
# url = 'https://api.kucoin.com/api/v1/accounts?type=trade'

now = int(time.time() * 1000)
params = {
    "clientOid": "AAAjhjhjhjk",
    "side": "BUY",
    "symbol": "BTC-USDT",
    "type": "limit",
    "size": "0.001",
    "price": "41220.9",
    "postOnly": "true"
}

# 生成无空格的紧凑JSON字符串,确保和请求体序列化结果完全一致
json_params = json.dumps(params, separators=(',', ':'))

str_to_sign = str(now) + 'POST' + '/api/v1/orders' + json_params
print(str_to_sign)
# str_to_sign = str(now + 100) + 'GET' + '/api/v1/accounts?type=trade'

# 将签名转成UTF-8字符串
signature = base64.b64encode(
    hmac.new(api_secret.encode('utf-8'), str_to_sign.encode('utf-8'), hashlib.sha256).digest()
).decode('utf-8')

# 将密码短语转成UTF-8字符串
passphrase = base64.b64encode(
    hmac.new(api_secret.encode('utf-8'), api_passphrase.encode('utf-8'), hashlib.sha256).digest()
).decode('utf-8')

headers = {
    "KC-API-SIGN": signature,
    "KC-API-TIMESTAMP": str(now),
    "KC-API-KEY": api_key,
    "KC-API-PASSPHRASE": passphrase,
    "KC-API-KEY-VERSION": "2",
    "Content-Type": "application/json"  # 明确指定请求体格式
}

# 使用json参数传递请求体,而非params
response = requests.post(url, headers=headers, json=params)
print(response.status_code)
print(response.json())

关键修复说明

  1. 参数传递方式修正:用json=params替代params=params,让requests自动将参数序列化为JSON请求体,和签名时使用的json_params保持一致。
  2. 格式转换:给signature和passphrase添加.decode('utf-8'),将bytes对象转为字符串,符合HTTP请求头的格式要求。
  3. JSON序列化一致性:添加separators=(',', ':')确保生成的JSON字符串无多余空格,避免因序列化格式差异导致签名验证失败。

内容的提问来源于stack exchange,提问作者OplizeO

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 08:24:52