Skip to content

创建收款地址 — createAddress

为一笔商户订单创建(或获取)一个链上收款地址。用户向该地址转账后,平台确认到账并通过充值到账回调通知你。

POST https://api.anonypay.io/api/merchant/createAddress
  • 请求体为业务 JSON 经 RSA-OAEP 加密后的 Base64 密文,并需携带全套签名头 ANONY-APP-ID / ANONY-TOKEN / ANONY-TIMESTAMP / ANONY-NONCE / ANONY-SIGN,详见协议规范
  • ANONY-TOKEN 通过 getToken 获取。
  • 响应统一为 { "code": 10000, "data": "<加密密文>", "message": "success" }data 需验签后解密;code != 10000 表示失败,message 为原因。

TRON 链 USDC 充值已关闭

trx 类型地址请只用于收取 TRX / TRC20-USDT。TRON 链上的 USDC 充值已关闭:转入 TRON-USDC 到账不入账、不触发回调,资金无法自动记账。请勿引导用户向 trx 地址转入 USDC。

请求参数

字段类型必填说明
userOrderstring商户订单号(唯一;重复调用返回同一地址)
addressTypestring地址类型,见下方枚举
callbackUrlstring该地址的回调地址;不传则用商户默认回调地址

addressType 枚举

说明
trxTRON收 TRX / TRC20-USDT(USDC 充值已关闭,见上方警告)
btcBitcoin预留 / 待接入;正式公告前不要在生产收银台开放
solanaSolana收 SOL / SPL 资产(USDT、USDC)
eth_bnbEthereum + BSC一个地址同时收 ETH 与 BSC 两条链的资产
tonTON收 TON / TON-USDT

充值支持的币种符号(回调与查询接口中的 currency):trx trx.usdt eth eth.usdt eth.usdc solana solana.usdt solana.usdc bnb bnb.usdt bnb.usdc ton ton.usdt

响应字段(解密后)

字段类型说明
addressstring收款地址
apiOrderstring平台订单号
addressDatasarray为多地址链预留的字段,当前通常为空

响应 JSON 样例data 验签解密后的内容):

json
{
  "address": "T*********************************",
  "addressDatas": null,
  "apiOrder": "平台生成的订单号"
}

幂等与实现细节

  • 幂等键是 (userOrder, 商户号):同一 userOrder 重复调用不会新建地址,直接返回原地址。若重复调用时传入的 callbackUrl 与旧值不同,平台会将该地址的回调地址更新为新值
  • callbackUrl 有 SSRF 校验:内网/环回等非法地址会被拒绝,报 invalidCallbackUrl。请填公网可达的 HTTPS 地址。
  • 地址来自平台地址池:若对应链的地址池暂时无库存,会报 createAddressFailed。这是平台侧问题,与你的请求无关,稍后重试即可;持续失败请联系平台。
  • eth_bnb 地址同时收 ETH 与 BSC 资产:无需为两条链分别建地址,回调中以 currency 区分具体币种。
  • ton 地址会被转换为 raw 格式进入扫链:对账时请注意 TON 地址存在多种等价表示形式,勿按字符串全等比对不同格式的同一地址。

调用示例

php
require 'AnonyV2Client.php';
$client = new AnonyV2Client($appId, $serverPublicKeyB64, $merchantPrivateKeyB64);
$token  = $client->getToken($secret);  // 自动 md5 鉴权 + 验签解密取出 token
$res = $client->post('createAddress', ['userOrder'=>'A1001','addressType'=>'trx'], $token);
// $res['data'] 已自动验签+解密:{ address, addressDatas, apiOrder }
python
from anony_v2 import AnonyV2Client
import requests

c = AnonyV2Client(app_id, server_pub_b64, merchant_priv_b64)

req = c.build_request({"userOrder": "A1001", "addressType": "trx"}, token)
r = requests.post(c.base_url + "createAddress", data=req["body"], headers=req["headers"])
body = r.json()
if body["code"] == 10000:
    data = c.verify_response(body["data"], r.headers["ANONY-TIMESTAMP"],
                             r.headers["ANONY-NONCE"], r.headers["ANONY-SIGN"])
    # data = { address, addressDatas, apiOrder }
js
const { AnonyV2Client } = require('./anony_v2');
const c = new AnonyV2Client(appId, serverPubB64, merchantPrivB64);
const token = await c.getToken(secret); // Node ≥18
const req = c.buildRequest({ userOrder: 'A1001', addressType: 'trx' }, token);
const r = await fetch(c.baseUrl + 'createAddress', { method: 'POST', body: req.body, headers: req.headers });
const body = await r.json();
if (body.code === 10000) {
  const data = c.verifyResponse(body.data, r.headers.get('anony-timestamp'),
    r.headers.get('anony-nonce'), r.headers.get('anony-sign'));
  // data = { address, addressDatas, apiOrder }
}

各语言 SDK 的获取与初始化见 SDK 总览

相关错误码

失败时外层 code = 9999message 为下列之一(完整列表见错误码):

message说明处理建议
paramError参数错误(缺必填字段、格式不对、body 超长等)检查 userOrder / addressType 是否按本页要求传递
invalidCallbackUrl回调地址非法(SSRF 校验不通过,如内网地址)换成公网可达的回调地址
addressTypeErroraddressType 当前未开放请使用 trx / solana / eth_bnb / tonbtc 为预留值,Bitcoin 正式开放前不要使用
createAddressFailed地址池无库存,创建失败平台侧问题,稍后重试;持续失败联系平台

签名/鉴权类错误(signatureFailed / tokenExpired 等)与本接口无关,属协议层问题,见排障指南

下一步