• 目前除了通用接口,所有其它接口都规定需要进行签名验证,以保证请求数据不会被恶意篡改;
  • 如果需要签名,签名应当在HTTP请求头中以Signature字段传递;
  • 签名接口都需要传递timestamp参数 ,其值应当是请求发送时刻的UNIX时间戳(毫秒)。服务器收到请求时会判断请求中的时间戳,如果是10秒之前发出的,则请求会被认为无效。

签名步骤

1

构建 Payload

将参数列表排列成一个字符串,用 & 分隔每个参数,例如: tokenName=USDT&amount=500&chainName=Ethereum&toAddress=0x9C903Cc6233ea0E9275452C13efe967a04EBe58b&timestamp=1724985575933
2

使用 HMAC SHA-256 算法对 Payload 进行签名

echo
-n "tokenName=USDT&amount=500&chainName=Ethereum&toAddress=0x9C903Cc6233ea0E9275452C13efe967a04EBe58b&timestamp=1724985575933"
| openssl dgst -sha256 -hmac "9qsua3vT6TWVFrWBqzwym2brU0fCXMOwPgF0gzGFwgJBheikFC3LX7lZ9LFTZIQ1"
3

将输出的签名编码为 16 进制格式

966174f21ae551a832a4830231e3d3dacf4ad326dc437d391ec525dd4fdaab44

签名Demo

下面是不同编程语言签名部分的Demo,供参考。
import hmac
import hashlib
import requests
import time

# 设置身份验证:
access_key = '替换成您的 access_key'
secret_key = '替换成您的 secret_key'

# 设置请求参数:
params = {
'tokenName': 'USDT',
'toAddress': '0x9C903Cc6233ea0E9275452C13efe967a04EBe58b',
'chainName': 'Ethereum',
'amount':  '500.88',
}

# 参数中添加时间戳:
timestamp = int(time.time() * 1000) # 以毫秒为单位的 UNIX 时间戳
params['timestamp'] = timestamp

# 参数中加签名:
payload = '&'.join([f'{param}={value}' for param, value in params.items()])
m = hmac.new(secret_key.encode("utf-8"), payload.encode("ASCII"), hashlib.sha256)
signature = m.hexdigest()

# 发送请求:
headers = {
'API-Access-Key': access_key,
'Signature':signature
}
response = requests.post(
'https://api.basswallet.com/api/v1/account/withdraw',
headers=headers,
data=params,
)
print(response.json())