BigONE API 使用教程
简介
BigONE 是一家全球领先的数字资产交易平台,致力于为全球用户提供安全、稳定、高效的数字资产交易服务。平台汇集了多种主流加密货币以及新兴的数字资产,并提供现货交易、杠杆交易等丰富的交易模式,满足不同投资者的需求。
BigONE 平台拥有强大的技术实力和风控体系,采用多重安全防护措施,保障用户资产安全。同时,BigONE 注重用户体验,界面简洁易用,交易流程便捷流畅。为方便开发者接入 BigONE 平台,进行程序化交易、数据分析等操作,BigONE 提供了全面、专业的 API 接口。本文档旨在为开发者提供详细的 API 使用指南,帮助开发者快速上手 BigONE API,实现数字资产交易、行情数据查询、账户信息管理等功能。通过本文档,开发者可以了解 API 的基本概念、接口调用方式、参数说明、返回结果示例,以及常见问题的解决方案。我们希望通过详细的文档和专业的服务,助力开发者在 BigONE 平台上取得成功。
BigONE API 支持 RESTful 风格的接口调用,采用 HTTP 协议进行数据传输,并使用 JSON 格式进行数据交换。开发者可以使用各种编程语言(如 Python、Java、JavaScript 等)调用 BigONE API。在使用 BigONE API 之前,开发者需要注册 BigONE 账户并申请 API Key 和 Secret Key,用于身份验证和权限控制。请务必妥善保管您的 API Key 和 Secret Key,避免泄露,以免造成不必要的损失。
通过 BigONE API,开发者可以实现以下功能:
- 交易功能: 包括下单、撤单、查询订单状态等,支持市价单、限价单等多种订单类型。
- 行情数据查询: 获取实时行情、历史行情、深度图等数据,为交易决策提供数据支持。
- 账户信息管理: 查询账户余额、交易记录、充提币记录等,方便用户管理自己的数字资产。
- 资金划转: 实现不同账户之间的资金划转,例如从交易账户划转到钱包账户。
BigONE 将不断更新和完善 API 文档,并提供技术支持,帮助开发者更好地使用 BigONE API。我们欢迎开发者提出宝贵的意见和建议,共同打造更好的数字资产交易生态。
API 基础
1. API 接口端点
BigONE API 的基础 URL (统一资源定位符) 为:
https://big.one/api/
。此 URL 是所有 API 请求的根地址,所有请求都应基于此地址构建。
强烈建议开发者使用此基础 URL 构建所有 API 请求。 例如,获取市场行情的 API 请求路径可能为
https://big.one/api/v3/markets
,其中
/v3/markets
是相对于基础 URL 的路径。 使用一致的基础 URL 有助于维护代码的清晰度和可维护性,并且在 BigONE API 更新时,更容易进行调整。 请务必查阅 BigONE 官方 API 文档,了解不同 API 功能的具体请求路径和参数,确保请求的正确性和有效性。正确定位 API 端点是与交易所安全有效通信的关键第一步。
2. 认证
为了保障API接口的安全性和数据访问的权限控制,部分高级功能和敏感数据接口需要进行身份认证后才能访问。 BigONE平台采用API Key和Secret Key相结合的签名机制来实现认证。 具体来说,你需要使用你的API Key和Secret Key对每一个需要认证的请求生成唯一的数字签名,并在请求头中携带该签名,BigONE服务器会验证该签名,确认请求的合法性。
你的API Key和Secret Key是访问BigONE API的凭证,请妥善保管,切勿泄露给他人。 你可以在BigONE官方网站的用户中心的安全设置页面生成或重置你的API Key和Secret Key。 如果你怀疑你的密钥已经泄露,请立即重置它们。
每个API接口的文档会明确标示是否需要认证。 在调用需要认证的API接口时,请务必按照文档说明,正确地计算和添加签名,否则请求将会被拒绝。 BigONE的开发者文档提供了详细的签名算法说明和示例代码, 方便你快速地集成认证功能到你的应用程序中。
3. 请求方式
BigONE API 提供了多种 HTTP 请求方式,以满足不同操作的需求。支持的请求方式包括但不限于
GET
、
POST
、
PUT
和
DELETE
。选择哪种 HTTP 方法取决于具体 API 接口的定义和所执行的操作类型。
GET
请求主要用于从服务器检索数据,通常不应该修改服务器上的任何资源。在 BigONE API 中,
GET
请求常用于获取市场行情、账户信息等只读数据。
POST
请求通常用于向服务器提交数据,并创建一个新的资源。例如,用户可以使用
POST
请求来提交订单或执行其他需要创建新数据的操作。
PUT
请求用于更新服务器上的现有资源。客户端需要提供资源的完整表示,以替换服务器上的现有版本。BigONE API 可能使用
PUT
请求来更新用户的账户设置或其他可修改的数据。
DELETE
请求用于删除服务器上的指定资源。在 BigONE API 中,
DELETE
请求可能用于取消订单或删除其他不再需要的资源。
每个 BigONE API 接口的文档都会明确指定所支持的 HTTP 请求方式,以及每种方式所对应的参数和响应格式。务必仔细阅读 API 文档,以确保正确使用不同的请求方式。
4. 请求头
常见的请求头如下:
Content-Type
: 指定请求体的格式,常用的有application/
。Authorization
: 认证信息,用于身份验证。
5. 返回值
API 交互中,数据通常以结构化的 JSON(JavaScript Object Notation)格式返回。JSON 是一种轻量级的数据交换格式,易于阅读和解析,广泛应用于 Web API 的数据传输。一个典型的 API 响应包含多个关键字段,用于指示请求的状态和返回的数据内容。
-
code
: 状态码,用于指示 API 请求的整体状态。通常,200 范围内的状态码表示请求成功,而 400 或 500 范围内的状态码则表示客户端或服务器端发生了错误。具体的代码值会根据 API 的设计而有所不同,例如 200 可能表示成功,400 可能表示参数错误,500 可能表示服务器内部错误。开发者应查阅 API 文档以了解每个状态码的具体含义。 -
message
: 错误信息,当code
指示请求失败时,message
字段会包含详细的错误描述,帮助开发者定位问题。错误信息应该尽可能清晰和具有可操作性,例如 "Invalid API key" 或 "Insufficient funds"。一些 API 还会提供错误代码,以便程序可以根据不同的错误类型采取不同的处理方式。 -
data
: 返回的数据,这是 API 请求成功的核心内容。data
字段的内容类型取决于 API 的具体功能。例如,如果 API 用于获取用户信息,则data
字段可能包含用户的姓名、ID、电子邮件地址等信息。如果 API 用于查询交易记录,则data
字段可能包含交易的时间戳、金额、类型等信息。data
字段通常是一个 JSON 对象或 JSON 数组,包含了 API 响应的具体结果。 -
pagination
: 分页信息,当 API 返回的数据量非常大时,为了提高性能和用户体验,通常会对数据进行分页处理。pagination
字段包含了分页相关的元数据,例如当前页码、每页大小、总页数、总记录数等信息。客户端可以使用这些信息来导航到不同的页面,获取完整的数据集。常见的 pagination 字段包括current_page
,page_size
,total_pages
, 和total_records
。
常用 API 接口
1. 行情查询
在加密货币交易中,掌握准确及时的行情信息至关重要。行情查询功能允许用户获取关于各种交易对的实时数据,从而做出明智的交易决策。
- 获取所有交易对的行情信息:
- 最新成交价: 最近一次交易完成的价格。
- 24小时最高价/最低价: 过去24小时内的最高和最低交易价格,帮助评估价格波动范围。
- 24小时交易量: 过去24小时内交易的总数量,反映市场活跃程度。 高交易量通常意味着更高的流动性。
- 买一价/卖一价: 当前市场上最高的买入价(Bid)和最低的卖出价(Ask),显示市场供需情况。
- 资金费率(Funding Rate): 永续合约交易中的资金费率,表明多头或空头持仓的成本。
- 开盘价: 指定时间段(通常为24小时)的起始价格。
- 涨跌幅: 与前一日收盘价相比的价格变动百分比,快速了解价格趋势。
此功能提供对交易所或交易平台支持的所有交易对的全面行情数据访问。这些数据通常包括:
这些信息能够帮助交易者识别潜在的交易机会,评估市场风险,并制定相应的交易策略。 通过API或交易所提供的界面,用户可以轻松检索和分析这些实时数据,进行量化分析和算法交易。
GET /api/v3/asset_pairs
参数: 无
返回值:
返回的 JSON 对象包含了交易对的市场行情数据,结构如下:
code
: 返回码,
0
表示成功,其他值表示错误。
message
: 返回消息,通常在
code
非
0
时包含错误信息,成功时为 "OK"。
data
: 包含交易对信息的数组。每个元素代表一个交易对的行情数据,包括:
asset
pair
name
: 交易对名称,例如 "BTC-USDT"。
base
asset
id
: 基础资产 ID (UUID)。例如,"43d67dd6-6853-41e3-98e6-706dd154134a" 可能代表比特币 (BTC)。
quote
asset
id
: 报价资产 ID (UUID)。例如,"43d67dd6-6853-41e3-98e6-706dd154134b" 可能代表 USDT。
latest
price
: 最新成交价格,例如 "30000.00"。精确到小数点后两位。
volume
: 24 小时成交量,例如 "1000"。 代表一定时间内的交易量,具体时间窗口通常是 24 小时,需要根据交易所的定义确定。
high
: 24 小时最高价,例如 "31000.00"。
low
: 24 小时最低价,例如 "29000.00"。
created
at
: 交易对创建时间,ISO 8601 格式,例如 "2023-10-27T10:00:00Z"。 表示该交易对在交易所系统内被创建的时间戳。
updated_at
: 数据更新时间,ISO 8601 格式,例如 "2023-10-27T10:00:00Z"。 指的是该交易对行情信息最后一次更新的时间。 该时间戳对于监控数据新鲜度至关重要。
示例 JSON 响应:
{
"code": 0,
"message": "OK",
"data": [
{
"assetpairname": "BTC-USDT",
"baseassetid": "43d67dd6-6853-41e3-98e6-706dd154134a",
"quoteassetid": "43d67dd6-6853-41e3-98e6-706dd154134b",
"latestprice": "30000.00",
"volume": "1000",
"high": "31000.00",
"low": "29000.00",
"createdat": "2023-10-27T10:00:00Z",
"updated_at": "2023-10-27T10:00:00Z"
}
]
}
此接口提供所有可用交易对的关键市场数据,方便用户了解市场整体概况和特定交易对的实时表现。 使用者可以根据返回的数据进行分析,制定交易策略或者构建相关的行情展示应用。
获取指定交易对的行情信息
Endpoint:GET /api/v3/asset_pairs/{asset_pair_name}
参数:
-
asset_pair_name
: 交易对名称,指定要进行交易或查询信息的加密货币交易对。例如,BTC-USDT
表示比特币与泰达币之间的交易对。该参数是字符串类型,并且区分大小写。 不同的交易所可能使用不同的命名规范,因此在使用前请务必查阅交易所的API文档或交易对列表,确保交易对名称的准确性。错误的交易对名称会导致API请求失败或返回错误数据。
返回值:
{ "code": 0, "message": "OK", "data": { "asset_pair_name": "BTC-USDT", "base_asset_id": "43d67dd6-6853-41e3-98e6-706dd154134a", "quote_asset_id": "43d67dd6-6853-41e3-98e6-706dd154134b", "latest_price": "30000.00", "volume": "1000", "high": "31000.00", "low": "29000.00", "created_at": "2023-10-27T10:00:00Z", "updated_at": "2023-10-27T10:00:00Z" } }
此接口返回指定交易对的详细行情信息,包括但不限于交易对名称 (
asset_pair_name
)、基础资产ID (
base_asset_id
)、报价资产ID (
quote_asset_id
)、最新成交价格 (
latest_price
)、24小时成交量 (
volume
)、24小时最高价 (
high
)、24小时最低价 (
low
)、创建时间 (
created_at
) 和更新时间 (
updated_at
)。
code
为 0 表示请求成功,
message
为 "OK" 也指示成功状态。
base_asset_id
和
quote_asset_id
通常是 UUID 格式的字符串,用于唯一标识每种加密资产。 时间戳
created_at
和
updated_at
采用 ISO 8601 格式,并使用 UTC 时区标准。
2. 交易接口 (需要认证)
-
下单
此接口允许已认证的用户提交交易订单,将数字资产买入或卖出。使用此接口前,务必完成必要的身份验证流程,确保账户安全并符合监管要求。下单时,需要提供交易对(例如,BTC/USDT)、订单类型(市价单或限价单)、交易方向(买入或卖出)以及数量等必要参数。请仔细核对订单信息,确认无误后再提交。不同交易所对下单参数的定义可能存在差异,请参考相关API文档。
为了保障用户资金安全,强烈建议在生产环境中使用前,先在测试环境进行充分测试。需要注意API的调用频率限制,避免因频繁调用导致IP被限制访问。
POST /api/v3/orders
参数:
以下参数用于构建交易请求,请确保所有数值都经过精确计算和验证。
asset_pair_name
: 交易对名称,指定交易的资产对。例如,
"BTC-USDT"
表示比特币 (BTC) 兑换泰达币 (USDT)。大小写敏感,必须与交易所支持的交易对完全一致。交易所通常提供API接口查询支持的交易对列表。
side
: 交易方向,指示是买入还是卖出。
"buy"
表示买入,
"sell"
表示卖出。大小写敏感,必须使用交易所规定的字符串。
type
: 订单类型,决定了订单的执行方式。
"limit"
表示限价单,
"market"
表示市价单。
price
: 订单价格,仅当
type
为
"limit"
时需要指定。
"29000.00"
表示以 29000.00 USDT 的价格买入或卖出。该价格必须在交易所允许的范围内,且需要考虑交易手续费的影响。
amount
: 交易数量,指定买入或卖出的资产数量。
"0.01"
表示交易 0.01 BTC。数量必须满足交易所规定的最小交易数量限制。
返回值:
下单接口返回JSON格式数据,用于确认订单请求的处理状态,以及订单的详细信息。 该数据结构包含以下字段:
code
: 状态码,
0
表示成功,其他值表示失败。请参考错误码列表获取详细信息。
message
: 状态描述信息,成功时返回 "OK",失败时返回相应的错误信息。
data
: 包含订单详细信息的对象。如果下单失败,该字段可能为空或包含错误信息。
data
对象包含以下字段:
-
id
: 订单ID,全局唯一,用于标识该订单。例如:order_id
。 -
asset_pair_name
: 交易对名称,例如:BTC-USDT
,表示比特币兑美元泰达币。 -
side
: 买卖方向,buy
表示买入,sell
表示卖出。 -
type
: 订单类型,limit
表示限价单。未来可能支持更多类型,如market
(市价单)。 -
price
: 委托价格,只有限价单需要指定。例如:29000.00
,表示以 29000 美元泰达币的价格买入/卖出。 -
amount
: 委托数量,表示买入/卖出的资产数量。例如:0.01
,表示 0.01 个比特币。 -
state
: 订单状态,可能的值包括:-
pending
: 订单已提交,等待撮合。 -
open
: 订单已进入撮合队列,部分成交或未完全成交。 -
filled
: 订单已完全成交。 -
canceled
: 订单已被撤销。 -
其他状态: 根据交易所的具体实现,可能存在其他中间状态,如
partially_filled
(部分成交)。
-
-
created_at
: 订单创建时间,采用 ISO 8601 格式。例如:2023-10-27T10:00:00Z
。 -
updated_at
: 订单最近更新时间,采用 ISO 8601 格式。例如:2023-10-27T10:00:00Z
。
此接口用于提交新的订单。必须指定交易对,买卖方向(
side
),订单类型 (
type
),价格 (
price
,仅限价单需要) 和数量 (
amount
)。请确保账户有足够的资金来完成交易。
DELETE /api/v3/orders/{order_id}
参数:
-
order_id
: 订单 ID。这是一个唯一标识符,用于在系统中追踪特定的交易订单。它通常是一个字符串或整数,由交易所或交易平台生成。使用此ID可以查询订单的详细信息,包括订单状态、交易价格、数量和时间戳。确保此ID的准确性对于订单管理和审计至关重要。
返回值:
以下JSON结构描述了撤销订单接口成功执行后的返回值:
{
"code": 0,
"message": "OK",
"data": {
"id": "order_id",
"asset_pair_name": "BTC-USDT",
"side": "buy",
"type": "limit",
"price": "29000.00",
"amount": "0.01",
"state": "canceled",
"created_at": "2023-10-27T10:00:00Z",
"updated_at": "2023-10-27T10:00:00Z"
}
}
字段解释:
-
code
: 返回码,0
表示成功。 -
message
: 返回信息,"OK"
表示操作成功。 -
data
: 包含订单详细信息的对象。-
id
: 订单ID,唯一标识该订单。 -
asset_pair_name
: 交易对名称,例如"BTC-USDT"
。 -
side
: 订单方向,"buy"
表示买入,"sell"
表示卖出。 -
type
: 订单类型,例如"limit"
(限价单),"market"
(市价单)。 -
price
: 订单价格,以字符串形式表示。 -
amount
: 订单数量,以字符串形式表示。 -
state
: 订单状态,"canceled"
表示已撤销。 其他可能的状态包括"pending"
(待成交),"partially_filled"
(部分成交),"filled"
(完全成交)。 -
created_at
: 订单创建时间,采用 ISO 8601 格式 (UTC 时间)。 -
updated_at
: 订单最后更新时间,采用 ISO 8601 格式 (UTC 时间)。
-
此接口允许用户取消先前提交的订单。调用成功后,服务器将停止尝试执行该订单,并将订单状态更新为“canceled”。
GET /api/v3/orders/{order_id}
参数:
-
order_id
: 订单 ID。这是用于唯一标识特定订单的字符串或数字。每个订单在系统内都应具有唯一的 ID,以便于跟踪、管理和检索订单详细信息。此 ID 通常由系统自动生成,并用于关联订单的所有相关信息,例如客户信息、购买的产品、支付状态、发货信息等等。确保order_id
的格式一致且易于识别,对于维护系统的完整性和效率至关重要。例如,可以使用 UUID (Universally Unique Identifier) 保证唯一性,或者采用具有特定前缀和时间戳的组合方式来提高可读性。
返回值:
以下 JSON 结构体展示了接口成功返回时的数据格式,包含了订单的各项关键属性:
{
"code": 0,
"message": "OK",
"data": {
"id": "order_id",
"asset_pair_name": "BTC-USDT",
"side": "buy",
"type": "limit",
"price": "29000.00",
"amount": "0.01",
"state": "open", // 订单状态:pending (待成交), open (部分成交/未完全成交), filled (完全成交), canceled (已取消)
"created_at": "2023-10-27T10:00:00Z",
"updated_at": "2023-10-27T10:00:00Z"
}
}
字段解释:
-
code
: 返回代码,0 表示成功,其他值表示错误。 -
message
: 返回消息,通常在发生错误时提供更详细的错误描述。 -
data
: 包含订单详细信息的 JSON 对象。 -
id
: 订单的唯一标识符。 -
asset_pair_name
: 交易对名称,例如 "BTC-USDT"。 -
side
: 订单方向,"buy" 表示买入,"sell" 表示卖出。 -
type
: 订单类型,例如 "limit" (限价单), "market"(市价单)。 -
price
: 订单的指定价格(仅限价单)。 -
amount
: 订单的数量。 -
state
: 订单当前的状态。 -
created_at
: 订单创建的时间,采用 ISO 8601 格式 (UTC 时间)。 -
updated_at
: 订单最后更新的时间,采用 ISO 8601 格式 (UTC 时间)。
此接口用于查询指定
order_id
对应的订单的详细信息,包括其交易对、买卖方向、类型、价格、数量、当前状态以及创建和更新时间等。
GET /api/v3/orders
参数:
-
asset_pair_name
: (可选) 交易对名称,指定要查询的交易对,例如BTC-USDT
。如果不指定,则可能返回默认交易对或需要进一步的配置。建议提供此参数以获得精确的结果。资产对的命名惯例通常采用"基础资产-计价资产"的形式,例如,BTC-USDT 表示使用 USDT 购买 BTC。 -
page
: (可选) 页码,用于分页获取交易记录。默认值为 1,表示第一页。当交易记录数量超过每页数量时,可以通过调整此参数来浏览后续页面。合理的页码设置对于高效的数据检索至关重要。 -
size
: (可选) 每页数量,即在单个页面上返回的交易记录数量。默认值为 20,最大值为 100。较大的size
值可以减少请求次数,但可能会增加单次请求的响应时间。选择合适的size
值需要在请求效率和响应速度之间进行权衡。超出最大值限制的值将被自动截断为最大值。
返回值:
以下 JSON 结构体展示了接口返回的订单数据格式,用于分页查询用户的历史订单。
{
"code": 0,
"message": "OK",
"data": [
{
"id": "orderid1",
"assetpairname": "BTC-USDT",
"side": "buy",
"type": "limit",
"price": "29000.00",
"amount": "0.01",
"state": "open",
"createdat": "2023-10-27T10:00:00Z",
"updatedat": "2023-10-27T10:00:00Z"
},
{
"id": "orderid2",
"assetpairname": "BTC-USDT",
"side": "sell",
"type": "market",
"amount": "0.005",
"state": "filled",
"createdat": "2023-10-26T10:00:00Z",
"updatedat": "2023-10-26T10:00:00Z"
}
],
"pagination": {
"currentpage": 1,
"totalpages": 10,
"total_count": 200
}
}
字段说明:
-
code
: 响应状态码,0 表示成功。 非 0 值可能指示错误情况。 -
message
: 状态描述信息,成功时通常为 "OK",失败时包含错误信息。 -
data
: 订单数据数组,每个元素代表一个订单的信息。-
id
: 订单的唯一标识符。 -
asset pair name
: 交易对名称,例如 "BTC-USDT",表示比特币对泰达币。 -
side
: 订单方向,"buy" 表示买入,"sell" 表示卖出。 -
type
: 订单类型,"limit" 表示限价单,"market" 表示市价单。 限价单允许用户指定价格,市价单则以当前市场最优价格成交。 -
price
: 限价单的价格,仅在type
为 "limit" 时有效。 -
amount
: 订单数量。 -
state
: 订单状态,例如 "open" (未成交), "filled" (已成交), "canceled" (已取消), "partially_filled" (部分成交)。 -
created at
: 订单创建时间,采用 ISO 8601 格式。 -
updated at
: 订单最后更新时间,采用 ISO 8601 格式。
-
-
pagination
: 分页信息。-
current page
: 当前页码。 -
total pages
: 总页数。 -
total_count
: 总订单数量。
-
通过
pagination
字段,可以实现分页加载订单数据,提高接口响应速度和用户体验。 在请求下一页数据时,需要将
current_page
参数递增。
3. 账户信息 (需要认证)
- 获取账户余额: 访问账户余额是加密货币交易和投资的基础。这通常涉及调用交易所或钱包提供商的API,并可能需要身份验证才能访问敏感信息。需要注意的是,余额可能以不同的单位显示,例如BTC、ETH或USDT,并且可能需要进行转换。
GET /api/v3/accounts
参数: 无
返回值:
以下 JSON 格式展示了接口成功返回时的数据结构,详细描述了用户账户的资产余额信息。
{
"code": 0,
"message": "OK",
"data": [
{
"asset_id": "43d67dd6-6853-41e3-98e6-706dd154134a", // BTC (比特币) 的唯一资产标识符
"balance": "1.00", // 账户中 BTC 的总余额,包括可用和冻结部分。
"available": "0.50", // 账户中可用于交易或提现的 BTC 余额。
"locked": "0.50" // 账户中被冻结的 BTC 余额,例如用于挂单、抵押等。
},
{
"asset_id": "43d67dd6-6853-41e3-98e6-706dd154134b", // USDT (泰达币) 的唯一资产标识符
"balance": "10000.00", // 账户中 USDT 的总余额
"available": "9000.00", // 账户中可用的 USDT 余额
"locked": "1000.00" // 账户中被锁定的 USDT 余额
}
]
}
code
字段为 0 表示请求成功,
message
字段为 "OK" 进一步确认了操作的顺利完成。
data
数组包含了用户持有的各种加密货币资产的详细信息。
asset_id
是每种加密货币的唯一标识符,可以用来区分不同的资产类型。
余额 (
balance
) 代表账户中持有的总资产数量。
可用余额 (
available
) 指的是用户可以立即用于交易或提取的资产数量。
锁定余额 (
locked
) 是指由于未完成的交易或其他原因而暂时无法使用的资产数量。理解这三个余额之间的关系对于管理数字资产至关重要。
API 签名
对于需要认证的 API 接口,为了确保请求的安全性与完整性,需要对每个请求进行签名验证。签名过程涉及多个步骤,旨在防止恶意篡改和未经授权的访问。
-
构建签名字符串:
签名字符串是后续哈希计算的基础。构建过程需要将以下元素按照特定顺序拼接在一起:
-
请求方法 (
GET
,POST
,PUT
,DELETE
等)。 -
请求路径 (不包含域名,例如
/api/v3/accounts
)。 -
请求参数:将所有请求参数以键值对的形式按照参数名称的字母顺序进行排序,然后进行 URL 编码,并将编码后的键值对拼接成字符串。 例如
param1=value1¶m2=value2
。 注意,如果参数值本身也是一个复杂的结构(例如 JSON),需要先将其序列化为字符串,再进行 URL 编码。 - 请求时间戳:使用 Unix 时间戳,精确到秒。
将以上元素按照顺序连接成一个字符串。例如:
GET/api/v3/accountsparam1=value1¶m2=value21678886400
-
请求方法 (
-
计算 HMAC-SHA256 哈希值:
HMAC-SHA256 算法是一种基于密钥的哈希算法,可以有效地验证消息的完整性和来源。使用您的
Secret Key
作为密钥,对上一步构建的签名字符串进行 HMAC-SHA256 哈希计算。不同的编程语言有不同的实现方式,但核心原理都是相同的。务必使用与服务端一致的字符编码进行计算,通常是 UTF-8。 -
生成签名:
HMAC-SHA256 哈希计算的结果是二进制数据,为了方便在 HTTP 请求头中传输,需要将其转换为 Base64 编码。Base64 编码将二进制数据转换为 ASCII 字符串。
-
添加请求头:
将
API Key
、生成的签名和时间戳添加到 HTTP 请求头中,以便服务器进行验证。-
Authorization
:Bearer
:<签名> 此头部字段用于传递 API Key 和签名信息。
Bearer
是一种认证方案,表明接下来的是一段令牌信息,这里包含了 API Key 和签名,两者用冒号:
分隔。 -
BIGONE-TIMESTAMP
: 时间戳 (Unix 时间戳,单位秒)此头部字段用于传递请求的时间戳。 时间戳用于防止重放攻击,服务器会验证时间戳的有效性,如果时间戳与服务器当前时间相差过大,则会拒绝请求。
-
示例 (Python):
import hashlib
import hmac
import base64
import time
import urllib.parse
api_key = "your_api_key"
secret_key = "your_secret_key"
http_method = "GET"
request_path = "/api/v3/accounts"
request_params = {"param1": "value1", "param2": "value2"} # URL parameters as a dictionary
timestamp = str(int(time.time()))
# 1. 构建签名字符串
sorted_params = sorted(request_params.items()) # 按照key排序
encoded_params = urllib.parse.urlencode(sorted_params) # URL encode
signature_string = http_method + request_path + encoded_params + timestamp
# 2. 计算 HMAC-SHA256 哈希值
hashed = hmac.new(secret_key.encode('utf-8'), signature_string.encode('utf-8'), hashlib.sha256)
# 3. 生成签名
signature = base64.b64encode(hashed.digest()).decode('utf-8')
# 4. 添加请求头 (这里仅为示例,实际使用时需要添加到HTTP请求中)
authorization_header = f"Bearer {api_key}:{signature}"
print(f"Authorization: {authorization_header}")
print(f"BIGONE-TIMESTAMP: {timestamp}")
URL Encode Parameters
在构建HTTP请求时,特别是GET或POST请求,将参数正确编码至关重要。`urllib.parse.urlencode()`函数在Python中提供了一种便捷的方式来实现这一目标,它将Python字典形式的参数转换为URL编码的字符串,以便安全地嵌入到URL或请求体中。
考虑一个Python字典,其中包含需要作为URL参数传递的键值对:
request_params = {'key1': 'value1', 'key2': 'value with space', 'key3': 'value&with&ersands'}
。
`urllib.parse.urlencode(request_params)`函数会将此字典转换为URL编码的字符串,例如:
'key1=value1&key2=value+with+space&key3=value%26with%26ampersands'
。
这个过程涉及几个关键的转换步骤:
- 将字典的键和值转换为字符串。
-
使用
=
将键和值连接起来。 -
使用
&
连接不同的键值对。 -
对特殊字符进行百分号编码(Percent-encoding),例如空格被编码为
+
,&
被编码为%26
。 其他需要编码的字符包括但不限于:?
,/
,:
,#
,[
,]
,@
,!
,$
,'
,(
,)
,*
,+
,,
,;
,=
, 以及所有非ASCII字符。
因此,可以使用如下代码片段来生成编码后的参数字符串:
encoded_params = urllib.parse.urlencode(request_params)
然后,可以将
encoded_params
附加到URL的末尾(对于GET请求)或将其作为请求体发送(对于POST请求)。 对于GET请求,通常将编码后的参数附加到URL后面,以
?
开头,例如:
'https://example.com/api?'+ encoded_params
。
正确使用`urllib.parse.urlencode()`函数可以确保参数在网络传输过程中保持完整性和正确性,避免由于特殊字符未正确处理而导致的问题。尤其是在与外部API交互时,遵循URL编码规范至关重要。
构建签名字符串
在加密货币交易平台或去中心化应用 (DApp) 中,安全地验证请求至关重要。签名字符串是构建安全请求的关键步骤,它本质上是将请求的关键信息组合成一个唯一的字符串,然后使用私钥对其进行加密签名。这个签名随后与请求一起发送,接收方可以使用发送方的公钥验证签名,从而确保请求的完整性和真实性。
构建签名字符串的过程涉及以下几个关键要素,按照特定顺序连接,形成最终的签名输入:
-
HTTP 方法 (
http_method
): 这是发起请求时使用的 HTTP 方法,例如GET
、POST
、PUT
或DELETE
。 必须使用大写形式,并严格区分大小写。 不同的 HTTP 方法代表了不同的操作类型,因此必须包含在签名中以防止篡改。 例如,将POST
请求更改为GET
请求可能会导致意外的数据泄露或修改。 -
请求路径 (
request_path
): 这是请求的目标 URL 路径,不包含域名或查询参数。 它唯一地标识了服务器上的特定资源或操作。 确保路径的准确性至关重要,因为即使是路径中的微小错误也可能导致签名验证失败。 例如,/api/v1/orders
和/api/v2/orders
代表了不同的 API 版本或资源,必须正确区分。 -
编码后的参数 (
encoded_params
): 这是请求中包含的所有参数,按照特定的编码规则进行格式化后的字符串。 参数通常包含查询参数(用于GET
请求)或请求体中的数据(用于POST
、PUT
请求)。 编码过程通常涉及对参数进行排序(例如,按字母顺序),然后将每个参数与其值配对,并对特殊字符进行 URL 编码。 排序的目的是确保参数的顺序不会影响签名,从而使相同的请求始终产生相同的签名。 URL 编码确保了参数中的特殊字符(例如空格、斜杠和非 ASCII 字符)能够安全地传输,而不会被错误地解释为 URL 结构的一部分。 -
时间戳 (
timestamp
): 这是一个表示请求创建时间的数字,通常以 Unix 时间戳(自 Unix 纪元以来的秒数)表示。 时间戳用于防止重放攻击,攻击者可能会尝试捕获并重新发送有效的请求。 接收方可以检查时间戳,并拒绝超过一定时间窗口的请求。 时间戳的精度和时区必须与服务器的要求保持一致,以确保签名验证成功。
因此,签名字符串的构建公式可以概括为:
signature_string = http_method + request_path + encoded_params + timestamp
构建好签名字符串后,可以使用私钥对其进行加密签名,生成最终的签名。 这个签名将与请求一起发送,以便接收方验证请求的真实性和完整性。
计算 HMAC-SHA256 哈希值
在消息认证中,HMAC(Hash-based Message Authentication Code)算法结合了密码散列函数和密钥,用于验证数据的完整性和认证来源。 HMAC-SHA256 是一种特定的 HMAC 算法,它使用 SHA-256 作为其底层散列函数。 为了计算 HMAC-SHA256 哈希值,你需要一个密钥和一个消息。 这个密钥只有发送者和接收者知道。消息则可以是任何需要认证的数据。
以下 Python 代码展示了如何使用
hmac
和
hashlib
库来计算 HMAC-SHA256 哈希值。
import hmac
import hashlib
secret_key = "your_secret_key" # 你的密钥
signature_string = "message_to_sign" # 需要进行签名的消息
hashed = hmac.new(secret_key.encode('utf-8'), signature_string.encode('utf-8'), hashlib.sha256)
代码详解:
-
import hmac
和import hashlib
导入必要的库。hmac
库提供了 HMAC 算法的实现,而hashlib
库提供了各种散列函数,包括 SHA-256。 -
secret_key = "your_secret_key"
定义了用于计算 HMAC 的密钥。 重要提示: 密钥必须保密,只有发送者和接收者知道。 在实际应用中,请使用一个强随机密钥,并且安全地管理和存储它。 -
signature_string = "message_to_sign"
定义了需要进行 HMAC 签名的消息。 这可以是任何类型的数据,例如 API 请求、事务数据等。 -
hmac.new(secret_key.encode('utf-8'), signature_string.encode('utf-8'), hashlib.sha256)
创建一个新的 HMAC 对象。-
secret_key.encode('utf-8')
将密钥编码为 UTF-8 字节串。 HMAC 算法需要字节串作为输入。 -
signature_string.encode('utf-8')
将消息编码为 UTF-8 字节串。 -
hashlib.sha256
指定使用 SHA-256 作为散列函数。
-
生成的
hashed
对象包含了 HMAC-SHA256 哈希值。 你可以使用
hashed.hexdigest()
方法获取哈希值的十六进制表示,例如:
hmac_hex_digest = hashed.hexdigest()
print(hmac_hex_digest)
hmac_hex_digest
变量将包含 HMAC-SHA256 哈希值的十六进制字符串表示。 这个哈希值可以被用于验证消息的完整性和认证来源。 接收者可以使用相同的密钥和消息重新计算 HMAC-SHA256 哈希值,并将其与接收到的哈希值进行比较。 如果两个哈希值匹配,则可以确认消息在传输过程中没有被篡改,并且确实来自可信的发送者。
生成签名
签名 (signature) 的生成是API安全认证的关键步骤,它基于请求内容的哈希值进行加密,确保数据的完整性和来源的可靠性。对需要发送的数据进行哈希运算,通常使用SHA256算法,生成一个固定长度的哈希值。然后,将这个哈希值进行Base64编码,将其转换为一个可打印的字符串。这个Base64编码后的字符串就是签名。
signature = base64.b64encode(hashed.digest()).decode('utf-8')
上述Python代码展示了签名生成的具体过程。
hashed.digest()
代表哈希运算后的二进制摘要,
base64.b64encode()
函数将其进行Base64编码,最后使用
decode('utf-8')
将字节串解码为UTF-8字符串,得到最终的签名。
在构建HTTP请求头时,通常会将API密钥 (
api_key
)、签名 (
signature
) 以及时间戳 (
timestamp
) 包含进去,用于服务器端的身份验证和请求有效性校验。将API密钥与签名组合使用,可以有效防止未经授权的访问。
headers = {
"Authorization": f"Bearer {api_key}:{signature}",
"BIGONE-TIMESTAMP": timestamp
}
在
Authorization
头部中使用 "Bearer" 方案,将API密钥和签名以 "
api_key:signature
" 的格式拼接在一起,并用冒号分隔。
BIGONE-TIMESTAMP
头部则包含生成签名时的时间戳,这有助于防止重放攻击。服务器端会验证时间戳的有效性,例如,拒绝处理超过一定时间窗口的请求。
综上,正确的签名生成和使用,以及对时间戳的校验,是API安全的重要组成部分,能够有效保障数据安全和防止恶意攻击。
Now, utilize the headers when constructing your API request using a library such as 'requests' in Python.
When interacting with the BigONE API, proper authentication is crucial. You'll typically obtain API keys (an API key and a secret key) from your BigONE account settings. The
headers
parameter within the
requests
library provides a mechanism to securely transmit these credentials along with your API requests. These headers usually include the API key itself and a signature derived from the secret key, request parameters, and timestamp, ensuring the authenticity and integrity of your request.
For instance, using Python's
requests
library, you can structure your API call as follows:
import requests
# Construct the headers with your API key and signature. The specific header names may vary depending on the BigONE API documentation.
headers = {
"Content-Type": "application/",
"Authorization": "YOUR_API_KEY", # Replace with your actual API key, or signature if needed
"X-BIGONE-SIGNATURE": "YOUR_SIGNATURE" # If required by BigONE
}
# Define any necessary request parameters
request_params = {
"limit": 100, # Example: Limit the number of results
"offset": 0 # Example: Offset for pagination
}
# Make the GET request to the API endpoint, including the headers and parameters
response = requests.get("https://big.one/api/v3/accounts", headers=headers, params=request_params)
The
headers
dictionary should be populated according to the BigONE API documentation, incorporating the required authentication information. The
request_params
dictionary allows you to specify query parameters to filter or paginate the results returned by the API.
After sending the request, you can access the response data:
print(response.())
The
response.()
method parses the JSON response from the API and converts it into a Python dictionary or list, making it easy to access and process the data. Remember to handle potential errors, such as invalid API keys or rate limits, by checking the response status code (
response.status_code
) and implementing appropriate error handling mechanisms in your code.
错误处理
当与加密货币相关的 API 请求失败时,返回值中的
code
字段将指示错误类型,不再是默认的
0
,而
message
字段将包含更详细的、人类可读的错误信息,帮助开发者诊断问题。开发者必须认真分析这些错误信息,并根据具体的
code
和
message
进行相应的处理,例如重试请求、调整参数或通知用户。
为了确保稳定性和用户体验,了解常见的错误码及其含义至关重要。以下列出了一些常见的 HTTP 状态码以及可能出现的特定于加密货币交易平台的错误码示例:
-
400
: 请求参数错误。这意味着客户端发送的请求包含无效的参数,例如,参数类型错误、缺少必要的参数、参数值超出范围等。检查API文档,确保请求的参数正确无误,例如交易数量是否超过了账户余额,或地址格式是否有效。 -
401
: 认证失败。这表明客户端提供的身份验证信息不正确,例如,无效的 API 密钥、错误的密码或过期的令牌。请检查API密钥是否正确配置,并确保拥有访问API的权限。如使用OAuth 2.0,需确保token的有效性。 -
403
: 权限不足。客户端已通过身份验证,但没有足够的权限访问请求的资源。可能是由于API密钥的权限设置不正确,或者账户类型不允许执行该操作。请检查API密钥的权限范围,并确认账户具有执行相关操作的权限。某些平台可能针对不同类型的操作(例如,读取数据、交易、提款)提供不同的权限级别。 -
404
: 资源不存在。请求的资源不存在,例如,指定的交易对不存在、用户账户不存在或请求的订单ID无效。验证URL路径和资源ID是否正确。例如,如果尝试访问某个交易对的信息,但该交易对未在平台上列出,则会收到此错误。 -
500
: 服务器内部错误。服务器在处理请求时遇到了未预料到的错误。这通常是服务器端的问题,客户端无法直接解决。建议稍后重试请求,或联系API提供商的技术支持团队。 服务器过载或维护也可能引发此类问题。 -
其他:除了上述常见的HTTP状态码,加密货币交易所和钱包API通常还会返回特定于业务逻辑的错误代码。例如:
-
1001
:账户余额不足 -
1002
:交易金额过小 -
1003
:交易被拒绝(例如,由于风控规则) -
1004
:达到API调用频率限制(Rate Limit Exceeded)。针对此类问题,建议开发者实施重试机制,使用指数退避算法,并遵守API提供商的速率限制策略。
-
注意事项
- API Key 和 Secret Key 安全至关重要: 务必如同对待银行密码一般,妥善保管您的 API Key 和 Secret Key。请勿在公开场合(如论坛、社交媒体、代码仓库)泄露,更不要将其硬编码到客户端应用程序中。一旦泄露,他人可能利用您的凭据进行恶意操作,造成资金损失或其他不可挽回的后果。建议采取加密存储、权限控制等措施,从根本上保护您的API密钥安全。考虑使用环境变量或密钥管理服务来存储敏感信息。
- 严格遵守 API 文档: 细致研读 API 文档,明确每个接口的请求参数、数据格式、返回结果和错误代码。严格按照文档规范构建请求,避免因参数错误、签名问题等导致请求失败或返回错误数据。不规范的请求可能会触发频率限制,影响您的正常使用。请特别留意 API 文档中关于参数类型(例如,字符串、整数、浮点数)和数据范围的说明。
- 利用 SDK 或第三方库: 优先选择官方提供的 SDK 或经过社区验证的第三方库来简化 API 调用流程。SDK 和库通常已经封装了底层的 HTTP 请求处理、签名生成、错误处理等逻辑,能够有效降低开发难度,提高开发效率。同时,这些工具通常会提供更友好的接口和更完善的错误提示,帮助您更快地定位和解决问题。选择时,需要注意SDK或第三方库的维护情况和社区活跃度。
- API 速率限制与资源管理: 各个 API 接口都有不同的速率限制,旨在保护服务器资源,防止滥用。请仔细阅读 API 文档,了解每个接口的速率限制规则(例如,每分钟请求次数、每秒请求次数)。在程序中实现速率限制控制逻辑,避免超出限制而被暂时或永久封禁。可以使用令牌桶算法、漏桶算法等策略来平滑请求流量,防止突发请求对服务器造成压力。同时,注意合理缓存 API 返回的数据,减少不必要的请求。关注API供应商的更新通知,速率限制可能会根据系统负载进行动态调整。
示例代码 (Python)
以下是一个使用 Python
requests
库调用 BigONE API 获取账户余额的示例代码。 为了安全地访问您的 BigONE 账户,请务必妥善保管您的 API 密钥和密钥。
import requests
import hashlib
import hmac
import base64
import time
import urllib.parse
api_key = "YOUR_API_KEY" # 替换为你的 API Key,请务必替换为你的实际 API Key
secret_key = "YOUR_SECRET_KEY" # 替换为你的 Secret Key,请务必替换为你的实际 Secret Key
api_url = "https://big.one/api/v3/accounts" # BigONE API 账户信息查询端点
http_method = "GET" # 使用 GET 方法获取账户信息
request_path = "/api/v3/accounts" # 请求路径
request_params = {} # 请求参数,此处为空
timestamp = str(int(time.time())) # 获取当前时间戳,用于签名
encoded_params = urllib.parse.urlencode(request_params) # 将请求参数进行 URL 编码
signature_string = http_method + request_path + encoded_params + timestamp # 构造签名字符串,包括 HTTP 方法、请求路径、编码后的请求参数和时间戳
hashed = hmac.new(secret_key.encode('utf-8'), signature_string.encode('utf-8'), hashlib.sha256) # 使用 HMAC-SHA256 算法对签名字符串进行哈希
signature = base64.b64encode(hashed.digest()).decode('utf-8') # 将哈希结果进行 Base64 编码,得到签名
headers = {
"Authorization": f"Bearer {api_key}:{signature}", # 构造授权头部,包括 API Key 和签名
"BIGONE-TIMESTAMP": timestamp # 添加时间戳头部,防止重放攻击
}
try:
response = requests.get(api_url, headers=headers) # 发送 GET 请求,并携带授权头部
response.raise_for_status() # Raise HTTPError for bad responses (4xx or 5xx),如果响应状态码不是 200,则抛出异常
data = response.() # 将响应内容解析为 JSON 格式
print(data) # 打印账户信息
except requests.exceptions.RequestException as e:
print(f"Request failed: {e}") # 捕获请求异常,例如网络错误
except Exception as e:
print(f"An error occurred: {e}") # 捕获其他异常,例如 JSON 解析错误
请注意替换
YOUR_API_KEY
和
YOUR_SECRET_KEY
为你自己的 API Key 和 Secret Key。确保您的 API 密钥和密钥安全存储,避免泄露。 此示例代码仅用于演示如何使用 BigONE API 获取账户余额,请根据实际需求进行修改和完善。 同时,请仔细阅读 BigONE API 文档,了解 API 的使用限制和最佳实践。
通过本文档,你应该对 BigONE API 的基本使用方法有了初步了解。 建议仔细阅读官方 API 文档,了解更多高级功能和接口细节。 祝你使用愉快!