TRON Energy API
能量交易平台开发文档
为商户出款系统、钱包服务和批量地址运营提供稳定的 TRON 能量租赁接口。本文档采用企业级接入流程组织内容: 先获取 API Key,完成只读连通性检查,再提交租赁订单并保存订单号。
Overview
文档总览
该接口适合服务端系统调用。浏览器端不应保存 API Key 或账号密码,生产环境建议使用服务端中转并统一记录订单号。
开放接口
本站新接入使用 POST /api/balance 检查密钥,使用 POST /api/send 提交能量租赁订单;请求体均使用 apikey 字段。
登录后接口
适合会员中心或自有后台使用,统一通过 token 请求头传递登录态,主要包含用户资料、地址管理、订单列表和 API Key 管理。
在密钥管理中心填写名称,生成并复制完整 API Key。
调用 /api/balance 验证密钥与网络连通性,不创建订单。
确认余额与地址后,调用 /api/send 一次,并保存返回的订单号。
Quick Start
快速开始
推荐从服务端发起请求,统一处理超时、异常、余额不足和订单状态同步。
1. 注册或登录,进入 /member/apikey 生成并复制 API Key 2. 将完整密钥保存在业务服务器的 WWTRX_API_KEY 环境变量中 3. POST /api/balance,提交 apikey,先验证密钥,不产生租赁订单 4. 确认账户余额、租用规格和接收地址,再 POST /api/send 下单一次 5. 保存 data.orderId,在会员中心的接口订单列表核对处理结果 6. 超时或结果不明时先核对订单,不要直接重复下单
本站接口基础地址为 https://haiou.io/api,文档页面地址 /v1 不是下单接口前缀。新接入请使用“API Key 能量下单”中的 /api/send 示例,不要将不同接口的字段混用。
推荐请求头
本站 /api/balance、/api/send 支持 JSON 或 URL 编码表单。下单 JSON 请求使用 Content-Type: application/json;管理密钥时在请求头传 token。
生产要求
API Key、账号密码和 token 只能放在服务端。浏览器、App、前端页面不应直接保存长期密钥。
API Keys
获取与管理 API Key
API Key 用于业务服务器调用接口,可能消耗账户余额。它不是钱包私钥,也不是登录 Token,请按敏感凭据保管。
- 登录账户:注册或登录后,进入会员中心左侧的“密钥管理中心”。未登录时,密钥管理入口会先引导登录。
- 生成密钥:填写便于识别用途的 Key 名称,例如“订单服务生产环境”,点击“生成 API Key”。每个账户最多保留 5 个,名称最多 255 个字符。
- 复制完整值:点击“复制”,或点击“显示”核对。列表默认显示的是掩码,不能把掩码、名称或登录 Token 当成密钥使用。
- 配置到服务端:将完整值保存到
WWTRX_API_KEY环境变量或密钥管理系统,先按下方示例验证,再接入能量下单。
当前生成的密钥为 68 个字符,可能包含 +、-、@。请将它视作不透明字符串,不要拼接前缀、截断或手工替换字符。JSON 使用序列化函数;表单使用 --data-urlencode 或 URLSearchParams,避免 + 被解释为空格。
export WWTRX_API_BASE="https://haiou.io" export WWTRX_API_KEY="YOUR_API_KEY" export TRON_RECEIVE_ADDRESS="YOUR_TRON_ADDRESS"
不要把真实密钥提交到 Git、前端代码、公开日志或截图中。不要使用 VITE_、NUXT_PUBLIC_ 等会暴露到客户端的环境变量前缀。本文中的密钥、地址和响应数据均为示意,不可直接用于付款。
| 操作 | 接口 | 凭据位置 | 用途 |
|---|---|---|---|
| 验证 API Key | POST /api/balance | 请求体 apikey | 验证连通性并读取接口返回的参考次数,不下单。 |
| 能量下单 | POST /api/send | 请求体 apikey | 创建能量租赁订单,成功时可能扣减账户余额。 |
| 获取密钥列表 | GET /api/user/getApikeylist?page=1 | 请求头 token | 只返回当前登录账户的密钥及调用计数。 |
| 生成密钥 | POST /api/user/generateApiKey | 请求头 token | 请求体传 name,成功返回 data.key。 |
| 删除密钥 | POST /api/user/deleteApiKey | 请求头 token | 请求体传列表中的 id,仅能删除本人密钥。 |
# 从服务端环境读取真实密钥,不要把密钥拼进 URL。
curl --silent --show-error --max-time 15 \
--request POST "https://haiou.io/api/balance" \
--data-urlencode "apikey=${WWTRX_API_KEY:?请先设置 WWTRX_API_KEY}"
{
"code": 1,
"msg": "ACCOUNT_RECHARGE_ADDRESS",
"time": 1793326800,
"data": "12"
}
{
"code": 0,
"msg": "请输入正确的APIKEY",
"time": 1793326800,
"data": null
}
/api/balance 的 data 是按接口规则折算的参考次数,不是 TRX 余额,也不是报价;msg 在成功响应中可能是账户充值地址。实际余额和价格请在账户信息中心核对,下单费用以实际订单为准。
通过接口管理密钥(可选)
只需网页操作时,直接使用密钥管理中心即可。自有后台需要自动管理时,先通过“鉴权与 Token”中的登录接口取得 data.userinfo.token,将它设为服务端变量 WWTRX_USER_TOKEN。API Key 不能代替这里的登录 Token。
# 生成:name 使用 URL 编码,避免中文或特殊字符被破坏。
curl --silent --show-error --max-time 15 \
--request POST "https://haiou.io/api/user/generateApiKey" \
--header "token: ${WWTRX_USER_TOKEN:?请先设置登录 Token}" \
--data-urlencode "name=订单服务生产环境"
# 查询:生成响应不包含 id,删除前从本人列表读取 id。
curl --silent --show-error --max-time 15 \
"https://haiou.io/api/user/getApikeylist?page=1" \
--header "token: ${WWTRX_USER_TOKEN:?请先设置登录 Token}"
# 删除会立即影响后续调用,且不可恢复。
# 将 KEY_ID_TO_DELETE 设置为上面列表中确认要删除的 id。
curl --silent --show-error --max-time 15 \
--request POST "https://haiou.io/api/user/deleteApiKey" \
--header "token: ${WWTRX_USER_TOKEN:?请先设置登录 Token}" \
--data-urlencode "id=${KEY_ID_TO_DELETE:?请先确认要删除的密钥 id}"
{
"code": 1,
"msg": "API Key生成成功",
"time": 1793326800,
"data": {
"user_id": 123,
"name": "订单服务生产环境",
"key": "API_KEY_FROM_SERVER"
}
}
{
"code": 1,
"msg": "请求成功",
"time": 1793326800,
"data": {
"list": {
"total": 1,
"per_page": 10,
"current_page": 1,
"last_page": 1,
"data": [{
"id": 456,
"user_id": 123,
"name": "订单服务生产环境",
"key": "API_KEY_FROM_SERVER",
"energyapinum": 0,
"getenergynum": 0
}]
}
}
}
| 字段或反馈 | 含义 | 处理方式 |
|---|---|---|
data.key | 生成后的完整密钥;生成响应没有 id。 | 服务端安全保存;通过列表获取管理用的 id。 |
data.list.data[].id | 密钥记录编号,不是 API Key。 | 仅用于删除对应记录,不用于能量下单。 |
energyapinum / getenergynum | 服务端返回的能量接口和查询调用计数。 | 用于辅助观察使用情况,不作为计费或余额凭据。 |
code=0,请输入APIKEY名称 | 名称为空。 | 填写名称后重新提交。 |
code=0,API Key数量已达上限 | 当前账户已有 5 个密钥。 | 先迁移业务并删除不再使用的密钥,再生成新密钥。 |
HTTP 401 / code=401 | 管理接口的 Token 缺失或失效。 | 重新登录取得 Token;不要改用 API Key 请求头。 |
code=1,API Key删除成功 | 指定密钥已删除,响应 data 可能为 null。 | 停止使用该密钥;删除不可恢复,需重新生成。 |
code=0,API Key删除失败 | 记录不存在、不是本人记录或删除未成功。 | 刷新本人列表并核对编号,不要重复生成密钥。 |
更换密钥时,先生成新密钥、更新服务端并验证,再删除旧密钥;有泄露风险时优先停用泄露密钥。目前没有按密钥单独配置只读权限或消费限额的功能,不要将业务密钥交给第三方。
Authentication
鉴权与 Token
业务下单使用 API Key;用户中心和密钥管理使用登录 Token。两种鉴权不要混用。
API Key 鉴权
本站 /api/send、/api/balance 在请求体中传 apikey,无需登录 Token。请在密钥管理中心生成,名称、掩码和 Token 都不能替代完整密钥。
Token 鉴权
用于 /api/user/* 登录后接口。登录成功后从 data.userinfo.token 取值,并通过 Header token 传递。
Login
API 登录获取 Token
适合服务端或自有后台获取当前用户登录态,后续用于调用登录后接口。
| 字段 | 类型 | 必填 | 说明 | 示例 |
|---|---|---|---|---|
| account | string | 是 | 用户名、邮箱或手机号,取决于后台账号配置。 | demo |
| password | string | 是 | 登录密码。 | demo123456 |
curl -X POST "https://haiou.io/api/user/login" \ -H "Content-Type: application/x-www-form-urlencoded" \ --data "account=demo&password=demo123456"
{
"code": 1,
"msg": "Logged in successful",
"time": 1710000000,
"data": {
"userinfo": {
"id": 10001,
"username": "demo",
"nickname": "demo",
"token": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"expiretime": 1712592000,
"expires_in": 2592000
}
}
}
{
"code": 0,
"msg": "Account or password is incorrect",
"time": 1710000000,
"data": null
}
Rules
响应与错误码
所有接口都应先判断 HTTP 状态,再判断响应体 code。业务成功只以 code = 1 为准。
| 字段 | 类型 | 说明 | 处理建议 |
|---|---|---|---|
| code | number | 1 成功;0 普通业务失败;401 未登录;403 无权限。 | 只在 code=1 时进入成功逻辑。 |
| msg | string | 服务端提示信息,失败时通常包含可展示原因。 | 可用于后台日志和用户提示。 |
| time | number | 服务端 Unix 时间戳,部分开放接口可能不返回。 | 用于排查请求时间和日志对齐。 |
| data | object / array / null | 业务数据。失败时可能为 null 或空对象。 | 必须做空值保护。 |
{
"code": 1,
"msg": "请求成功",
"time": 1710000000,
"data": {
"orderId": "202606260001",
"status": "success"
}
}
{
"code": 0,
"msg": "余额不足",
"time": 1710000000,
"data": null
}
| 错误类型 | 典型 code / msg | 常见原因 | 客户端处理 |
|---|---|---|---|
| 参数错误 | code=0 / 参数错误 | 缺少必填字段、地址格式错误、数量不合法。 | 拦截请求并提示开发者修正字段。 |
| 余额不足 | code=0 / 余额不足 | 账户余额低于本次订单费用。 | 停止重试,引导充值或降低订单数量。 |
| 未登录 | code=401 / Please login first | token 缺失、过期或被退出登录。 | 重新登录获取 token。 |
| 无权限 | code=403 | 账号权限、接口权限或资源归属不匹配。 | 记录日志并联系管理员核对权限。 |
| 上游异常 | HTTP 5xx 或 code=0 | 链上拥堵、资源不足或服务端短时异常。 | 使用退避重试,避免高频重复下单。 |
下单前记录业务单号,提交后保存平台订单号及脱敏后的请求和响应。网络异常、超时或结果不明时,先在会员中心的接口订单列表核对,不要自动重复扣费或重复发能量。不要把密钥或 Token 写进日志。
旧版协议参考:本站未开放 /v1/userInfo 请求路由。新接入请使用密钥指南中的 /api/balance,实时余额请在账户信息中心核对;不要直接把本节路径拼接到本站域名。
Account
查询账户
用于读取用户基础信息、状态和余额。
| 参数 | 类型 | 必填 | 说明 | 示例 |
|---|---|---|---|---|
| username | string | 是 | 平台用户账号,用于定位账户余额和状态。 | demo |
{
"username": "demo"
}
{
"code": 1,
"msg": "请求成功",
"data": {
"username": "demo",
"status": "normal",
"balance": "128.560000",
"level": 1,
"experience": 35,
"apiKeyCount": 2
}
}
| 响应字段 | 类型 | 说明 |
|---|---|---|
| data.username | string | 账户名。 |
| data.status | string | 账户状态,常见为 normal,实际以后台返回为准。 |
| data.balance | string / number | 账户余额。建议前端按字符串展示,服务端计算时转高精度数值。 |
| data.level | number | 会员等级。 |
| data.experience | number | 经验值或成长值。 |
{
"code": 0,
"msg": "用户不存在或账户不可用",
"data": null
}
旧版协议参考:本站未开放 /v1/config 请求路由。本站套餐和价格请在能量租赁页面及账户信息中心核对;仅在已取得单独旧版 API 地址时参考本节字段。
Pricing
查询价格等其他下单参数
在下单前读取价格、租用参数和其他业务配置。
| 参数 | 类型 | 必填 | 说明 | 示例 |
|---|---|---|---|---|
| username | string | 是 | 平台用户账号,不同账号可能对应不同价格和权限。 | demo |
{
"username": "demo"
}
{
"code": 1,
"msg": "请求成功",
"data": {
"resTypes": ["ENERGY", "BANDWIDTH"],
"rentTimes": [
{ "value": "1", "label": "1 小时", "unit": "hour" },
{ "value": "1D", "label": "1 天", "unit": "day" }
],
"energyOptions": [
{ "payNums": "32000", "label": "32,000 Energy" },
{ "payNums": "65000", "label": "65,000 Energy" },
{ "payNums": "130000", "label": "130,000 Energy" }
],
"resLockOptions": [
{ "value": "0", "label": "不锁定" },
{ "value": "1", "label": "锁定" }
],
"price": {
"currency": "TRX",
"energyUnitPrice": "0.0000339",
"bandwidthUnitPrice": "0.000001"
}
}
}
| 响应字段 | 类型 | 说明 |
|---|---|---|
| data.resTypes | array | 允许下单的资源类型,常见为 ENERGY 和 BANDWIDTH。 |
| data.rentTimes | array | 允许的租用时长。前端应使用返回值渲染选项,不要硬编码。 |
| data.energyOptions | array | 推荐能量数量。实际可下单数量仍需以后端校验为准。 |
| data.resLockOptions | array | 资源锁定选项,0 不锁定,1 锁定。 |
| data.price | object | 价格相关配置。字段可能按账号权限扩展,接入方应保留未知字段。 |
{
"code": 0,
"msg": "未找到账号配置",
"data": null
}
Member APIs
登录后用户中心接口
这组接口适合会员中心、自有后台或代理系统使用。必须先通过登录接口获取 token,并在后续请求 Header 中传递。
| 接口 | 方法 | 参数 | data 返回 | 说明 |
|---|---|---|---|---|
| /api/user/getuserinfo | GET | 无 | balance、level、experience | 获取当前用户余额、等级和成长数据。 |
| /api/user/getRechargeAddress | GET | 无 | address | 获取当前用户专属充值地址。 |
| /api/user/profile | POST | username?、nickname?、address?、bio?、avatar? | null | 更新个人资料;地址需为有效 TRON 地址。 |
| /api/user/getAddressList | GET | page | list 分页对象 | 查询能量预设地址列表。 |
| /api/user/addAddress | POST | 见地址字段规范 | null | 新增能量预设地址。 |
| /api/user/editAddress | POST | id + 地址字段 | null | 编辑能量预设地址。 |
| /api/user/getSfaddressList | GET | page | list 分页对象 | 查询转租地址列表。 |
| /api/user/getApikeylist | GET | page | list 分页对象 | 查询 API Key 列表。 |
| /api/user/generateApiKey | POST | name,最长 255 个字符 | user_id、name、key | 生成 API Key,每账户最多 5 个;不会返回记录 id。 |
| /api/user/deleteApiKey | POST | id | null | 删除本人密钥,生效后不可继续使用。 |
| /api/user/getEnergylist | GET | page、keyword?、status?、startTime?、endTime? | list 分页对象 | 查询能量订单,支持状态和时间过滤。 |
| /api/user/getPaylist | GET | page | list 分页对象 | 查询账户收支流水。 |
| /api/user/getPromotionClients | GET | page | inum、tnum、sum、list | 查询推广客户和佣金统计。 |
地址字段规范
address:T 开头 34 位 TRON 地址,必填。remark:备注名称,可选。engjson:能量预设 JSON 字符串,例如{"2000000":"32000"}。status:运行状态,0关闭,1开启。bswitch、pswitch、uswitch、xswitch、eswitch:检测策略开关。
分页对象规范
data.list.total:总记录数。data.list.per_page:每页数量。data.list.current_page:当前页码。data.list.last_page:最后页码。data.list.data:当前页数组。
curl -X GET "https://haiou.io/api/user/getuserinfo" \ -H "token: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
curl -X POST "https://haiou.io/api/user/addSfaddress" \ -H "token: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" \ -H "Content-Type: application/x-www-form-urlencoded" \ --data "name=渠道A&address=TUR3i6owz3iqqWpZkqANgEo4xCEFbD1CtQ&min=0.1&max=10&energy=65000&status=1"
{
"code": 1,
"msg": "请求成功",
"time": 1710000000,
"data": {
"list": {
"total": 12,
"per_page": 10,
"current_page": 1,
"last_page": 2,
"data": []
}
}
}
{
"code": 401,
"msg": "Please login first",
"time": 1710000000,
"data": null
}
旧版协议参考:本站未开放 /v1/pay 请求路由。新接入使用 /api/send 和 API Key,无需将登录密码交给业务下单服务。
Order
租用资源下单用户名密码版
适合人工业务系统或需要直接走账号密码的接入方式。
| 参数 | 类型 | 必填 | 约束 | 说明 |
|---|---|---|---|---|
| username | string | 是 | 已注册账号 | 用户名。 |
| password | string | 是 | 账号密码 | 用户密码。生产环境不推荐长期使用该模式。 |
| resType | string | 是 | ENERGY / BANDWIDTH | 资源类型。 |
| payNums | string / number | 是 | 正整数,常见 32000、65000、130000 | 租用数量。 |
| rentTime | string / number | 是 | 按配置接口返回值提交 | 租用时长。 |
| resLock | string / number | 是 | 0 或 1 | 0 不锁定,1 锁定。 |
| receiveAddress | string | 是 | T 开头 34 位 TRON 地址 | 接收资源地址,不能填写合约地址。 |
{
"username": "demo",
"password": "demo123456",
"resType": "ENERGY",
"payNums": "65000",
"rentTime": "1",
"resLock": "0",
"receiveAddress": "TUR3i6owz3iqqWpZkqANgEo4xCEFbD1CtQ"
}
{
"code": 1,
"msg": "下单成功",
"data": {
"orderId": "202606260001",
"balance": "126.390000",
"orderMoney": "2.170000",
"resType": "ENERGY",
"payNums": "65000",
"receiveAddress": "TUR3i6owz3iqqWpZkqANgEo4xCEFbD1CtQ",
"status": "processing"
}
}
| 响应字段 | 类型 | 说明 |
|---|---|---|
| data.orderId | string / number | 平台订单号,必须落库保存。 |
| data.balance | string / number | 下单后的账户余额。 |
| data.orderMoney | string / number | 本次订单扣费金额。 |
| data.status | string | 订单状态,创建成功后可能仍处于处理中,应继续回查。 |
{
"code": 0,
"msg": "余额不足",
"data": {
"balance": "0.320000",
"required": "2.170000"
}
}
用户名密码版会暴露账号密码给调用服务,仅供已有旧版服务接入方参考。本站商业系统请使用 /api/send 和 API Key。
Recommended
使用 API Key 租赁能量
从业务服务器提交一笔能量租赁订单。请先在密钥管理中心生成 API Key,确认余额及接收地址后再执行。
| 参数 | 类型 | 必填 | 约束 | 说明 |
|---|---|---|---|---|
| apikey | string | 是 | 密钥管理中心生成的完整值 | 只保存在服务端,不使用名称、掩码或登录 Token。 |
| energyAmount | number | 是 | 套餐允许范围内的正整数 | 申请的能量数量,示例 65000;不代表所有转账都只需此数量。 |
| rentTime | number | 是 | 单位:小时,示例 1 | 租用时长,必须为账户当前支持的规格。 |
| resLock | string / number | 是 | 0 或 1 | 资源锁定。多数临时转账场景用 0。 |
| receiveAddress | string | 是 | T 开头 34 位 TRON 地址 | 接收资源地址。 |
{
"apikey": "YOUR_API_KEY",
"receiveAddress": "YOUR_TRON_ADDRESS",
"energyAmount": 65000,
"rentTime": 1,
"resLock": 0
}
{
"code": 1,
"msg": "下单成功",
"time": 1793326800,
"data": {
"hash": "",
"orderId": "EXAMPLE_ORDER_ID",
"balance": "100.000000",
"orderMoney": "2.400000"
}
}
| 响应字段 | 类型 | 说明 |
|---|---|---|
| data.orderId | string / number | 平台订单号。必须保存,用于回查订单状态和对账。 |
| data.balance | string / number | 接口返回的余额字段,实时可用余额以账户信息中心为准。 |
| data.orderMoney | string / number | 本次订单金额。 |
| data.hash | string | 创建响应可能为空,不应据此判断能量到账;提交成功不代表链上最终完成。 |
# 会创建真实订单并可能扣费。确认余额、租用规格及接收地址后执行一次。
# 先将 TRON_RECEIVE_ADDRESS 配置为本人业务的真实 TRON 地址。
curl --silent --show-error --max-time 15 \
--request POST "https://haiou.io/api/send" \
--data-urlencode "apikey=${WWTRX_API_KEY:?请先设置 WWTRX_API_KEY}" \
--data-urlencode "receiveAddress=${TRON_RECEIVE_ADDRESS:?请先设置真实接收地址}" \
--data-urlencode "energyAmount=65000" \
--data-urlencode "rentTime=1" \
--data-urlencode "resLock=0"
{
"code": 0,
"msg": "Key错误",
"time": 1793326800,
"data": null
}
| 失败反馈 | 含义 | 处理方式 |
|---|---|---|
code=0,Key错误 | 密钥无效、已删除或传值不完整。 | 从密钥管理中心重新复制完整值,检查特殊字符编码。 |
code=0,余额不足… | 账户余额不足以支付本次订单。 | 到账户信息中心核对余额,不要循环重试。 |
code=0,租用数量不符合要求 / 时间不符合要求 | 数量或时长不属于当前支持的规格。 | 核对套餐后修改参数。 |
| 超时、断网、HTTP 5xx 或响应无法解析 | 请求最终结果未知,不等于下单失败。 | 先在接口订单列表核对,不自动补发订单。 |
本站此入口固定租用 ENERGY,使用 apikey、energyAmount 字段,不要混用旧协议的 key、payNums。不支持业务单号幂等承诺;请在自己的系统记录业务单号与 orderId 的对应关系。结果不明时先到接口订单列表核对,避免重复扣费。
旧版协议参考:本站未开放 /v1/orderData 请求路由。本站订单结果请在会员中心的接口订单列表核对;仅在已取得单独旧版 API 地址时参考本节字段。
Order Lookup
获取订单信息
按订单 ID 查询订单详情,适合在下单后轮询订单状态或回查业务结果。
| 参数 | 类型 | 必填 | 说明 | 示例 |
|---|---|---|---|---|
| username | string | 是 | 用户名。 | demo |
| orderId | string / number | 是 | 下单成功后返回的平台订单号。 | 202606260001 |
{
"username": "demo",
"orderId": "202606260001"
}
{
"code": 1,
"msg": "请求成功",
"data": {
"orderId": "202606260001",
"clientOrderNo": "PAYOUT-20260626-0001",
"status": "success",
"statusText": "已完成",
"resType": "ENERGY",
"payNums": "65000",
"rentTime": "1",
"resLock": "0",
"receiveAddress": "TUR3i6owz3iqqWpZkqANgEo4xCEFbD1CtQ",
"orderMoney": "2.170000",
"txid": "9f6b...d21a",
"createdAt": "2026-06-26 15:40:01",
"finishedAt": "2026-06-26 15:40:12"
}
}
| 响应字段 | 类型 | 说明 |
|---|---|---|
| data.orderId | string / number | 平台订单号。 |
| data.status | string | 订单状态,常见值可按 processing、success、failed 兼容处理,实际以返回为准。 |
| data.statusText | string | 订单状态中文说明,可用于后台展示。 |
| data.txid | string | 链上交易哈希。部分处理中或失败订单可能为空。 |
| data.finishedAt | string | 完成时间。未完成时可能为空。 |
{
"code": 0,
"msg": "订单不存在",
"data": null
}
建议轮询间隔 3-5 秒,最长轮询 60-120 秒。超过业务等待时间仍未完成时,应进入人工补偿或后台队列,不要无限高频请求。
Server Example
Node.js / Python 服务端示例
两份示例均从环境变量读取完整 API Key,默认只验证连通性。只有显式传入 --send 才提交一笔订单,不包含自动下单重试。
先完成密钥配置,将 WWTRX_API_BASE 设为当前网站的 HTTPS 域名(不要额外带 /v1 或 /api),将 TRON_RECEIVE_ADDRESS 替换为自己的真实业务地址。示例仅校验地址外观,生产环境还需用 TRON SDK 验证地址校验和及业务归属。
# Node.js 18+,将下方 JavaScript 作为 energy-api.mjs 运行。 npm install axios node energy-api.mjs # 只验证密钥,不下单 node energy-api.mjs --send # 确认接收地址、余额、规格后,单独执行一次 # Python 3.10+,将下方 Python 作为 energy_api.py 运行。 python3 -m pip install requests python3 energy_api.py # 只验证密钥,不下单 python3 energy_api.py --send # 确认后,单独执行一次;不要与 Node 示例重复下单
import axios from 'axios'
const baseURL = process.env.WWTRX_API_BASE || 'https://haiou.io'
const apikey = process.env.WWTRX_API_KEY
if (!apikey || apikey === 'YOUR_API_KEY') {
throw new Error('请在服务端设置真实 WWTRX_API_KEY')
}
const base = new URL(baseURL)
if (base.protocol !== 'https:' || base.username || base.password ||
base.pathname !== '/' || base.search || base.hash) {
throw new Error('WWTRX_API_BASE 必须是网站的 HTTPS 域名,不带路径或账号信息')
}
const client = axios.create({ baseURL: base.origin, timeout: 15000 })
async function request(path, payload) {
const { data } = await client.post(path, payload, {
headers: { 'Content-Type': 'application/json' },
})
if (data?.code !== 1) {
throw new Error(data?.msg || 'API 返回失败,请检查原始响应')
}
return data.data
}
try {
const allowance = await request('/api/balance', { apikey })
console.log('密钥验证通过;接口参考次数(不是 TRX 余额):', allowance)
if (process.argv.includes('--send')) {
const receiveAddress = process.env.TRON_RECEIVE_ADDRESS || ''
if (!/^T[1-9A-HJ-NP-Za-km-z]{33}$/.test(receiveAddress)) {
throw new Error('请设置有效的 TRON_RECEIVE_ADDRESS,并核对实际接收方')
}
const order = await request('/api/send', {
apikey,
receiveAddress,
energyAmount: 65000,
rentTime: 1,
resLock: 0,
})
if (!order?.orderId) {
throw new Error('未获得订单号,结果未知;请到接口订单列表核对,不要自动重试')
}
// 生产系统需将 orderId 与自己的业务单号持久化关联。
console.log('订单已提交:', order.orderId, '订单金额:', order.orderMoney)
}
} catch (error) {
// 不直接打印 Axios 错误对象,其中可能含有密钥和请求体。
console.error(error.response?.data?.msg || error.message)
console.error('若已发起下单且结果不明,请先核对接口订单列表,不要重复提交。')
process.exitCode = 1
}
import os
import re
import sys
from urllib.parse import urlsplit
import requests
base = os.getenv("WWTRX_API_BASE", "https://haiou.io").rstrip("/")
apikey = os.getenv("WWTRX_API_KEY", "")
if not apikey or apikey == "YOUR_API_KEY":
raise SystemExit("请在服务端设置真实 WWTRX_API_KEY")
origin = urlsplit(base)
if (origin.scheme != "https" or not origin.netloc or origin.path or
origin.query or origin.fragment or origin.username or origin.password):
raise SystemExit("WWTRX_API_BASE 必须是网站的 HTTPS 域名,不带路径或账号信息")
def request(path, payload):
# 不配置自动重试,尤其不能对创建订单进行盲目补发。
response = requests.post(base + path, json=payload, timeout=15)
try:
result = response.json()
except ValueError:
raise RuntimeError("响应不是 JSON;若已经下单,请先核对订单结果")
if not isinstance(result, dict):
raise RuntimeError("响应结构异常;若已经下单,请先核对订单结果")
if not response.ok or result.get("code") != 1:
raise RuntimeError(result.get("msg") or "API 请求失败")
return result.get("data")
try:
allowance = request("/api/balance", {"apikey": apikey})
print("密钥验证通过;接口参考次数(不是 TRX 余额):", allowance)
if "--send" in sys.argv:
address = os.getenv("TRON_RECEIVE_ADDRESS", "")
if not re.fullmatch(r"T[1-9A-HJ-NP-Za-km-z]{33}", address):
raise RuntimeError("请设置有效的 TRON_RECEIVE_ADDRESS,并核对实际接收方")
order = request("/api/send", {
"apikey": apikey,
"receiveAddress": address,
"energyAmount": 65000,
"rentTime": 1,
"resLock": 0,
})
if not isinstance(order, dict) or not order.get("orderId"):
raise RuntimeError("未获得订单号,结果未知;请先核对订单,不要自动重试")
# 生产系统需将 orderId 与自己的业务单号持久化关联。
print("订单已提交:", order["orderId"], "订单金额:", order.get("orderMoney"))
except requests.RequestException:
print("网络请求失败或超时;若已下单,结果可能未知,请先核对订单。", file=sys.stderr)
sys.exit(1)
except RuntimeError as error:
print(str(error), file=sys.stderr)
sys.exit(1)
验证示例不会创建能量订单;带 --send 的运行才会提交。不要把 Node.js 和 Python 下单命令当成一个连续测试脚本执行;二选一验证即可。示例没有自动重试或幂等保障,超时后先核对订单。
Launch Checklist
上线检查清单
上线前请确认密钥、余额、地址校验、订单保存和异常处理均已完成。
| 检查项 | 要求 | 建议 |
|---|---|---|
| 密钥保存 | API Key 只保存在服务端 | 使用环境变量或密钥管理系统 |
| 密钥获取 | 从密钥管理中心复制完整值 | 先执行 /api/balance 验证,保留 +、-、@ 等字符 |
| 字段与入口 | 本站 /api/send 使用 apikey、energyAmount | 不要将文档页面 /v1 当成本站 API 前缀 |
| 更换与删除 | 先验证新密钥,再删除旧密钥 | 确认所有业务已迁移;删除不可恢复 |
| 地址校验 | 下单前校验 TRON 地址格式 | 避免合约地址、空地址和明显错误地址 |
| 余额检查 | 下单前确认账户余额 | 余额不足时提前拦截业务请求 |
| 订单落库 | 保存 orderId 与业务单号 | 便于后续对账、补偿和排障 |
| 异常处理 | 统一处理 HTTP 状态、code 与 msg | 请求日志对密钥和 Token 脱敏;结果不明不自动重下单 |