Bithumb API对接第三方应用:开发指南与安全认证

Bithumb API对接第三方应用指南

本文档旨在为开发者提供一份详尽的指南,帮助他们将韩国领先的加密货币交易所Bithumb的应用程序编程接口(API)高效、无缝地集成到各类第三方应用程序及服务中。Bithumb API提供了一系列功能强大的接口,允许开发者获取高精度的实时市场数据,包括但不限于订单簿深度、最新成交价格、交易量等;还允许开发者执行交易操作,例如提交限价单、市价单等,实现自动化交易策略;同时,开发者还可以通过API安全地管理用户账户,进行资产查询、充值提现等操作,从而构建功能丰富的加密货币交易平台、智能交易机器人、市场数据分析工具以及投资组合管理系统。

准备工作

在开始对接Bithumb API之前,必须完成以下准备工作,以确保后续开发过程的顺利进行和账户安全:

  • Bithumb账户及身份验证: 您需要注册并拥有一个有效的Bithumb账户。完成必要的实名认证(KYC)流程是至关重要的,这不仅符合监管要求,也是使用Bithumb API进行交易的前提。身份验证通常需要提供身份证明、地址证明等信息。请确保您提供的信息真实有效,并仔细阅读Bithumb的相关条款和协议。
  • API密钥申请与安全管理: 访问Bithumb官网的API管理页面,申请用于程序化交易的API密钥(API Key)和私钥(Secret Key)。API Key用于标识您的应用程序,Secret Key则用于签名请求,验证身份。**务必极其谨慎地保管您的私钥!** 千万不要将其存储在公共代码库、客户端应用程序或任何可能被他人访问到的地方。最佳实践包括使用环境变量、加密存储或密钥管理系统来保护您的私钥。一旦私钥泄露,请立即撤销并重新生成新的密钥对。
  • 开发环境搭建与配置: 根据您选择的编程语言(例如Python、Node.js、Java等)搭建相应的开发环境。安装必要的编程语言解释器、开发工具和依赖库。例如,如果您使用Python,您可能需要安装`requests`库用于发送HTTP请求,或者安装专门的Bithumb API客户端库。确保您的开发环境配置正确,能够顺利运行您的代码。
  • 网络连通性测试: 确保您的服务器或应用程序能够稳定地访问Bithumb的API服务器。由于网络环境的复杂性,可能存在防火墙、代理服务器或DNS解析等问题。您可以使用`ping`命令或`curl`等工具测试与Bithumb API服务器的网络连通性。如果遇到网络问题,请检查您的网络配置或联系您的网络管理员。同时,注意Bithumb API可能有地域限制,请确认您的服务器所在地是否允许访问。

API 认证

所有对Bithumb API的请求都需要进行认证,以确保安全性和授权。认证过程主要依赖于在HTTP请求头部添加特定的认证信息。为了成功地与Bithumb API交互,您必须在每个请求的头部中包含以下关键字段:

  • Api-Key : 您的API密钥,这是一个由Bithumb分配的唯一标识符,用于识别您的账户。请妥善保管您的API密钥,避免泄露,因为它类似于您的用户名。
  • Api-Sign : 通过API密钥、私钥和请求参数生成的数字签名。这个签名用于验证请求的完整性和真实性,防止篡改。签名生成算法通常涉及对请求参数进行哈希运算,并使用您的私钥进行加密。具体的签名算法细节,请务必参考Bithumb官方API文档。
  • Api-Timestamp : 当前时间戳,精确到毫秒级。时间戳用于防止重放攻击,即攻击者截获并重新发送之前的请求。服务器会验证时间戳的有效性,如果时间戳与服务器时间相差过大,请求将被拒绝。请确保您的系统时钟与网络时间同步。

生成API签名

API签名对于保护您的API请求至关重要,能够有效防止恶意篡改和未经授权的访问。正确的签名机制可以确保只有拥有有效私钥的用户才能成功发起API调用。下面详细介绍API签名的生成过程:

  1. 参数排序: 需要对所有请求参数(包括查询参数和请求体中的参数)按照其参数名称的字母顺序进行升序排列。请务必保持参数名称的大小写一致性,并且确保排序的准确性,因为任何细微的偏差都会导致签名验证失败。这一步是保证签名可重复性和一致性的基础。
  2. 字符串拼接: 将排序后的参数按照 "参数名=参数值" 的格式拼接成一个字符串。如果参数值本身是一个数组或对象,通常需要将其序列化为JSON字符串或其他标准格式。多个参数之间使用 "&" 符号进行连接。需要特别注意的是,参数值如果包含特殊字符,如空格、等号、& 符号等,必须进行URL编码,以避免解析错误。
  3. HMAC-SHA512加密: 使用您的私钥对拼接后的字符串进行HMAC-SHA512加密。HMAC (Hash-based Message Authentication Code) 是一种消息认证码算法,结合了哈希函数和密钥,能够提供完整性和身份验证。SHA512 是一种安全的哈希算法,能够生成512位的哈希值。将私钥与拼接后的字符串一起作为输入,生成一个唯一的哈希值,该哈希值与私钥相关联,可以有效防止伪造。
  4. Base64编码: 将HMAC-SHA512加密后的二进制结果进行Base64编码。Base64 是一种将二进制数据转换为ASCII字符的编码方式,主要用于在HTTP协议中传输二进制数据。将加密后的二进制数据进行Base64编码,可以使其更容易在网络上传输,并方便客户端进行处理。最终得到的Base64编码字符串就是您的API签名。

示例 (Python):

本示例展示如何使用Python生成用于加密货币API请求的签名。在与加密货币交易所或其他需要身份验证的API进行交互时,生成正确的签名至关重要。以下代码片段演示了如何使用`hashlib`、`hmac`、`base64`和`time`模块创建签名。

import hashlib import hmac import base64 import time

def generate_signature(endpoint, params, secret_key): """ 生成API签名。

此函数接受三个参数:

  • endpoint (str): API端点,例如"/api/v1/order"。
  • params (dict): 包含请求参数的字典。 这些参数包括时间戳、订单详情等。
  • secret_key (str): 您的私钥,务必妥善保管。这是用于加密签名以验证请求的关键。

函数返回一个字符串,它是根据提供的参数和密钥生成的API签名。

Args:
    endpoint (str): API endpoint.
    params (dict): 请求参数。
    secret_key (str): 您的私钥。

Returns:
    str: API签名。
"""
encoded_params = '&'.join([f"{k}={v}" for k, v in sorted(params.items())])
message = endpoint + chr(0) + encoded_params
secret_key_bytes = secret_key.encode('utf-8')
message_bytes = message.encode('utf-8')
hashed = hmac.new(secret_key_bytes, message_bytes, hashlib.sha512)
signature = base64.b64encode(hashed.digest()).decode()
return signature

代码详解:

  1. encoded_params = '&'.join([f"{k}={v}" for k, v in sorted(params.items())]) : 将参数字典转换为URL编码的字符串。 重要的是对参数进行排序,以确保签名的可预测性。 `sorted(params.items())` 按字母顺序对参数进行排序。
  2. message = endpoint + chr(0) + encoded_params : 然后,使用null字符 ( chr(0) ) 将API端点与编码的参数连接起来。 这是构造签名消息的特定于协议的方式。
  3. secret_key_bytes = secret_key.encode('utf-8') message_bytes = message.encode('utf-8') : 将密钥和消息都编码为UTF-8字节。 HMAC需要字节输入。
  4. hashed = hmac.new(secret_key_bytes, message_bytes, hashlib.sha512) : 使用HMAC-SHA512算法创建哈希。 这涉及使用您的私钥对消息进行加密哈希。
  5. signature = base64.b64encode(hashed.digest()).decode() : 将哈希摘要进行Base64编码,并将其解码为字符串。 这是API通常期望的签名格式。

示例用法

在使用API进行身份验证时,需要准备以下要素:你的API密钥( api_key )、私钥( secret_key )、请求的API端点( endpoint )以及请求参数( params )。请务必安全保管你的API密钥和私钥,切勿泄露给他人。

api_key = "YOUR_API_KEY"
secret_key = "YOUR_SECRET_KEY"
endpoint = "/info/account"
params = { "currency": "BTC" }

签名( signature )是通过将API端点、请求参数和私钥进行加密哈希运算生成的。这个签名用于验证请求的完整性和身份。时间戳( timestamp )代表请求发送的时间,以毫秒为单位。使用当前时间乘以1000并转换为字符串格式,能有效防止重放攻击。

signature = generate_signature(endpoint, params, secret_key)
timestamp = str(int(time.time() * 1000))

HTTP头部信息( headers )包含API密钥、签名和时间戳。这些头部信息将与API请求一起发送到服务器。 Api-Key 头部携带你的API密钥。 Api-Sign 头部携带生成的签名。 Api-Timestamp 头部携带时间戳。正确的头部信息对于API的成功调用至关重要。

headers = { "Api-Key": api_key,
"Api-Sign": signature,
"Api-Timestamp": timestamp }

print(headers)

请将 YOUR_API_KEY YOUR_SECRET_KEY 替换成你在交易所或服务商处获得的实际API密钥和私钥。 切记,API 密钥和私钥是访问你账户的重要凭证,泄漏它们可能导致资金损失或其他安全风险。在生产环境中,应使用安全的方式存储和管理这些敏感信息,例如使用环境变量、密钥管理服务等。定期更换 API 密钥也是一种良好的安全实践。

常用API接口

以下是一些常用的Bithumb API接口,包含详细说明、参数解释及常见用例,旨在帮助开发者更高效地接入和使用Bithumb的数字资产交易服务。

市场数据 (Public API):

  • /public/ticker/{currency} : 获取指定币种的实时行情数据。此接口提供币种的最新成交价、最高价、最低价、买一价、卖一价、24小时成交量、24小时成交额等关键信息,帮助用户快速了解市场动态。返回的数据通常包括时间戳,以便追踪价格变化。交易所可能会提供多种计价货币对,例如 `BTC/USDT` 或 `ETH/BTC`,因此 `{currency}` 应明确指定计价货币对,而非单一币种代码。
  • /public/orderbook/{currency} : 获取指定币种的深度信息(买单和卖单)。此接口返回指定币种的买单和卖单挂单列表,按照价格排序,并显示每个价格对应的挂单数量。深度信息对于分析市场供需关系至关重要,用户可以了解当前市场的买卖力量分布情况,判断价格走势。通常,API会限制返回的深度层数,例如只返回前20层或50层的挂单数据,以减少数据传输量。 {currency} 同样指明计价货币对。
  • /public/trades/{currency} : 获取指定币种的最新成交记录。此接口返回指定币种的最近成交历史记录,包括成交价格、成交数量、成交时间以及买卖方向(买入或卖出)。通过分析成交记录,用户可以了解市场的活跃程度和价格波动情况。成交记录通常按照时间倒序排列,交易所可能会限制返回的成交记录数量,例如只返回最近100条或500条成交记录。 {currency} 指明交易货币对。

账户信息 (Private API):

  • /info/account : 查询账户的全面信息。 此接口提供用户的账户概览,包括总资产估值、不同币种的详细余额快照、交易手续费等级、以及其他账户相关的配置信息。 通过此接口,用户可以了解其资金分布、交易权限以及享受的优惠费率。
  • /info/balance : 查询特定加密货币的余额详情。 该接口允许用户针对特定币种,查询可用于交易的可用余额以及被冻结的余额。 冻结余额通常是由于挂单、提现申请或其他锁定机制造成的。 通过该接口,用户可以精确掌握特定资产的流动性状况。
  • /info/wallet_address : 获取特定币种的唯一充值地址。 该接口提供指定加密货币的充值地址,用户可以将数字资产转入该地址以充值到交易所账户。 生成的地址通常与用户在交易所的唯一标识符相关联,确保资金能够正确记入账户。 用户需要确保充值的币种与地址类型一致,否则可能导致资产丢失。

交易 (Private API):

  • /trade/place : 下单接口,允许用户提交买入或卖出数字资产的交易请求。该接口通常需要提供交易对(例如 BTC/USDT)、交易方向(买入或卖出)、订单类型(市价单或限价单)、数量和价格(如果是限价单)等参数。交易所会验证这些参数的有效性,并在撮合引擎中创建相应的订单。
  • /info/orders : 查询订单状态接口,允许用户检索其历史和当前未完成的订单信息。通过该接口,用户可以获取订单的详细信息,如订单ID、交易对、订单类型、订单状态(例如:已挂单、部分成交、完全成交、已撤销)、下单时间、成交数量、成交均价等。通常支持根据订单ID、交易对、订单状态等条件进行过滤查询。
  • /trade/cancel : 撤销订单接口,允许用户取消尚未完全成交的订单。该接口通常需要提供要撤销的订单ID。交易所会验证用户是否有权限撤销该订单,并在撮合引擎中移除该订单。成功撤销后,订单中未成交的资产将被返还到用户的账户。

下单示例 (Python):

此示例展示如何使用 Python 向加密货币交易所 Bithumb 发送下单请求。它使用了 requests 库发送 HTTP POST 请求, time 库获取时间戳, hashlib hmac 库用于生成签名, base64 库用于编码签名。

import requests
import time
import hashlib
import hmac
import base64

定义 API 密钥、Secret 密钥、API 接口地址和下单参数。 请务必替换 YOUR_API_KEY YOUR_SECRET_KEY 为您实际的 API 密钥和 Secret 密钥。 endpoint 定义了API的路径, url 定义了请求的具体URL。

api_key = "YOUR_API_KEY"
secret_key = "YOUR_SECRET_KEY"
endpoint = "/trade/place"
url = "https://api.bithumb.com/trade/place" # 正式环境API地址
params = {
"order_currency": "BTC", # 交易币种
"payment_currency": "KRW", # 结算币种
"units": "0.001", # 交易数量
"price": "50000000", # 交易价格
"type": "bid" # bid: 买入, ask: 卖出
}

generate_signature 函数用于生成 API 请求的签名。它首先将请求参数进行 URL 编码,然后将 API 接口地址和编码后的参数拼接成消息。 使用 Secret 密钥对消息进行哈希运算,最后将哈希值进行 Base64 编码。确保参数按照键的字母顺序排序,这是生成有效签名的关键。 chr(0) 在此处用作分隔符。

def generate_signature(endpoint, params, secret_key):
encoded_params = '&'.join([f"{k}={v}" for k, v in sorted(params.items())])
message = endpoint + chr(0) + encoded_params
secret_key_bytes = secret_key.encode('utf-8')
message_bytes = message.encode('utf-8')
hashed = hmac.new(secret_key_bytes, message_bytes, hashlib.sha512)
signature = base64.b64encode(hashed.digest()).decode()
return signature

生成签名和时间戳,时间戳需要精确到毫秒级别。

signature = generate_signature(endpoint, params, secret_key)
timestamp = str(int(time.time() * 1000))

构造 HTTP 请求头,包含 API 密钥、签名和时间戳。 这些头部信息用于验证请求的身份和完整性。

headers = {
"Api-Key": api_key,
"Api-Sign": signature,
"Api-Timestamp": timestamp
}

使用 requests.post 函数发送 POST 请求到 API 接口。 将请求头和参数传递给该函数。建议设置超时时间,以防止请求卡住。

response = requests.post(url, headers=headers, data=params)

打印 API 响应。 检查响应状态码和内容,以确认下单是否成功。 正确处理响应中的错误信息至关重要。

print(response.())

注意,以上代码仅为示例,您需要根据实际情况修改参数,例如交易币种、交易数量和交易价格。 并且,在生产环境中,请务必妥善保管您的 API 密钥和 Secret 密钥,避免泄露。

错误处理

Bithumb API 通信过程中可能会返回多种错误代码,这些代码指示了请求处理过程中出现的问题。开发者必须深入了解这些错误代码,并据此设计健壮的错误处理机制,确保应用程序的稳定性和可靠性。以下列出了一些常见的错误代码及其详细解释:

  • 5100 : API 密钥无效。此错误表明您提供的 API 密钥可能不正确、已过期或已被禁用。请仔细检查 API 密钥是否正确,并确保您的账户已激活且拥有足够的权限。如果问题仍然存在,请联系 Bithumb 客服支持以获取帮助。
  • 5300 : 请求参数错误。此错误表示您发送的 API 请求中的某些参数格式不正确、缺失或无效。请仔细检查 API 文档,确认您提供的参数类型、范围和格式是否符合要求。常见的参数错误包括缺少必填参数、参数类型不匹配、参数值超出范围等。
  • 5600 : 签名验证失败。Bithumb API 使用签名机制来确保请求的完整性和安全性。此错误表明您提供的签名与服务器计算的签名不匹配。这通常是由于签名算法实现错误、API 密钥泄露或请求参数被篡改所致。请务必使用正确的签名算法和 API 密钥,并确保请求参数在签名之前未被修改。
  • 5900 : 账户余额不足。此错误表示您的 Bithumb 账户余额不足以执行请求的操作,例如下单、提币等。请检查您的账户余额,并确保有足够的资金用于执行所需的操作。如果您使用了杠杆交易,请注意维持足够的保证金,以避免爆仓风险。

为了构建稳定可靠的应用程序,强烈建议开发者在应用程序中实现完善的错误处理机制。这包括但不限于:使用 try-catch 块捕获异常、记录错误日志、向用户显示友好的错误信息、重试失败的请求等。一个良好的错误处理机制可以帮助您及时发现并解决问题,提高应用程序的可用性和用户体验。建议开发者定期审查错误日志,分析常见错误的原因,并采取相应的措施来优化代码和配置。

安全注意事项

  • 保护API密钥: 务必妥善保管您的API密钥和私钥,切勿泄露给他人。
  • 限制API权限: 根据应用程序的实际需求,只申请必要的API权限。
  • 使用HTTPS: 始终使用HTTPS协议进行API请求,以防止数据被窃取。
  • 频率限制: 注意Bithumb API的频率限制,避免过度请求导致API被封禁。
  • 输入验证: 对所有用户输入进行验证,防止SQL注入等安全漏洞。
  • 日志记录: 记录API请求和响应,以便进行调试和审计。

常见问题

  • 签名错误:

    签名错误通常是由于API密钥、私钥或请求参数不正确导致的。请仔细检查您提供的API密钥和私钥是否与Bithumb账户中生成的密钥完全一致,包括大小写。同时,务必检查请求参数,确保它们符合Bithumb API文档的要求,例如参数的顺序、数据类型和格式。请验证签名算法的实现是否正确,包括哈希算法的选择(如SHA-256)和密钥的编码方式(如Base64)。可以使用在线签名验证工具或Bithumb提供的SDK进行验证。

    常见的签名错误还包括:

    • 时间戳错误:确保时间戳与Bithumb服务器的时间同步,允许的误差范围通常很小。
    • 编码问题:参数值可能需要进行URL编码或其他特定编码。
    • 参数顺序错误:某些API要求参数按照特定顺序排列。
  • API请求失败:

    API请求失败可能由多种原因引起。请检查您的网络连接是否稳定,并确保您的服务器或应用程序能够正常访问Bithumb的API服务器。如果网络连接正常,请检查您的防火墙或代理设置是否阻止了对Bithumb API服务器的访问。您可以使用ping命令或traceroute命令来诊断网络连接问题。

    请确保您使用的API端点是正确的,并且与您要执行的操作相匹配。例如,交易API和行情API的端点是不同的。查看Bithumb的API文档,确认正确的端点地址。

    服务器端错误(如500 Internal Server Error)也可能导致API请求失败。在这种情况下,您可以稍后重试,或者联系Bithumb的技术支持。

  • API频率限制:

    Bithumb为了保护其API服务器的稳定性和可用性,实施了API频率限制(Rate Limiting)。这意味着您在一定时间内可以发送的API请求数量是有限制的。超过频率限制会导致API请求被拒绝,并可能返回错误代码。请仔细阅读Bithumb API的文档,了解不同API端点的频率限制规则,例如每分钟允许的请求数量。

    为了避免触发频率限制,建议您采取以下措施:

    • 合理控制API请求的频率:根据实际需求,调整API请求的间隔时间,避免不必要的频繁请求。
    • 使用批量请求:如果可能,将多个请求合并为一个批量请求,以减少请求的总数量。
    • 实现重试机制:当API请求被频率限制拒绝时,可以实现自动重试机制,在等待一段时间后再次发送请求。
    • 使用Websocket:对于需要实时数据的场景,可以考虑使用Websocket API,它可以在单个连接上推送数据,减少了频繁的HTTP请求。

持续学习

Bithumb API作为韩国领先的数字货币交易所Bithumb提供的应用程序编程接口,是连接开发者应用程序与Bithumb交易平台的关键桥梁。为了确保开发者能够充分利用Bithumb API进行高效、安全、稳定的交易和数据分析,Bithumb官方会定期或不定期地对API进行更新和改进。这些更新可能涉及以下几个方面:

  • 新增API接口: 为了满足不断变化的市场需求和开发者日益增长的功能需求,Bithumb可能会增加新的API接口,以提供更多的交易类型、更丰富的数据信息或更高级的功能服务。
  • 现有API接口优化: 为了提高API的性能、稳定性和安全性,Bithumb可能会对现有的API接口进行优化,例如改进数据传输效率、增强安全性验证机制、修复潜在的漏洞等。
  • API文档更新: 随着API接口的更新和改进,Bithumb官方也会及时更新API文档,详细描述新的API接口的使用方法、参数说明、返回值格式等,以及对现有API接口的变更进行说明。
  • 安全策略升级: 为了应对日益复杂的网络安全威胁,Bithumb会不断升级安全策略,例如加强身份验证、防止DDoS攻击、保护用户数据安全等,这些安全策略的调整也可能会影响API的使用方式。
  • 功能调整: 为了提升用户体验和满足合规要求,Bithumb可能会对API的功能进行调整,例如调整交易规则、修改手续费计算方式等。

因此,对于使用Bithumb API进行开发的开发者来说,持续关注Bithumb官方的API文档至关重要。开发者可以通过以下方式及时获取API的最新信息:

  • 定期访问Bithumb官方网站的API文档页面: 这是获取API最新信息的最直接途径,开发者可以定期访问该页面,查看是否有新的API接口、API文档更新或安全策略调整等。
  • 订阅Bithumb官方的开发者邮件列表或社区: Bithumb官方可能会通过邮件列表或开发者社区发布API的更新公告,开发者可以通过订阅这些渠道及时获取API的最新信息。
  • 关注Bithumb官方的社交媒体账号: Bithumb官方可能会通过社交媒体账号发布API的更新公告,开发者可以通过关注这些账号及时获取API的最新信息。

通过持续学习和关注Bithumb官方的API文档,开发者可以及时了解最新的API接口和功能,并根据API的更新情况及时调整自己的应用程序,以确保其能够与Bithumb交易平台保持兼容,并充分利用API提供的各种功能和服务,从而为用户提供更好的交易体验。