基础概念
商户在商户后台获取 merchantNo、apiSecret、回调地址,并按币种/链路使用 coinType 区分监听与结算。
提示:接口(
/api/**、/pay/**)统一使用同一套签名算法(SHA256)。coinType 约定
- TRON(TRC20):
USDT-TRC20、USDC-TRC20 - 以太坊(ERC20):
ETH、USDT-ERC20、USDC-ERC20 - 比特币:
BTC
签名规则(SHA256)
接口请求参数中加入 timestamp(毫秒),再按 key 字典序排序拼接,最后追加 key=apiSecret 计算 SHA256 得到 sign。
k1=v1&k2=v2&...×tamp=1710000000000&key=apiSecret
SHA256(hex) -> sign
注意:参与签名的业务参数不包含
sign 本身。常用接口
POST /api/address/create创建收款地址(merchantNo、coinType、timestamp、sign)POST /api/order/create创建订单(merchantNo、amount、coinType、notifyUrl 可选、timestamp、sign)POST /api/order/query查询订单(merchantNo、orderNo、timestamp、sign)
回调验签
平台向商户回调地址发送 body:包含 merchantNo、amount、txHash、fromAddress、coinType、orderNo(若可关联)、以及 timestamp/sign。
商户侧验签同样使用签名规则(用你的
apiSecret 重新计算 sign 并比对)。Java 示例
下载示例文件:UsdtPaySDK.java
Map<String, String> params = new HashMap<>();
params.put("merchantNo", merchantNo);
params.put("amount", "100");
params.put("coinType", "USDT-TRC20");
params.put("timestamp", String.valueOf(System.currentTimeMillis()));
String sign = UsdtPaySDK.generateSign(params, apiSecret);
params.put("sign", sign);
String resp = UsdtPaySDK.postJson(apiBaseUrl + "/api/order/create", params);
PHP 示例
下载示例文件:UsdtPaySDK.php
$params = [
"merchantNo" => $merchantNo,
"amount" => "100",
"coinType" => "USDT-TRC20",
"timestamp" => (string) round(microtime(true) * 1000),
];
$params["sign"] = UsdtPaySDK::generateSign($params, $apiSecret);
$resp = UsdtPaySDK::postJson($apiBaseUrl . "/api/order/create", $params);
C# 示例
下载示例文件:UsdtPaySDK.cs
// body 反序列化得到字典 data
// 取出 sign 后从参与签名字段移除
string sign = data["sign"];
data.Remove("sign");
string calc = UsdtPaySDK.GenerateSign(data, apiSecret);
if (!string.Equals(sign, calc, StringComparison.OrdinalIgnoreCase)) {
throw new Exception("invalid sign");
}