能量后结 Developer Center

TRON Energy API

能量交易平台开发文档

为商户出款系统、钱包服务和批量地址运营提供稳定的 TRON 能量租赁接口。本文档采用企业级接入流程组织内容: 先获取 API Key,完成只读连通性检查,再提交租赁订单并保存订单号。

获取 API Key

Overview

文档总览

该接口适合服务端系统调用。浏览器端不应保存 API Key 或账号密码,生产环境建议使用服务端中转并统一记录订单号。

Stable v1
Primary Resource ENERGY
Recommended Auth API Key
Order Tracking orderId
接入前准备

注册账号或登录后,进入密钥管理中心生成 API Key。先确认账户余额、租用规格和资源接收地址,再调用下单接口。

开放接口

本站新接入使用 POST /api/balance 检查密钥,使用 POST /api/send 提交能量租赁订单;请求体均使用 apikey 字段。

登录后接口

适合会员中心或自有后台使用,统一通过 token 请求头传递登录态,主要包含用户资料、地址管理、订单列表和 API Key 管理。

Step 01 获取密钥

在密钥管理中心填写名称,生成并复制完整 API Key。

Step 02 验证接入

调用 /api/balance 验证密钥与网络连通性,不创建订单。

Step 03 创建订单

确认余额与地址后,调用 /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,请按敏感凭据保管。

打开密钥管理中心
  1. 登录账户:注册或登录后,进入会员中心左侧的“密钥管理中心”。未登录时,密钥管理入口会先引导登录。
  2. 生成密钥:填写便于识别用途的 Key 名称,例如“订单服务生产环境”,点击“生成 API Key”。每个账户最多保留 5 个,名称最多 255 个字符。
  3. 复制完整值:点击“复制”,或点击“显示”核对。列表默认显示的是掩码,不能把掩码、名称或登录 Token 当成密钥使用。
  4. 配置到服务端:将完整值保存到 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 KeyPOST /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,仅能删除本人密钥。
先验证密钥:cURL,不创建订单
# 从服务端环境读取真实密钥,不要把密钥拼进 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

适合服务端或自有后台获取当前用户登录态,后续用于调用登录后接口。

POST /api/user/login
Content-Typeapplication/x-www-form-urlencoded
Auth无需 token
Timeout15 秒建议值
Token TTL通常 30 天
字段类型必填说明示例
accountstring是用户名、邮箱或手机号,取决于后台账号配置。demo
passwordstring是登录密码。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 为准。

字段 类型 说明 处理建议
codenumber1 成功;0 普通业务失败;401 未登录;403 无权限。只在 code=1 时进入成功逻辑。
msgstring服务端提示信息,失败时通常包含可展示原因。可用于后台日志和用户提示。
timenumber服务端 Unix 时间戳,部分开放接口可能不返回。用于排查请求时间和日志对齐。
dataobject / 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 firsttoken 缺失、过期或被退出登录。重新登录获取 token。
无权限code=403账号权限、接口权限或资源归属不匹配。记录日志并联系管理员核对权限。
上游异常HTTP 5xx 或 code=0链上拥堵、资源不足或服务端短时异常。使用退避重试,避免高频重复下单。

下单前记录业务单号,提交后保存平台订单号及脱敏后的请求和响应。网络异常、超时或结果不明时,先在会员中心的接口订单列表核对,不要自动重复扣费或重复发能量。不要把密钥或 Token 写进日志。

旧版协议参考:本站未开放 /v1/userInfo 请求路由。新接入请使用密钥指南中的 /api/balance,实时余额请在账户信息中心核对;不要直接把本节路径拼接到本站域名。

Account

查询账户

用于读取用户基础信息、状态和余额。

GET POST /userInfo
URL/v1/userInfo
MethodGET / POST
Authusername
Use Case下单前余额校验
参数类型必填说明示例
usernamestring是平台用户账号,用于定位账户余额和状态。demo
请求示例
{
  "username": "demo"
}
响应示例
{
  "code": 1,
  "msg": "请求成功",
  "data": {
    "username": "demo",
    "status": "normal",
    "balance": "128.560000",
    "level": 1,
    "experience": 35,
    "apiKeyCount": 2
  }
}
响应字段类型说明
data.usernamestring账户名。
data.statusstring账户状态,常见为 normal,实际以后台返回为准。
data.balancestring / number账户余额。建议前端按字符串展示,服务端计算时转高精度数值。
data.levelnumber会员等级。
data.experiencenumber经验值或成长值。
失败响应
{
  "code": 0,
  "msg": "用户不存在或账户不可用",
  "data": null
}

旧版协议参考:本站未开放 /v1/config 请求路由。本站套餐和价格请在能量租赁页面及账户信息中心核对;仅在已取得单独旧版 API 地址时参考本节字段。

Pricing

查询价格等其他下单参数

在下单前读取价格、租用参数和其他业务配置。

GET POST /config
URL/v1/config
MethodGET / POST
Authusername
Use Case价格与下单参数
参数类型必填说明示例
usernamestring是平台用户账号,不同账号可能对应不同价格和权限。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.resTypesarray允许下单的资源类型,常见为 ENERGY 和 BANDWIDTH。
data.rentTimesarray允许的租用时长。前端应使用返回值渲染选项,不要硬编码。
data.energyOptionsarray推荐能量数量。实际可下单数量仍需以后端校验为准。
data.resLockOptionsarray资源锁定选项,0 不锁定,1 锁定。
data.priceobject价格相关配置。字段可能按账号权限扩展,接入方应保留未知字段。
失败响应
{
  "code": 0,
  "msg": "未找到账号配置",
  "data": null
}

Member APIs

登录后用户中心接口

这组接口适合会员中心、自有后台或代理系统使用。必须先通过登录接口获取 token,并在后续请求 Header 中传递。

Base URLhttps://haiou.io/api
Auth Headertoken: xxxxx
POST Formatapplication/x-www-form-urlencoded
Paginationpage=1
接口方法参数data 返回说明
/api/user/getuserinfoGET无balance、level、experience获取当前用户余额、等级和成长数据。
/api/user/getRechargeAddressGET无address获取当前用户专属充值地址。
/api/user/profilePOSTusername?、nickname?、address?、bio?、avatar?null更新个人资料;地址需为有效 TRON 地址。
/api/user/getAddressListGETpagelist 分页对象查询能量预设地址列表。
/api/user/addAddressPOST见地址字段规范null新增能量预设地址。
/api/user/editAddressPOSTid + 地址字段null编辑能量预设地址。
/api/user/getSfaddressListGETpagelist 分页对象查询转租地址列表。
/api/user/getApikeylistGETpagelist 分页对象查询 API Key 列表。
/api/user/generateApiKeyPOSTname,最长 255 个字符user_id、name、key生成 API Key,每账户最多 5 个;不会返回记录 id。
/api/user/deleteApiKeyPOSTidnull删除本人密钥,生效后不可继续使用。
/api/user/getEnergylistGETpage、keyword?、status?、startTime?、endTime?list 分页对象查询能量订单,支持状态和时间过滤。
/api/user/getPaylistGETpagelist 分页对象查询账户收支流水。
/api/user/getPromotionClientsGETpageinum、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

租用资源下单用户名密码版

适合人工业务系统或需要直接走账号密码的接入方式。

POST /pay
URL/v1/pay
MethodPOST
Authusername + password
Idempotency保存 orderId 后回查
参数类型必填约束说明
usernamestring是已注册账号用户名。
passwordstring是账号密码用户密码。生产环境不推荐长期使用该模式。
resTypestring是ENERGY / BANDWIDTH资源类型。
payNumsstring / number是正整数,常见 32000、65000、130000租用数量。
rentTimestring / number是按配置接口返回值提交租用时长。
resLockstring / number是0 或 10 不锁定,1 锁定。
receiveAddressstring是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.orderIdstring / number平台订单号,必须落库保存。
data.balancestring / number下单后的账户余额。
data.orderMoneystring / number本次订单扣费金额。
data.statusstring订单状态,创建成功后可能仍处于处理中,应继续回查。
失败响应
{
  "code": 0,
  "msg": "余额不足",
  "data": {
    "balance": "0.320000",
    "required": "2.170000"
  }
}

用户名密码版会暴露账号密码给调用服务,仅供已有旧版服务接入方参考。本站商业系统请使用 /api/send 和 API Key。

Recommended

使用 API Key 租赁能量

从业务服务器提交一笔能量租赁订单。请先在密钥管理中心生成 API Key,确认余额及接收地址后再执行。

POST /api/send
URL/api/send
MethodPOST
Auth请求体 apikey
Recommended服务端生产接入
参数类型必填约束说明
apikeystring是密钥管理中心生成的完整值只保存在服务端,不使用名称、掩码或登录 Token。
energyAmountnumber是套餐允许范围内的正整数申请的能量数量,示例 65000;不代表所有转账都只需此数量。
rentTimenumber是单位:小时,示例 1租用时长,必须为账户当前支持的规格。
resLockstring / number是0 或 1资源锁定。多数临时转账场景用 0。
receiveAddressstring是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.orderIdstring / number平台订单号。必须保存,用于回查订单状态和对账。
data.balancestring / number接口返回的余额字段,实时可用余额以账户信息中心为准。
data.orderMoneystring / number本次订单金额。
data.hashstring创建响应可能为空,不应据此判断能量到账;提交成功不代表链上最终完成。
cURL 示例
# 会创建真实订单并可能扣费。确认余额、租用规格及接收地址后执行一次。
# 先将 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 查询订单详情,适合在下单后轮询订单状态或回查业务结果。

POST /orderData
URL/v1/orderData
MethodPOST
Authusername + orderId
Polling3-5 秒间隔
参数类型必填说明示例
usernamestring是用户名。demo
orderIdstring / 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.orderIdstring / number平台订单号。
data.statusstring订单状态,常见值可按 processing、success、failed 兼容处理,实际以返回为准。
data.statusTextstring订单状态中文说明,可用于后台展示。
data.txidstring链上交易哈希。部分处理中或失败订单可能为空。
data.finishedAtstring完成时间。未完成时可能为空。
失败响应
{
  "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 示例重复下单
完整 Node.js / Axios 示例
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
}
完整 Python / requests 示例
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 脱敏;结果不明不自动重下单