其他
币种查询
$url = "http://api.xxxx.com/shopapi/coin/list";
$header = [
'Content-Type:application/json',
];
$params = [
"app_id" => "hxgmau9imt86qky9",
"version" => "1.0",
"time" => 1579004943,
"coin" => "eth",
"chain" => "eth",
"page" => 1,
"page_size" => 20,
"sign" => "dLtK+uiPcnxt2ACKMbBqQ6wI5ttAvesOHzK5ybVID1R6hqYPDTkagl7Tsjr5iLJafehcSLTZyJLtCRI8O2CtIWQUUroGXBneHZC486NUi/4FMOQs0FaAgm17pWlbhX5/96cWXXXMVeoe3IZFKaFNYSWaA14v3RcdDU6QDE/9ixGiSJ0DIxm9NKA0+RkbIFbyYeuFn8d63OcjmUhv7tsOE6rKCc3Q2yi7Qe9i6BNAQFYMFATztb18MsxsBHKUxNqklqyVnl0ofETAHmQhfOHLmungOJQnOqAAuwfmRtg50Qci5F+R2mXeqjmIXko/u3E+DLYW1ygDBp3afKZmU4PwmA=="
];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
$return = curl_exec($ch);
print_r($return);
var url = "http://api.xxxx.com/shopapi/coin/list"
data := map[string]string{
"version": "1.0",
"app_id":"hxgmau9imt86qky9",
"time":"1579004943",
"coin":"eth",
"chain":"eth",
"page":"1",
"page_size":"20",
"sign":"IUtWA3HEkK+wvTGaSBYwIrdx+ANyoOPl2/1LQTDevCSTxf4/lDXPrg6/ph+skNXIbZTR8Qs2yGGkqTUHEW/vbiTPzWkYZ874rRgplp06vhOBM/Pkw289K7PVCKy1ksOtLjwj1dUfDD/2AEqTgxRDjGyn+yDWRa7HLL/28bjU3pZoFwPPjbPyRxMK9BVL/li9IQ6hb8lyOyQNHNxS3C82sDVaQKqrB0dOqtP61OH0hBonrxMhBAMD8dUmaqO6Ef+bhHzbBm3BCC5VapkOkdthb+UWXKCiBoCipg3gqrwnBdOUGXqx/1mYicNZ+oHeVpBwnJlXudff6FT+HySszr5ISw==",
}
dataType, _ := json.Marshal(data)
resp, err := http.Post(url, "application/json", strings.NewReader(string(dataType)))
if err != nil {
fmt.Println(err)
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println(err)
}
fmt.Println(string(body))
let HTTP = require('http')
let postData = {
"version": "1.0",
"app_id":"hxgmau9imt86qky9",
"time":"1579004943",
"coin":"eth",
"chain":"eth",
"page":"1",
"page_size":"20",
"sign":"IUtWA3HEkK+wvTGaSBYwIrdx+ANyoOPl2/1LQTDevCSTxf4/lDXPrg6/ph+skNXIbZTR8Qs2yGGkqTUHEW/vbiTPzWkYZ874rRgplp06vhOBM/Pkw289K7PVCKy1ksOtLjwj1dUfDD/2AEqTgxRDjGyn+yDWRa7HLL/28bjU3pZoFwPPjbPyRxMK9BVL/li9IQ6hb8lyOyQNHNxS3C82sDVaQKqrB0dOqtP61OH0hBonrxMhBAMD8dUmaqO6Ef+bhHzbBm3BCC5VapkOkdthb+UWXKCiBoCipg3gqrwnBdOUGXqx/1mYicNZ+oHeVpBwnJlXudff6FT+HySszr5ISw==",
};
let POST_OPTIONS = {
port: 80,
host: "api.xxxx.com",
path: "/shopapi/coin/list",
method: 'POST',
headers: {
"Content-Type": "application/json; charset=utf-8"
}
};
const REQUEST = HTTP.request(POST_OPTIONS,function (res) {
let data = []
res.on('data', chunk => {
data.push(...chunk)
})
res.on('end', () => {
let _date = JSON.parse( new TextDecoder().decode(new Uint8Array(data)))
console.log(_date)
})
});
REQUEST.setTimeout(6000)
REQUEST.write(JSON.stringify(postData), 'utf8')
REQUEST.end()
public static void main(String[] args) {
// 完整实例请查看"签名规则"中的Java示例代码
String baseUrl = "http://api.xxxx.com/shopapi";
String priKey = "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCtdgvcfozY7fe/x6UlXR/Fff8+wX++CiG05YVRafDe90O8y5KJAMZ156TgajEUXSRyKZqASz7iVoMAcu5FqfK1KuOOdjTAg0LFe/twIZvKmAqHcCSS2pjUXk0fTpZEgQ5lmDCK12Mg07YXvr+BeHjF+kBpwRJMPMG/+DGBDYNFNeRSJqWyopt6yyF528soAykHIUQ7TTultJV5IPCrvjRQQrGdJ/QtCdE0vZg+tA09nFN7AqgraU99kIvzyS0sqysj+pP1SJRmTRSGtlVAO3mILfkXOekZl1KD60G7CF+7BIaaW83FPD55tZhAGhnbLMYyiq7OiIyU61LTRcNSaJ0tAgMBAAECggEBAIGgGKcSzxCBbMYdXLV6TPbZ/HeaRGrwyVWUu7cmc0E8CJu6iWvmb2jGzbiCwuCT5luF6ZZ8JKchvU4FlTfsE5r9TQY2IZ/Ht4s65qBaDUEts5iY3kv8HX9+ZSXDJZpV0ztqqsPmx4ZNj+NYwWXwcFiKdb5R8OmV8bgSsnPddD6wFhwewglUOBPRAjropHE4sqk1Vam6q1MlFq5kiekMn/CItyFYFFzST/ruqAtVTp7YIvazAMrfCKH+pvXWk6pYNHZmL/JZey0GglRyJ1nItiqL33X8Lji056FcbAclidq022h/KPLEJpZk6irWqYdqYZeF6YMLHtdZFDkTZ/hXY+UCgYEA5i794UTQ1Kd6K+iui/S8K5H8nGdiXb3+uZ5j5VKYfbRmzXhAdVYisYe8czeTECxhH+MeHgM4tLR4ifx9q60ylvZxl9Fav1p6EaE36YcvGVmpm7Gm3q6QDDBa4gB+X9u7CxCS4LpotV917YS1QvOIF9lnRonSj1zNzFtbXkywrN8CgYEAwOpx/mR40ZvgZxNCq9DsIdrSZYAFFKpw0xy0OtF1PpuwMaREoRabnlVw6Bb3Hofg50XA3JxemzAX6fB92ee+NfXfeL4UtC4vG1K9JyiXHtHq8p9Uw2W03ehIEeNa3xdoRRnLmD4VUpyfL19ViE2+7TM1Gd3TogjDT+AMOCSuq3MCgYBsurPH7gaq/LVT+mRAzgj4l8v4YUlwuGeTbIMJdvt7HXUWB4CDLH3U2CYnUpAQKrZyJok6ahEmIr1xiKggKP7lmmHL8eNo0icpHrtXfzi7Q8Q/PCpzs4dtioXTjaIkS5nNvzVyG/uL+RyuZmpsxrZ5dYM4KbAhchfwORMutxEZhwKBgQC5zpVw4jCEItBmNuTWO+nTScGvxTgfiXIVw+XLaQa2AJoZlhAL34yPWdffko79tv3lgweY9HsimZXO2rU8dbp8mo5c6ydhy8HPXUeWOcAkDSdv/ApWENW9jgYsRIC3swHY3Fl+Dv3Wjce8huQI3mjwaYvRmBhIToxfmHnscVhTBQKBgB9uciEHfz8hMI7ePrPo2PkyK/RbJDm3HnuWE2lFBp7MOUMlh53MXwv4dIRaYMbRrFuN1UIKEFxuKhWwTHSzZJufk/UENrha/81fpj2BoFsAKkEunKeETvaIh6fZSjec16h2+zxbzwkdS6b+yIYkSlaoAxmDYrMtae0C8G4e0YS9";
String pubKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2RZZISModRzproL3eTxRtvVK/nToDbeLmAVdmaVtHgNCwjXMeNCZvHySZKO7+t7XySzBd2PhhQjvAkDd8HRKB5Y0uvP6TFwvhxOMkMydTeBFcUobQWNeAI7ttRms1txSNrmyrZr0WpWfk79VIsO+yI/jFN/Pj2gxD+vh5UUKU1LD2IQq/VxgtEpf8Vs6w7SvafPwYkpdPGCKUFkRvN1FrY2+tq0j1MRVJbB2rIunWDnT8cDUh2sWLXf4yNaJVOaaTFB0zbAk/qcoicGQyW7bVG7dVW8WywKmOAPeQCCQa+SJ4BhfI1k8eEAwFVRuxz/f9Ecfog9hZJ+RgELkpS8qhQIDAQAB";
rsaSigner signer = new rsaSigner();
Map<String, Object> params = new HashMap<>();
params.put("app_id", "hxgmau9imt86qky9");
params.put("version", "1.0");
params.put("key_version", "admin");
params.put("time", Long.toString(System.currentTimeMillis() / 1000));
params.put("coin","eth");
params.put("chain","eth");
params.put("page","1");
params.put("page_size","20");
try {
params.put("sign", signer.genSign(params, priKey));
Gson gson = new GsonBuilder().create();
System.out.println("params = " + gson.toJson(params));
String res = doPost(baseUrl + "/coin/list", gson.toJson(params));
if (null == res) {
throw new RuntimeException("http error");
}
System.out.println("response = " + res);
JsonParser jp = new JsonParser();
JsonObject resEle = jp.parse(res).getAsJsonObject();
boolean retSignOK = signer.verifySign(resEle, resEle.get("sign").getAsString(), pubKey);
if (!retSignOK) {
throw new RuntimeException("verify response sign fail");
}
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("OK");
}
返回结果示例:
{
"status": 200,
"msg": "处理成功",
"data": {
"page": 1,
"max_page": 2,
"count": 20,
"list": [
{
"coin": "eth",
"chain": "eth",
"contract_address": "",
"status": "1",
"open_in": 1,
"open_out": 1,
"open_address": "1",
"confirm_count": "6",
"min_transfer_in_amount": "0.00000001",
"min_transfer_out_amount": "0"
},
{
"coin": "hc",
"chain": "hc",
"contract_address": "",
"status": "1",
"open_in": 1,
"open_out": 1,
"open_address": "1",
"confirm_count": "1",
"min_transfer_in_amount": "0",
"min_transfer_out_amount": "0.0001"
},
……
]
},
"date_time": "2020-08-04 15:19:56",
"time_stamp": 1596525596,
"sign": "OD3xNGUDAsR0G9IXH6JIAJIrzU5rftHQLQT9qSe5qBqO9hDp+LXE2vJ5AAMqZoX6YNeeJy0tQUBM6aF/OIl6czKr520Y6xOhYvagw5Ip3iyOARZordlUhGR+KmJq3BFarxsiTL01bWQOPIz9v3CY4s0xgkl/nL6ZeNn9woDqw50vaDPSNC/tB9Qb/yFZdOI5npFipTRvxGFh2/EVH+1STlDjWyVPAnri26YEbob3xtSkCZP6894ScRW8ps/+7EW8FCKlhg/39XuysyNtMKt9rT5+yHzuDe/1oJZ9r5zTV8pDs2D3SjPWVLT1naMLhNFH0TLGUcgOneNjG6aMzWb9WA=="
}
商家支持币种查询接口
HTTP Request
POST: /coin/list
请求参数
| 参数名 | 必选 | 类型 | 说明 |
|---|---|---|---|
| 公共参数 | 是 | string | 公参指:签名(sign)、版本(version)、商户ID(app_id)、时间(time) |
| coin | 否 | varchar | 币名(如:eth) |
| chain | 否 | varchar | 主链名(查询 主链及其代币,如:eth) |
| page | 否 | int,默认值为1 | 1<= N <=Max, N>Max ? N=Max ; N<1 ? N=1 |
| page_size | 否 | int | 每页数量 (20 ~500),默认 20 |
返回参数说明
| 参数名 | 类型 | 说明 |
|---|---|---|
| status | int | 状态码 |
| msg | string | 状态描述 |
| data | jsonObject | 具体见下面 “data细节说明”。 |
| data.page | int | 第几页 |
| data.max_page | int | 总页数 |
| data.count | int | 当前页记录数 |
| data.list | jsonArray | 具体每条记录 |
| data.list.coin | string | 币种 |
| data.list.chain | string | 主链名 |
| data.list.status | int | 状态:1 开启;0 关闭 |
| data.list.open_in | int | 充值状态:1 开启;0 关闭 |
| data.list.open_out | int | 提现状态:1 开启;0 关闭 |
| data.list.open_address | int | 分配地址状态::1 开启;0 关闭 |
| data.list.confirm_count | int | 充值确认数(默认 6 实际入账以订单状态为准) |
| data.list.min_transfer_in_amount | string | 最小转入金额(0 表示不限制 ) |
| data.list.min_transfer_out_amount | string | 最小提现金额(0 表示不限制 ) |
| data.list.contract_address | string | 合约币种的合约地址 |
| date_time | string | 响应时间 |
| time_stamp | int | 无时区的秒 |
| sign | string | 签名 |
币价汇率
$url = "http://api.xxxx.com/shopapi/rate/index";
$header = [
'Content-Type:application/json',
];
$params = [
"app_id" => "hxgmau9imt86qky9",
"version" => "1.0",
"time" => 1579004943,
"source_coin" => "eth",
"target_coin" => "usdt",
"sign" => "dLtK+uiPcnxt2ACKMbBqQ6wI5ttAvesOHzK5ybVID1R6hqYPDTkagl7Tsjr5iLJafehcSLTZyJLtCRI8O2CtIWQUUroGXBneHZC486NUi/4FMOQs0FaAgm17pWlbhX5/96cWXXXMVeoe3IZFKaFNYSWaA14v3RcdDU6QDE/9ixGiSJ0DIxm9NKA0+RkbIFbyYeuFn8d63OcjmUhv7tsOE6rKCc3Q2yi7Qe9i6BNAQFYMFATztb18MsxsBHKUxNqklqyVnl0ofETAHmQhfOHLmungOJQnOqAAuwfmRtg50Qci5F+R2mXeqjmIXko/u3E+DLYW1ygDBp3afKZmU4PwmA=="
];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
$return = curl_exec($ch);
print_r($return);
var url = "http://api.xxxx.com/shopapi/rate/index"
data := map[string]string{
"app_id":"hxgmau9imt86qky9",
"version":"1.0",
"time":"1579004943",
"source_coin":"eth",
"target_coin":"usdt",
"sign":"IUtWA3HEkK+wvTGaSBYwIrdx+ANyoOPl2/1LQTDevCSTxf4/lDXPrg6/ph+skNXIbZTR8Qs2yGGkqTUHEW/vbiTPzWkYZ874rRgplp06vhOBM/Pkw289K7PVCKy1ksOtLjwj1dUfDD/2AEqTgxRDjGyn+yDWRa7HLL/28bjU3pZoFwPPjbPyRxMK9BVL/li9IQ6hb8lyOyQNHNxS3C82sDVaQKqrB0dOqtP61OH0hBonrxMhBAMD8dUmaqO6Ef+bhHzbBm3BCC5VapkOkdthb+UWXKCiBoCipg3gqrwnBdOUGXqx/1mYicNZ+oHeVpBwnJlXudff6FT+HySszr5ISw==",
}
dataType, _ := json.Marshal(data)
resp, err := http.Post(url, "application/json", strings.NewReader(string(dataType)))
if err != nil {
fmt.Println(err)
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println(err)
}
fmt.Println(string(body))
let HTTP = require('http')
let postData = {
"app_id":"hxgmau9imt86qky9",
"version":"1.0",
"time":"1579004943",
"source_coin":"eth",
"target_coin":"usdt",
"sign":"IUtWA3HEkK+wvTGaSBYwIrdx+ANyoOPl2/1LQTDevCSTxf4/lDXPrg6/ph+skNXIbZTR8Qs2yGGkqTUHEW/vbiTPzWkYZ874rRgplp06vhOBM/Pkw289K7PVCKy1ksOtLjwj1dUfDD/2AEqTgxRDjGyn+yDWRa7HLL/28bjU3pZoFwPPjbPyRxMK9BVL/li9IQ6hb8lyOyQNHNxS3C82sDVaQKqrB0dOqtP61OH0hBonrxMhBAMD8dUmaqO6Ef+bhHzbBm3BCC5VapkOkdthb+UWXKCiBoCipg3gqrwnBdOUGXqx/1mYicNZ+oHeVpBwnJlXudff6FT+HySszr5ISw==",
};
let POST_OPTIONS = {
port: 80,
host: "api.xxxx.com",
path: "/shopapi/rate/index",
method: 'POST',
headers: {
"Content-Type": "application/json; charset=utf-8"
}
};
const REQUEST = HTTP.request(POST_OPTIONS,function (res) {
let data = []
res.on('data', chunk => {
data.push(...chunk)
})
res.on('end', () => {
let _date = JSON.parse( new TextDecoder().decode(new Uint8Array(data)))
console.log(_date)
})
});
REQUEST.setTimeout(6000)
REQUEST.write(JSON.stringify(postData), 'utf8')
REQUEST.end()
public static void main(String[] args) {
// 完整实例请查看"签名规则"中的Java示例代码
String baseUrl = "http://api.xxxx.com/shopapi";
String priKey = "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCtdgvcfozY7fe/x6UlXR/Fff8+wX++CiG05YVRafDe90O8y5KJAMZ156TgajEUXSRyKZqASz7iVoMAcu5FqfK1KuOOdjTAg0LFe/twIZvKmAqHcCSS2pjUXk0fTpZEgQ5lmDCK12Mg07YXvr+BeHjF+kBpwRJMPMG/+DGBDYNFNeRSJqWyopt6yyF528soAykHIUQ7TTultJV5IPCrvjRQQrGdJ/QtCdE0vZg+tA09nFN7AqgraU99kIvzyS0sqysj+pP1SJRmTRSGtlVAO3mILfkXOekZl1KD60G7CF+7BIaaW83FPD55tZhAGhnbLMYyiq7OiIyU61LTRcNSaJ0tAgMBAAECggEBAIGgGKcSzxCBbMYdXLV6TPbZ/HeaRGrwyVWUu7cmc0E8CJu6iWvmb2jGzbiCwuCT5luF6ZZ8JKchvU4FlTfsE5r9TQY2IZ/Ht4s65qBaDUEts5iY3kv8HX9+ZSXDJZpV0ztqqsPmx4ZNj+NYwWXwcFiKdb5R8OmV8bgSsnPddD6wFhwewglUOBPRAjropHE4sqk1Vam6q1MlFq5kiekMn/CItyFYFFzST/ruqAtVTp7YIvazAMrfCKH+pvXWk6pYNHZmL/JZey0GglRyJ1nItiqL33X8Lji056FcbAclidq022h/KPLEJpZk6irWqYdqYZeF6YMLHtdZFDkTZ/hXY+UCgYEA5i794UTQ1Kd6K+iui/S8K5H8nGdiXb3+uZ5j5VKYfbRmzXhAdVYisYe8czeTECxhH+MeHgM4tLR4ifx9q60ylvZxl9Fav1p6EaE36YcvGVmpm7Gm3q6QDDBa4gB+X9u7CxCS4LpotV917YS1QvOIF9lnRonSj1zNzFtbXkywrN8CgYEAwOpx/mR40ZvgZxNCq9DsIdrSZYAFFKpw0xy0OtF1PpuwMaREoRabnlVw6Bb3Hofg50XA3JxemzAX6fB92ee+NfXfeL4UtC4vG1K9JyiXHtHq8p9Uw2W03ehIEeNa3xdoRRnLmD4VUpyfL19ViE2+7TM1Gd3TogjDT+AMOCSuq3MCgYBsurPH7gaq/LVT+mRAzgj4l8v4YUlwuGeTbIMJdvt7HXUWB4CDLH3U2CYnUpAQKrZyJok6ahEmIr1xiKggKP7lmmHL8eNo0icpHrtXfzi7Q8Q/PCpzs4dtioXTjaIkS5nNvzVyG/uL+RyuZmpsxrZ5dYM4KbAhchfwORMutxEZhwKBgQC5zpVw4jCEItBmNuTWO+nTScGvxTgfiXIVw+XLaQa2AJoZlhAL34yPWdffko79tv3lgweY9HsimZXO2rU8dbp8mo5c6ydhy8HPXUeWOcAkDSdv/ApWENW9jgYsRIC3swHY3Fl+Dv3Wjce8huQI3mjwaYvRmBhIToxfmHnscVhTBQKBgB9uciEHfz8hMI7ePrPo2PkyK/RbJDm3HnuWE2lFBp7MOUMlh53MXwv4dIRaYMbRrFuN1UIKEFxuKhWwTHSzZJufk/UENrha/81fpj2BoFsAKkEunKeETvaIh6fZSjec16h2+zxbzwkdS6b+yIYkSlaoAxmDYrMtae0C8G4e0YS9";
String pubKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2RZZISModRzproL3eTxRtvVK/nToDbeLmAVdmaVtHgNCwjXMeNCZvHySZKO7+t7XySzBd2PhhQjvAkDd8HRKB5Y0uvP6TFwvhxOMkMydTeBFcUobQWNeAI7ttRms1txSNrmyrZr0WpWfk79VIsO+yI/jFN/Pj2gxD+vh5UUKU1LD2IQq/VxgtEpf8Vs6w7SvafPwYkpdPGCKUFkRvN1FrY2+tq0j1MRVJbB2rIunWDnT8cDUh2sWLXf4yNaJVOaaTFB0zbAk/qcoicGQyW7bVG7dVW8WywKmOAPeQCCQa+SJ4BhfI1k8eEAwFVRuxz/f9Ecfog9hZJ+RgELkpS8qhQIDAQAB";
rsaSigner signer = new rsaSigner();
Map<String, Object> params = new HashMap<>();
params.put("app_id", "hxgmau9imt86qky9");
params.put("version", "1.0");
params.put("key_version", "admin");
params.put("time", Long.toString(System.currentTimeMillis() / 1000));
params.put("source_coin","eth");
params.put("target_coin","usdt");
try {
params.put("sign", signer.genSign(params, priKey));
Gson gson = new GsonBuilder().create();
System.out.println("params = " + gson.toJson(params));
String res = doPost(baseUrl + "/rate/index", gson.toJson(params));
if (null == res) {
throw new RuntimeException("http error");
}
System.out.println("response = " + res);
JsonParser jp = new JsonParser();
JsonObject resEle = jp.parse(res).getAsJsonObject();
boolean retSignOK = signer.verifySign(resEle, resEle.get("sign").getAsString(), pubKey);
if (!retSignOK) {
throw new RuntimeException("verify response sign fail");
}
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("OK");
}
返回结果示例:
{
"status":200,
"msg":"请求成功",
"data":{
"rate":"19490.64944834 "
},
"date_time":"2020-01-14 00:50:27",
"sign":"ib1gqr0E0gJ02yo3InXKcKGaPqIp+r1izMego+KMRvE0B4ZdkFGrLmOtxGStUBibGVMzJRGWppKyU4PzcK877AOEvQlSFiUI+hDL1z8WaZsWD3r3ykbPzU0uWo4U+6WQTpOEo1gJ/N2zJsdTRcMVgJMSC7LEAg7oib4se2NPFlw="
}
各种币对应usdt 的汇率(用于币价计算,不用于兑换,兑换请走兑换汇率接口)。目前支持(btc eth hc eos trx xrp)
HTTP Request
POST: /rate/index
请求参数
| 参数名 | 必选 | 类型 | 说明 |
|---|---|---|---|
| 公共参数 | 是 | string | 公参指:签名(sign)、版本(version)、商户ID(app_id)、时间(time) |
| source_coin | 是 | string | 兑换币 |
| target_coin | 是 | string | 目标币 目前只支持 usdt |
返回参数说明
| 参数名 | 类型 | 说明 |
|---|---|---|
| status | int | 状态码 |
| msg | string | 状态描述 |
| data | jsonObject | 具体见下面 “data细节说明”。 |
| data.rate | string | 汇率 如 1btc= 19490.64944834 usdt |
| date_time | string | 响应时间 |
| time_stamp | int | 无时区的秒 |
| sign | string | 签名 |
币种对法币价格汇率
$url = "http://api.xxxx.com/shopapi/rate/fiat_currency";
$header = [
'Content-Type:application/json',
];
$params = [
"app_id" => "hxgmau9imt86qky9",
"version" => "1.0",
"time" => 1579004943,
"source_coin" => "eth",
"target_currency" => "usd",
"sign" => "dLtK+uiPcnxt2ACKMbBqQ6wI5ttAvesOHzK5ybVID1R6hqYPDTkagl7Tsjr5iLJafehcSLTZyJLtCRI8O2CtIWQUUroGXBneHZC486NUi/4FMOQs0FaAgm17pWlbhX5/96cWXXXMVeoe3IZFKaFNYSWaA14v3RcdDU6QDE/9ixGiSJ0DIxm9NKA0+RkbIFbyYeuFn8d63OcjmUhv7tsOE6rKCc3Q2yi7Qe9i6BNAQFYMFATztb18MsxsBHKUxNqklqyVnl0ofETAHmQhfOHLmungOJQnOqAAuwfmRtg50Qci5F+R2mXeqjmIXko/u3E+DLYW1ygDBp3afKZmU4PwmA=="
];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
$return = curl_exec($ch);
print_r($return);
var url = "http://api.xxxx.com/shopapi/rate/fiat_currency"
data := map[string]string{
"app_id":"hxgmau9imt86qky9",
"version":"1.0",
"time":"1579004943",
"source_coin":"eth",
"target_currency":"usd",
"sign":"IUtWA3HEkK+wvTGaSBYwIrdx+ANyoOPl2/1LQTDevCSTxf4/lDXPrg6/ph+skNXIbZTR8Qs2yGGkqTUHEW/vbiTPzWkYZ874rRgplp06vhOBM/Pkw289K7PVCKy1ksOtLjwj1dUfDD/2AEqTgxRDjGyn+yDWRa7HLL/28bjU3pZoFwPPjbPyRxMK9BVL/li9IQ6hb8lyOyQNHNxS3C82sDVaQKqrB0dOqtP61OH0hBonrxMhBAMD8dUmaqO6Ef+bhHzbBm3BCC5VapkOkdthb+UWXKCiBoCipg3gqrwnBdOUGXqx/1mYicNZ+oHeVpBwnJlXudff6FT+HySszr5ISw==",
}
dataType, _ := json.Marshal(data)
resp, err := http.Post(url, "application/json", strings.NewReader(string(dataType)))
if err != nil {
fmt.Println(err)
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println(err)
}
fmt.Println(string(body))
let HTTP = require('http')
let postData = {
"app_id":"hxgmau9imt86qky9",
"version":"1.0",
"time":"1579004943",
"source_coin":"eth",
"target_currency":"usd",
"sign":"IUtWA3HEkK+wvTGaSBYwIrdx+ANyoOPl2/1LQTDevCSTxf4/lDXPrg6/ph+skNXIbZTR8Qs2yGGkqTUHEW/vbiTPzWkYZ874rRgplp06vhOBM/Pkw289K7PVCKy1ksOtLjwj1dUfDD/2AEqTgxRDjGyn+yDWRa7HLL/28bjU3pZoFwPPjbPyRxMK9BVL/li9IQ6hb8lyOyQNHNxS3C82sDVaQKqrB0dOqtP61OH0hBonrxMhBAMD8dUmaqO6Ef+bhHzbBm3BCC5VapkOkdthb+UWXKCiBoCipg3gqrwnBdOUGXqx/1mYicNZ+oHeVpBwnJlXudff6FT+HySszr5ISw==",
};
let POST_OPTIONS = {
port: 80,
host: "api.xxxx.com",
path: "/shopapi/rate/fiat_currency",
method: 'POST',
headers: {
"Content-Type": "application/json; charset=utf-8"
}
};
const REQUEST = HTTP.request(POST_OPTIONS,function (res) {
let data = []
res.on('data', chunk => {
data.push(...chunk)
})
res.on('end', () => {
let _date = JSON.parse( new TextDecoder().decode(new Uint8Array(data)))
console.log(_date)
})
});
REQUEST.setTimeout(6000)
REQUEST.write(JSON.stringify(postData), 'utf8')
REQUEST.end()
public static void main(String[] args) {
// 完整实例请查看"签名规则"中的Java示例代码
String baseUrl = "http://api.xxxx.com/shopapi";
String priKey = "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCtdgvcfozY7fe/x6UlXR/Fff8+wX++CiG05YVRafDe90O8y5KJAMZ156TgajEUXSRyKZqASz7iVoMAcu5FqfK1KuOOdjTAg0LFe/twIZvKmAqHcCSS2pjUXk0fTpZEgQ5lmDCK12Mg07YXvr+BeHjF+kBpwRJMPMG/+DGBDYNFNeRSJqWyopt6yyF528soAykHIUQ7TTultJV5IPCrvjRQQrGdJ/QtCdE0vZg+tA09nFN7AqgraU99kIvzyS0sqysj+pP1SJRmTRSGtlVAO3mILfkXOekZl1KD60G7CF+7BIaaW83FPD55tZhAGhnbLMYyiq7OiIyU61LTRcNSaJ0tAgMBAAECggEBAIGgGKcSzxCBbMYdXLV6TPbZ/HeaRGrwyVWUu7cmc0E8CJu6iWvmb2jGzbiCwuCT5luF6ZZ8JKchvU4FlTfsE5r9TQY2IZ/Ht4s65qBaDUEts5iY3kv8HX9+ZSXDJZpV0ztqqsPmx4ZNj+NYwWXwcFiKdb5R8OmV8bgSsnPddD6wFhwewglUOBPRAjropHE4sqk1Vam6q1MlFq5kiekMn/CItyFYFFzST/ruqAtVTp7YIvazAMrfCKH+pvXWk6pYNHZmL/JZey0GglRyJ1nItiqL33X8Lji056FcbAclidq022h/KPLEJpZk6irWqYdqYZeF6YMLHtdZFDkTZ/hXY+UCgYEA5i794UTQ1Kd6K+iui/S8K5H8nGdiXb3+uZ5j5VKYfbRmzXhAdVYisYe8czeTECxhH+MeHgM4tLR4ifx9q60ylvZxl9Fav1p6EaE36YcvGVmpm7Gm3q6QDDBa4gB+X9u7CxCS4LpotV917YS1QvOIF9lnRonSj1zNzFtbXkywrN8CgYEAwOpx/mR40ZvgZxNCq9DsIdrSZYAFFKpw0xy0OtF1PpuwMaREoRabnlVw6Bb3Hofg50XA3JxemzAX6fB92ee+NfXfeL4UtC4vG1K9JyiXHtHq8p9Uw2W03ehIEeNa3xdoRRnLmD4VUpyfL19ViE2+7TM1Gd3TogjDT+AMOCSuq3MCgYBsurPH7gaq/LVT+mRAzgj4l8v4YUlwuGeTbIMJdvt7HXUWB4CDLH3U2CYnUpAQKrZyJok6ahEmIr1xiKggKP7lmmHL8eNo0icpHrtXfzi7Q8Q/PCpzs4dtioXTjaIkS5nNvzVyG/uL+RyuZmpsxrZ5dYM4KbAhchfwORMutxEZhwKBgQC5zpVw4jCEItBmNuTWO+nTScGvxTgfiXIVw+XLaQa2AJoZlhAL34yPWdffko79tv3lgweY9HsimZXO2rU8dbp8mo5c6ydhy8HPXUeWOcAkDSdv/ApWENW9jgYsRIC3swHY3Fl+Dv3Wjce8huQI3mjwaYvRmBhIToxfmHnscVhTBQKBgB9uciEHfz8hMI7ePrPo2PkyK/RbJDm3HnuWE2lFBp7MOUMlh53MXwv4dIRaYMbRrFuN1UIKEFxuKhWwTHSzZJufk/UENrha/81fpj2BoFsAKkEunKeETvaIh6fZSjec16h2+zxbzwkdS6b+yIYkSlaoAxmDYrMtae0C8G4e0YS9";
String pubKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2RZZISModRzproL3eTxRtvVK/nToDbeLmAVdmaVtHgNCwjXMeNCZvHySZKO7+t7XySzBd2PhhQjvAkDd8HRKB5Y0uvP6TFwvhxOMkMydTeBFcUobQWNeAI7ttRms1txSNrmyrZr0WpWfk79VIsO+yI/jFN/Pj2gxD+vh5UUKU1LD2IQq/VxgtEpf8Vs6w7SvafPwYkpdPGCKUFkRvN1FrY2+tq0j1MRVJbB2rIunWDnT8cDUh2sWLXf4yNaJVOaaTFB0zbAk/qcoicGQyW7bVG7dVW8WywKmOAPeQCCQa+SJ4BhfI1k8eEAwFVRuxz/f9Ecfog9hZJ+RgELkpS8qhQIDAQAB";
rsaSigner signer = new rsaSigner();
Map<String, Object> params = new HashMap<>();
params.put("app_id", "hxgmau9imt86qky9");
params.put("version", "1.0");
params.put("key_version", "admin");
params.put("time", Long.toString(System.currentTimeMillis() / 1000));
params.put("source_coin","eth");
params.put("target_currency","usd");
try {
params.put("sign", signer.genSign(params, priKey));
Gson gson = new GsonBuilder().create();
System.out.println("params = " + gson.toJson(params));
String res = doPost(baseUrl + "/rate/fiat_currency", gson.toJson(params));
if (null == res) {
throw new RuntimeException("http error");
}
System.out.println("response = " + res);
JsonParser jp = new JsonParser();
JsonObject resEle = jp.parse(res).getAsJsonObject();
boolean retSignOK = signer.verifySign(resEle, resEle.get("sign").getAsString(), pubKey);
if (!retSignOK) {
throw new RuntimeException("verify response sign fail");
}
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("OK");
}
返回结果示例:
{
"status":200,
"msg":"请求成功",
"data":{
"rate":"2166.81",
"source_coin": "eth",
"target_currency": "usd"
},
"date_time":"2020-01-14 00:50:27",
"sign":"ib1gqr0E0gJ02yo3InXKcKGaPqIp+r1izMego+KMRvE0B4ZdkFGrLmOtxGStUBibGVMzJRGWppKyU4PzcK877AOEvQlSFiUI+hDL1z8WaZsWD3r3ykbPzU0uWo4U+6WQTpOEo1gJ/N2zJsdTRcMVgJMSC7LEAg7oib4se2NPFlw="
}
HTTP Request
POST: /rate/fiat_currency
请求参数
| 参数名 | 必选 | 类型 | 说明 |
|---|---|---|---|
| 公共参数 | 是 | string | 公参指:签名(sign)、版本(version)、商户ID(app_id)、时间(time) |
| source_coin | 是 | string | 待换算数字货币币名 |
| target_currency | 是 | string | 目标法币,默认usd。支持usd,cny,aed,sgd,jpy,krw等。 |
返回参数说明
| 参数名 | 类型 | 说明 |
|---|---|---|
| status | int | 状态码 |
| msg | string | 状态描述 |
| data | jsonObject | 具体见下面 “data细节说明”。 |
| data.rate | string | 汇率价格 如 1eth= 2166.81 usd |
| data.source_coin | string | 待换算数字货币币名 |
| data.target_currency | string | 目标法币 |
| date_time | string | 响应时间 |
| time_stamp | int | 无时区的秒 |
| sign | string | 签名 |
归集手续费计算
$url = "http://api.xxxx.com/shopapi/balance/transactionFee";
$header = [
'Content-Type:application/json',
];
$params = [
"version" => "1.0",
"app_id" => "hxgmau9imt86qky9",
"time" => "1578736053",
"sign" => "OTA8utI8y8G93p7RPCyb4qIilFQ0B4Aq4iUjhaXWK9m2kgektqlHOASDKXT2VE7NPNysrGycYlVfjDR2WGZn1G66phHo3qa9CcCNpG9klOBEuBEMjiVbb/d8AXcxEzvQr9OCwNsikyxonyzLiY/lsNHeGm9cC5eRvlNLdUSVBipH+ajPd0lDHCayZPs1eCMfbm/xnf8e2lfy6z0UPOpHGfyX/0+hz99Ir5Xnx+0sBBzyZZJxKm4ROid5aDv/9m9guILpURae+Yw/IrkYF4uAKGX+/44cBvtTRQSdX76CAOBSiywZa6BAgDYBLRtkAPM+i+vwNzFBovqHUvI+4Ponaw==",
"coin" => "eth"
];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
$return = curl_exec($ch);
print_r($return);
var url = "http://api.xxxx.com/shopapi/balance/transactionFee"
data := map[string]string{
"version": "1.0",
"app_id": "hxgmau9imt86qky9",
"time": "1578736053",
"sign": "OTA8utI8y8G93p7RPCyb4qIilFQ0B4Aq4iUjhaXWK9m2kgektqlHOASDKXT2VE7NPNysrGycYlVfjDR2WGZn1G66phHo3qa9CcCNpG9klOBEuBEMjiVbb/d8AXcxEzvQr9OCwNsikyxonyzLiY/lsNHeGm9cC5eRvlNLdUSVBipH+ajPd0lDHCayZPs1eCMfbm/xnf8e2lfy6z0UPOpHGfyX/0+hz99Ir5Xnx+0sBBzyZZJxKm4ROid5aDv/9m9guILpURae+Yw/IrkYF4uAKGX+/44cBvtTRQSdX76CAOBSiywZa6BAgDYBLRtkAPM+i+vwNzFBovqHUvI+4Ponaw==",
"coin": "eth",
}
dataType, _ := json.Marshal(data)
resp, err := http.Post(url, "application/json", strings.NewReader(string(dataType)))
if err != nil {
fmt.Println(err)
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println(err)
}
fmt.Println(string(body))
let http = require('http');
let postData = {
"version": "1.0",
"app_id": "hxgmau9imt86qky9",
"time": "1578736053",
"sign": "OTA8utI8y8G93p7RPCyb4qIilFQ0B4Aq4iUjhaXWK9m2kgektqlHOASDKXT2VE7NPNysrGycYlVfjDR2WGZn1G66phHo3qa9CcCNpG9klOBEuBEMjiVbb/d8AXcxEzvQr9OCwNsikyxonyzLiY/lsNHeGm9cC5eRvlNLdUSVBipH+ajPd0lDHCayZPs1eCMfbm/xnf8e2lfy6z0UPOpHGfyX/0+hz99Ir5Xnx+0sBBzyZZJxKm4ROid5aDv/9m9guILpURae+Yw/IrkYF4uAKGX+/44cBvtTRQSdX76CAOBSiywZa6BAgDYBLRtkAPM+i+vwNzFBovqHUvI+4Ponaw==",
"coin": "eth",
};
let options = {
hostname: 'api.xxxx.com',
port: 80,
path: '/shopapi/balance/transactionFee',
method: 'POST',
headers: {
'Content-Type': 'application/json'
}
};
const REQUEST = HTTP.request(POST_OPTIONS,function (res) {
let data = []
res.on('data', chunk => {
data.push(...chunk)
})
res.on('end', () => {
let _date = JSON.parse( new TextDecoder().decode(new Uint8Array(data)))
console.log(_date)
})
});
REQUEST.setTimeout(6000)
REQUEST.write(JSON.stringify(postData), 'utf8')
REQUEST.end()
public static void main(String[] args) {
// 完整实例请查看"签名规则"中的Java示例代码
String baseUrl = "http://api.xxxx.com/shopapi";
String priKey = "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCtdgvcfozY7fe/x6UlXR/Fff8+wX++CiG05YVRafDe90O8y5KJAMZ156TgajEUXSRyKZqASz7iVoMAcu5FqfK1KuOOdjTAg0LFe/twIZvKmAqHcCSS2pjUXk0fTpZEgQ5lmDCK12Mg07YXvr+BeHjF+kBpwRJMPMG/+DGBDYNFNeRSJqWyopt6yyF528soAykHIUQ7TTultJV5IPCrvjRQQrGdJ/QtCdE0vZg+tA09nFN7AqgraU99kIvzyS0sqysj+pP1SJRmTRSGtlVAO3mILfkXOekZl1KD60G7CF+7BIaaW83FPD55tZhAGhnbLMYyiq7OiIyU61LTRcNSaJ0tAgMBAAECggEBAIGgGKcSzxCBbMYdXLV6TPbZ/HeaRGrwyVWUu7cmc0E8CJu6iWvmb2jGzbiCwuCT5luF6ZZ8JKchvU4FlTfsE5r9TQY2IZ/Ht4s65qBaDUEts5iY3kv8HX9+ZSXDJZpV0ztqqsPmx4ZNj+NYwWXwcFiKdb5R8OmV8bgSsnPddD6wFhwewglUOBPRAjropHE4sqk1Vam6q1MlFq5kiekMn/CItyFYFFzST/ruqAtVTp7YIvazAMrfCKH+pvXWk6pYNHZmL/JZey0GglRyJ1nItiqL33X8Lji056FcbAclidq022h/KPLEJpZk6irWqYdqYZeF6YMLHtdZFDkTZ/hXY+UCgYEA5i794UTQ1Kd6K+iui/S8K5H8nGdiXb3+uZ5j5VKYfbRmzXhAdVYisYe8czeTECxhH+MeHgM4tLR4ifx9q60ylvZxl9Fav1p6EaE36YcvGVmpm7Gm3q6QDDBa4gB+X9u7CxCS4LpotV917YS1QvOIF9lnRonSj1zNzFtbXkywrN8CgYEAwOpx/mR40ZvgZxNCq9DsIdrSZYAFFKpw0xy0OtF1PpuwMaREoRabnlVw6Bb3Hofg50XA3JxemzAX6fB92ee+NfXfeL4UtC4vG1K9JyiXHtHq8p9Uw2W03ehIEeNa3xdoRRnLmD4VUpyfL19ViE2+7TM1Gd3TogjDT+AMOCSuq3MCgYBsurPH7gaq/LVT+mRAzgj4l8v4YUlwuGeTbIMJdvt7HXUWB4CDLH3U2CYnUpAQKrZyJok6ahEmIr1xiKggKP7lmmHL8eNo0icpHrtXfzi7Q8Q/PCpzs4dtioXTjaIkS5nNvzVyG/uL+RyuZmpsxrZ5dYM4KbAhchfwORMutxEZhwKBgQC5zpVw4jCEItBmNuTWO+nTScGvxTgfiXIVw+XLaQa2AJoZlhAL34yPWdffko79tv3lgweY9HsimZXO2rU8dbp8mo5c6ydhy8HPXUeWOcAkDSdv/ApWENW9jgYsRIC3swHY3Fl+Dv3Wjce8huQI3mjwaYvRmBhIToxfmHnscVhTBQKBgB9uciEHfz8hMI7ePrPo2PkyK/RbJDm3HnuWE2lFBp7MOUMlh53MXwv4dIRaYMbRrFuN1UIKEFxuKhWwTHSzZJufk/UENrha/81fpj2BoFsAKkEunKeETvaIh6fZSjec16h2+zxbzwkdS6b+yIYkSlaoAxmDYrMtae0C8G4e0YS9";
String pubKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2RZZISModRzproL3eTxRtvVK/nToDbeLmAVdmaVtHgNCwjXMeNCZvHySZKO7+t7XySzBd2PhhQjvAkDd8HRKB5Y0uvP6TFwvhxOMkMydTeBFcUobQWNeAI7ttRms1txSNrmyrZr0WpWfk79VIsO+yI/jFN/Pj2gxD+vh5UUKU1LD2IQq/VxgtEpf8Vs6w7SvafPwYkpdPGCKUFkRvN1FrY2+tq0j1MRVJbB2rIunWDnT8cDUh2sWLXf4yNaJVOaaTFB0zbAk/qcoicGQyW7bVG7dVW8WywKmOAPeQCCQa+SJ4BhfI1k8eEAwFVRuxz/f9Ecfog9hZJ+RgELkpS8qhQIDAQAB";
rsaSigner signer = new rsaSigner();
Map<String, Object> params = new HashMap<>();
params.put("app_id", "hxgmau9imt86qky9");
params.put("version", "1.0");
params.put("key_version", "admin");
params.put("time", Long.toString(System.currentTimeMillis() / 1000));
params.put("coin","eth");
try {
params.put("sign", signer.genSign(params, priKey));
Gson gson = new GsonBuilder().create();
System.out.println("params = " + gson.toJson(params));
String res = doPost(baseUrl + "/balance/transactionFee", gson.toJson(params));
if (null == res) {
throw new RuntimeException("http error");
}
System.out.println("response = " + res);
JsonParser jp = new JsonParser();
JsonObject resEle = jp.parse(res).getAsJsonObject();
boolean retSignOK = signer.verifySign(resEle, resEle.get("sign").getAsString(), pubKey);
if (!retSignOK) {
throw new RuntimeException("verify response sign fail");
}
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("OK");
}
返回结果示例:
{
"status":200,
"msg":"请求成功",
"data":{
"fee":"0.01386",
"coin":"eth"
},
"date_time":"2020-10-20 15:58:53",
"time_stamp":1603180733,
"sign":"e7gvr/t/5E6Me2Y/ZL2RPd8Ua2vWayndE9+YwElQMn7lw1gTsWe3PLFjdIbICB/cZEAQdY2Aiwy+KHAydUA0QMqrufXBmXYhwDCmcf/z362gpD+e1X+beyU/u7wy9qSdgnyTpqyuAoXGffs/lY4TAwel8J/YBp79h+7YHCWT2u54XOAH0tMKMxhxhyMo7wiBBalDa1Nf/i5WZs92encHFQLceF1JMkAZ57c0bGaUs/ks+MUNMR09Va8BaTL9ZSi0oy5xhwXRCprOQ7Fqe8ivUvUn99WwL2KeldY2HKoJYZsz+4J5UZJp2xgupOVwnaH51MiUW9lI0F6Augo+laOI1A=="
}
- 功能: 充值订单归集手续费计算
- 目前仅支持 eth 、usdt_erc20 ,其他币种后续持续扩充。
HTTP Request
POST: /balance/transactionFee
请求参数
| 参数名 | 必选 | 类型 | 说明 |
|---|---|---|---|
| 公共参数 | 是 | JSON | 公参指:签名(sign)、版本(version)、商户ID(app_id)、时间(time) |
| coin | 是 | string | 币名 由平台提供为准 |
返回参数说明
| 参数名 | 类型 | 说明 |
|---|---|---|
| status | int | 状态码 |
| msg | string | 状态描述 |
| data | jsonObject | |
| data.fee | string | 手续费 |
| data.coin | string | 币名(手续费单位) |
| date_time | string | 响应时间 |
| time_stamp | int | 无时区的秒 |
| sign | string | 签名 |
提现gas费预估查询
$url = "http://api.xxxx.com/shopapi/transfer/transactionFee";
$header = [
'Content-Type:application/json',
];
$params = [
"version" => "1.0",
"app_id" => "hxgmau9imt86qky9",
"time" => "1578736053",
"coin" => "eth",
"sign" => "dLtK+uiPcnxt2ACKMbBqQ6wI5ttAvesOHzK5ybVID1R6hqYPDTkagl7Tsjr5iLJafehcSLTZyJLtCRI8O2CtIWQUUroGXBneHZC486NUi/4FMOQs0FaAgm17pWlbhX5/96cWXXXMVeoe3IZFKaFNYSWaA14v3RcdDU6QDE/9ixGiSJ0DIxm9NKA0+RkbIFbyYeuFn8d63OcjmUhv7tsOE6rKCc3Q2yi7Qe9i6BNAQFYMFATztb18MsxsBHKUxNqklqyVnl0ofETAHmQhfOHLmungOJQnOqAAuwfmRtg50Qci5F+R2mXeqjmIXko/u3E+DLYW1ygDBp3afKZmU4PwmA=="
];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
$return = curl_exec($ch);
print_r($return);
var url = "http://api.xxxx.com/shopapi/transfer/transactionFee"
data := map[string]string{
"version": "1.0",
"app_id": "hxgmau9imt86qky9",
"time": "1578736053",
"sign": "OTA8utI8y8G93p7RPCyb4qIilFQ0B4Aq4iUjhaXWK9m2kgektqlHOASDKXT2VE7NPNysrGycYlVfjDR2WGZn1G66phHo3qa9CcCNpG9klOBEuBEMjiVbb/d8AXcxEzvQr9OCwNsikyxonyzLiY/lsNHeGm9cC5eRvlNLdUSVBipH+ajPd0lDHCayZPs1eCMfbm/xnf8e2lfy6z0UPOpHGfyX/0+hz99Ir5Xnx+0sBBzyZZJxKm4ROid5aDv/9m9guILpURae+Yw/IrkYF4uAKGX+/44cBvtTRQSdX76CAOBSiywZa6BAgDYBLRtkAPM+i+vwNzFBovqHUvI+4Ponaw==",
"coin": "eth",
}
dataType, _ := json.Marshal(data)
resp, err := http.Post(url, "application/json", strings.NewReader(string(dataType)))
if err != nil {
fmt.Println(err)
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println(err)
}
fmt.Println(string(body))
let http = require('http');
let postData = {
"version": "1.0",
"app_id": "hxgmau9imt86qky9",
"time": "1578736053",
"sign": "OTA8utI8y8G93p7RPCyb4qIilFQ0B4Aq4iUjhaXWK9m2kgektqlHOASDKXT2VE7NPNysrGycYlVfjDR2WGZn1G66phHo3qa9CcCNpG9klOBEuBEMjiVbb/d8AXcxEzvQr9OCwNsikyxonyzLiY/lsNHeGm9cC5eRvlNLdUSVBipH+ajPd0lDHCayZPs1eCMfbm/xnf8e2lfy6z0UPOpHGfyX/0+hz99Ir5Xnx+0sBBzyZZJxKm4ROid5aDv/9m9guILpURae+Yw/IrkYF4uAKGX+/44cBvtTRQSdX76CAOBSiywZa6BAgDYBLRtkAPM+i+vwNzFBovqHUvI+4Ponaw==",
"coin": "eth",
};
let options = {
hostname: 'api.xxxx.com',
port: 80,
path: '/shopapi/transfer/transactionFee',
method: 'POST',
headers: {
'Content-Type': 'application/json'
}
};
const REQUEST = HTTP.request(POST_OPTIONS,function (res) {
let data = []
res.on('data', chunk => {
data.push(...chunk)
})
res.on('end', () => {
let _date = JSON.parse( new TextDecoder().decode(new Uint8Array(data)))
console.log(_date)
})
});
REQUEST.setTimeout(6000)
REQUEST.write(JSON.stringify(postData), 'utf8')
REQUEST.end()
public static void main(String[] args) {
// 完整实例请查看"签名规则"中的Java示例代码
String baseUrl = "http://api.xxxx.com/shopapi";
String priKey = "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCtdgvcfozY7fe/x6UlXR/Fff8+wX++CiG05YVRafDe90O8y5KJAMZ156TgajEUXSRyKZqASz7iVoMAcu5FqfK1KuOOdjTAg0LFe/twIZvKmAqHcCSS2pjUXk0fTpZEgQ5lmDCK12Mg07YXvr+BeHjF+kBpwRJMPMG/+DGBDYNFNeRSJqWyopt6yyF528soAykHIUQ7TTultJV5IPCrvjRQQrGdJ/QtCdE0vZg+tA09nFN7AqgraU99kIvzyS0sqysj+pP1SJRmTRSGtlVAO3mILfkXOekZl1KD60G7CF+7BIaaW83FPD55tZhAGhnbLMYyiq7OiIyU61LTRcNSaJ0tAgMBAAECggEBAIGgGKcSzxCBbMYdXLV6TPbZ/HeaRGrwyVWUu7cmc0E8CJu6iWvmb2jGzbiCwuCT5luF6ZZ8JKchvU4FlTfsE5r9TQY2IZ/Ht4s65qBaDUEts5iY3kv8HX9+ZSXDJZpV0ztqqsPmx4ZNj+NYwWXwcFiKdb5R8OmV8bgSsnPddD6wFhwewglUOBPRAjropHE4sqk1Vam6q1MlFq5kiekMn/CItyFYFFzST/ruqAtVTp7YIvazAMrfCKH+pvXWk6pYNHZmL/JZey0GglRyJ1nItiqL33X8Lji056FcbAclidq022h/KPLEJpZk6irWqYdqYZeF6YMLHtdZFDkTZ/hXY+UCgYEA5i794UTQ1Kd6K+iui/S8K5H8nGdiXb3+uZ5j5VKYfbRmzXhAdVYisYe8czeTECxhH+MeHgM4tLR4ifx9q60ylvZxl9Fav1p6EaE36YcvGVmpm7Gm3q6QDDBa4gB+X9u7CxCS4LpotV917YS1QvOIF9lnRonSj1zNzFtbXkywrN8CgYEAwOpx/mR40ZvgZxNCq9DsIdrSZYAFFKpw0xy0OtF1PpuwMaREoRabnlVw6Bb3Hofg50XA3JxemzAX6fB92ee+NfXfeL4UtC4vG1K9JyiXHtHq8p9Uw2W03ehIEeNa3xdoRRnLmD4VUpyfL19ViE2+7TM1Gd3TogjDT+AMOCSuq3MCgYBsurPH7gaq/LVT+mRAzgj4l8v4YUlwuGeTbIMJdvt7HXUWB4CDLH3U2CYnUpAQKrZyJok6ahEmIr1xiKggKP7lmmHL8eNo0icpHrtXfzi7Q8Q/PCpzs4dtioXTjaIkS5nNvzVyG/uL+RyuZmpsxrZ5dYM4KbAhchfwORMutxEZhwKBgQC5zpVw4jCEItBmNuTWO+nTScGvxTgfiXIVw+XLaQa2AJoZlhAL34yPWdffko79tv3lgweY9HsimZXO2rU8dbp8mo5c6ydhy8HPXUeWOcAkDSdv/ApWENW9jgYsRIC3swHY3Fl+Dv3Wjce8huQI3mjwaYvRmBhIToxfmHnscVhTBQKBgB9uciEHfz8hMI7ePrPo2PkyK/RbJDm3HnuWE2lFBp7MOUMlh53MXwv4dIRaYMbRrFuN1UIKEFxuKhWwTHSzZJufk/UENrha/81fpj2BoFsAKkEunKeETvaIh6fZSjec16h2+zxbzwkdS6b+yIYkSlaoAxmDYrMtae0C8G4e0YS9";
String pubKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2RZZISModRzproL3eTxRtvVK/nToDbeLmAVdmaVtHgNCwjXMeNCZvHySZKO7+t7XySzBd2PhhQjvAkDd8HRKB5Y0uvP6TFwvhxOMkMydTeBFcUobQWNeAI7ttRms1txSNrmyrZr0WpWfk79VIsO+yI/jFN/Pj2gxD+vh5UUKU1LD2IQq/VxgtEpf8Vs6w7SvafPwYkpdPGCKUFkRvN1FrY2+tq0j1MRVJbB2rIunWDnT8cDUh2sWLXf4yNaJVOaaTFB0zbAk/qcoicGQyW7bVG7dVW8WywKmOAPeQCCQa+SJ4BhfI1k8eEAwFVRuxz/f9Ecfog9hZJ+RgELkpS8qhQIDAQAB";
rsaSigner signer = new rsaSigner();
Map<String, Object> params = new HashMap<>();
params.put("app_id", "hxgmau9imt86qky9");
params.put("version", "1.0");
params.put("key_version", "admin");
params.put("time", Long.toString(System.currentTimeMillis() / 1000));
params.put("coin","eth");
try {
params.put("sign", signer.genSign(params, priKey));
Gson gson = new GsonBuilder().create();
System.out.println("params = " + gson.toJson(params));
String res = doPost(baseUrl + "/transfer/transactionFee", gson.toJson(params));
if (null == res) {
throw new RuntimeException("http error");
}
System.out.println("response = " + res);
JsonParser jp = new JsonParser();
JsonObject resEle = jp.parse(res).getAsJsonObject();
boolean retSignOK = signer.verifySign(resEle, resEle.get("sign").getAsString(), pubKey);
if (!retSignOK) {
throw new RuntimeException("verify response sign fail");
}
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("OK");
}
返回结果示例:
{
"status": 200,
"msg": "请求成功",
"data": [
{
"coin": "fil", //币名
"fee": "0.00379379", //当前币(coin) 交易手续费
"unit": "fil"//手续费单位
}, {
"coin": "eth",
"fee": "0.000231",
"unit": "eth"
}, {
"coin": "mof",
"fee": "0.00000005",
"unit": "eth"
}
],
"date_time": "2021-06-17 16:58:52",
"time_stamp": 1623920332,
"sign": "d1cAN64orfoNQMklGCep3E2t4BVbbsWt3pcb1T84ZfASFAy9p8fn5eSuoQD3q0AjPCUd+tjdhSUyiRXs3aGIAEAQh88jWf4EoCw8V0bG1TrRFw23rS84FmeWwHEnMOY8gRekWuzrfh0y33ThW6b81q7ARpMaONQWRLq2i6d7xAQIP5jZgSg1npGfTGwGnNlJbMiWLN2WTF7KbiUHy2WZ7cx8t2qaXopCxE0G2si8AFcmdOhBiooETFCP+jMr3wdn7DzZs39lVeIaG+XjplsSpQjc1ESKdTWDCAw1vpfQUGBpAyrF2eXuS+rT9caVgUwUluhwbDTI2npUsw=="
}
提现手续费预估查询接口,返回支持币种提现的手续费。(目前只支持eth及其合约、fil)
HTTP Request
POST: /transfer/transactionFee
请求参数
| 参数名 | 必选 | 类型 | 说明 |
|---|---|---|---|
| 公共参数 | 是 | string | 公参指:签名(sign)、版本(version)、商户ID(app_id)、时间(time) |
| coin | 否 | string | 币名 由平台提供为准 |
返回参数说明
| 参数名 | 类型 | 说明 |
|---|---|---|
| status | int | 状态码 |
| msg | string | 状态描述 |
| data | jsonObject | trade_id-由商户提供 |
| data.coin | sring | 币名 |
| data.fee | sring | 手续费 |
| data.unit | sring | 手续费单位 |
| date_time | string | 响应时间 |
| time_stamp | int | 无时区的秒 |
| sign | string | 签名 |
退款记录列表
$url = "http://api.xxxx.com/shopapi/refund/list";
$header = [
'Content-Type:application/json',
];
$params = [
"version" => "1.0",
"app_id" => "hxgmau9imt86qky9",
"time" => "1578736053",
"page" => 1,
"sign" => "dLtK+uiPcnxt2ACKMbBqQ6wI5ttAvesOHzK5ybVID1R6hqYPDTkagl7Tsjr5iLJafehcSLTZyJLtCRI8O2CtIWQUUroGXBneHZC486NUi/4FMOQs0FaAgm17pWlbhX5/96cWXXXMVeoe3IZFKaFNYSWaA14v3RcdDU6QDE/9ixGiSJ0DIxm9NKA0+RkbIFbyYeuFn8d63OcjmUhv7tsOE6rKCc3Q2yi7Qe9i6BNAQFYMFATztb18MsxsBHKUxNqklqyVnl0ofETAHmQhfOHLmungOJQnOqAAuwfmRtg50Qci5F+R2mXeqjmIXko/u3E+DLYW1ygDBp3afKZmU4PwmA=="
];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
$return = curl_exec($ch);
print_r($return);
var url = "http://api.xxxx.com/shopapi/refund/list"
data := map[string]string{
"version": "1.0",
"app_id": "hxgmau9imt86qky9",
"time": "1578736053",
"page": "1",
"sign": "OTA8utI8y8G93p7RPCyb4qIilFQ0B4Aq4iUjhaXWK9m2kgektqlHOASDKXT2VE7NPNysrGycYlVfjDR2WGZn1G66phHo3qa9CcCNpG9klOBEuBEMjiVbb/d8AXcxEzvQr9OCwNsikyxonyzLiY/lsNHeGm9cC5eRvlNLdUSVBipH+ajPd0lDHCayZPs1eCMfbm/xnf8e2lfy6z0UPOpHGfyX/0+hz99Ir5Xnx+0sBBzyZZJxKm4ROid5aDv/9m9guILpURae+Yw/IrkYF4uAKGX+/44cBvtTRQSdX76CAOBSiywZa6BAgDYBLRtkAPM+i+vwNzFBovqHUvI+4Ponaw==",
}
dataType, _ := json.Marshal(data)
resp, err := http.Post(url, "application/json", strings.NewReader(string(dataType)))
if err != nil {
fmt.Println(err)
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println(err)
}
fmt.Println(string(body))
let HTTP = require('http')
let postData = {
"version": "1.0",
"app_id": "hxgmau9imt86qky9",
"time": "1578736053",
"page": "1",
"sign": "OTA8utI8y8G93p7RPCyb4qIilFQ0B4Aq4iUjhaXWK9m2kgektqlHOASDKXT2VE7NPNysrGycYlVfjDR2WGZn1G66phHo3qa9CcCNpG9klOBEuBEMjiVbb/d8AXcxEzvQr9OCwNsikyxonyzLiY/lsNHeGm9cC5eRvlNLdUSVBipH+ajPd0lDHCayZPs1eCMfbm/xnf8e2lfy6z0UPOpHGfyX/0+hz99Ir5Xnx+0sBBzyZZJxKm4ROid5aDv/9m9guILpURae+Yw/IrkYF4uAKGX+/44cBvtTRQSdX76CAOBSiywZa6BAgDYBLRtkAPM+i+vwNzFBovqHUvI+4Ponaw==",
};
let POST_OPTIONS = {
port: 80,
host: "api.xxxx.com",
path: "/shopapi/refund/list",
method: 'POST',
headers: {
"Content-Type": "application/json; charset=utf-8"
}
};
const REQUEST = HTTP.request(POST_OPTIONS,function (res) {
let data = []
res.on('data', chunk => {
data.push(...chunk)
})
res.on('end', () => {
let _date = JSON.parse( new TextDecoder().decode(new Uint8Array(data)))
console.log(_date)
})
});
REQUEST.setTimeout(6000)
REQUEST.write(JSON.stringify(postData), 'utf8')
REQUEST.end()
public static void main(String[] args) {
// 完整实例请查看"签名规则"中的Java示例代码
String baseUrl = "http://api.xxxx.com/shopapi";
String priKey = "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCtdgvcfozY7fe/x6UlXR/Fff8+wX++CiG05YVRafDe90O8y5KJAMZ156TgajEUXSRyKZqASz7iVoMAcu5FqfK1KuOOdjTAg0LFe/twIZvKmAqHcCSS2pjUXk0fTpZEgQ5lmDCK12Mg07YXvr+BeHjF+kBpwRJMPMG/+DGBDYNFNeRSJqWyopt6yyF528soAykHIUQ7TTultJV5IPCrvjRQQrGdJ/QtCdE0vZg+tA09nFN7AqgraU99kIvzyS0sqysj+pP1SJRmTRSGtlVAO3mILfkXOekZl1KD60G7CF+7BIaaW83FPD55tZhAGhnbLMYyiq7OiIyU61LTRcNSaJ0tAgMBAAECggEBAIGgGKcSzxCBbMYdXLV6TPbZ/HeaRGrwyVWUu7cmc0E8CJu6iWvmb2jGzbiCwuCT5luF6ZZ8JKchvU4FlTfsE5r9TQY2IZ/Ht4s65qBaDUEts5iY3kv8HX9+ZSXDJZpV0ztqqsPmx4ZNj+NYwWXwcFiKdb5R8OmV8bgSsnPddD6wFhwewglUOBPRAjropHE4sqk1Vam6q1MlFq5kiekMn/CItyFYFFzST/ruqAtVTp7YIvazAMrfCKH+pvXWk6pYNHZmL/JZey0GglRyJ1nItiqL33X8Lji056FcbAclidq022h/KPLEJpZk6irWqYdqYZeF6YMLHtdZFDkTZ/hXY+UCgYEA5i794UTQ1Kd6K+iui/S8K5H8nGdiXb3+uZ5j5VKYfbRmzXhAdVYisYe8czeTECxhH+MeHgM4tLR4ifx9q60ylvZxl9Fav1p6EaE36YcvGVmpm7Gm3q6QDDBa4gB+X9u7CxCS4LpotV917YS1QvOIF9lnRonSj1zNzFtbXkywrN8CgYEAwOpx/mR40ZvgZxNCq9DsIdrSZYAFFKpw0xy0OtF1PpuwMaREoRabnlVw6Bb3Hofg50XA3JxemzAX6fB92ee+NfXfeL4UtC4vG1K9JyiXHtHq8p9Uw2W03ehIEeNa3xdoRRnLmD4VUpyfL19ViE2+7TM1Gd3TogjDT+AMOCSuq3MCgYBsurPH7gaq/LVT+mRAzgj4l8v4YUlwuGeTbIMJdvt7HXUWB4CDLH3U2CYnUpAQKrZyJok6ahEmIr1xiKggKP7lmmHL8eNo0icpHrtXfzi7Q8Q/PCpzs4dtioXTjaIkS5nNvzVyG/uL+RyuZmpsxrZ5dYM4KbAhchfwORMutxEZhwKBgQC5zpVw4jCEItBmNuTWO+nTScGvxTgfiXIVw+XLaQa2AJoZlhAL34yPWdffko79tv3lgweY9HsimZXO2rU8dbp8mo5c6ydhy8HPXUeWOcAkDSdv/ApWENW9jgYsRIC3swHY3Fl+Dv3Wjce8huQI3mjwaYvRmBhIToxfmHnscVhTBQKBgB9uciEHfz8hMI7ePrPo2PkyK/RbJDm3HnuWE2lFBp7MOUMlh53MXwv4dIRaYMbRrFuN1UIKEFxuKhWwTHSzZJufk/UENrha/81fpj2BoFsAKkEunKeETvaIh6fZSjec16h2+zxbzwkdS6b+yIYkSlaoAxmDYrMtae0C8G4e0YS9";
String pubKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2RZZISModRzproL3eTxRtvVK/nToDbeLmAVdmaVtHgNCwjXMeNCZvHySZKO7+t7XySzBd2PhhQjvAkDd8HRKB5Y0uvP6TFwvhxOMkMydTeBFcUobQWNeAI7ttRms1txSNrmyrZr0WpWfk79VIsO+yI/jFN/Pj2gxD+vh5UUKU1LD2IQq/VxgtEpf8Vs6w7SvafPwYkpdPGCKUFkRvN1FrY2+tq0j1MRVJbB2rIunWDnT8cDUh2sWLXf4yNaJVOaaTFB0zbAk/qcoicGQyW7bVG7dVW8WywKmOAPeQCCQa+SJ4BhfI1k8eEAwFVRuxz/f9Ecfog9hZJ+RgELkpS8qhQIDAQAB";
rsaSigner signer = new rsaSigner();
Map<String, Object> params = new HashMap<>();
params.put("app_id", "hxgmau9imt86qky9");
params.put("version", "1.0");
params.put("key_version", "admin");
params.put("time", Long.toString(System.currentTimeMillis() / 1000));
params.put("page", "1");
try {
params.put("sign", signer.genSign(params, priKey));
Gson gson = new GsonBuilder().create();
System.out.println("params = " + gson.toJson(params));
String res = doPost(baseUrl + "/refund/list", gson.toJson(params));
if (null == res) {
throw new RuntimeException("http error");
}
System.out.println("response = " + res);
JsonParser jp = new JsonParser();
JsonObject resEle = jp.parse(res).getAsJsonObject();
boolean retSignOK = signer.verifySign(resEle, resEle.get("sign").getAsString(), pubKey);
if (!retSignOK) {
throw new RuntimeException("verify response sign fail");
}
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("OK");
}
返回结果示例:
{
"status": 200,
"msg": "处理成功",
"data": {
"page": 1,
"max_page": 1,
"count": 1,
"list": [{
"block_number": 69471385,
"block_time": 1742882698,
"coin": "pol",
"contract": "pol",
"contract_address": "",
"created_at": 1742882633,
"creator": "CS007",
"end_time": 1742882749,
"from_address": "0xDCE6e20FfC7b651Cd5d7ad922b8B77691E999dB2",
"gas_fee": "0.00062635",
"method": 0,
"order_id": "20250101123456",
"receive_amount": "0.03",
"receive_order_id": "",
"receive_txid": "0xb6042b5eac8a9b7fbc538ad9564b2ada7d59cbc39a462d2da784494562556590",
"refund_amount": "0.029",
"remark": "",
"status": 1,
"to_address": "0xb4bd96957e7b078566cd1e40de2c131d1f4374e4",
"txid": "0xc3b148c2ede826bbadf68682486fce8fabe5a5c53e3973c45b9e5578787ff359",
"type": 1
}]
},
"date_time": "2022-07-22 18:36:36",
"time_stamp": 1658486196,
"sign": "uuYWvmoMqM5xh7aTcxspJmW78y8op5BBjYXp0XoqcqFXe+HrSGzxN2Ls6LA7SlfsNndCtS4AX1/J+2o1MWZw/HFVfRqtxu02AEfWhM5ZSiJfEtO8f47H2/EGcsKw/eK8nxOnYAyAKwG6Ia6L4KgYIXLwsGt6Dt0VYWADu+vEQEes83/c6+Tc8QdqpdnLbs2XXXkYkl5eijoja+QEMaENbx+DHxnsVZV0iRK5FcSQH9PdOIpWmC944BA2v0tnPQWb6WDnOTsw5xoVKiL57WGIeOaxepvjo6poi1a/+HYrowT4IcejZZHi9YW0iM4eNm8MPK0tloAQ8GWY7kVs9uEwOA=="
}
HTTP Request
POST: /refund/list
请求参数
| 参数名 | 必选 | 类型 | 说明 |
|---|---|---|---|
| 公共参数 | 是 | string | 公参指:签名(sign)、版本(version)、商户ID(app_id)、时间(time) |
| page | 否 | int | 1<= N <=Max,对于超过Max的取Max,小于1或没有传参数的返回1 |
| page_size | 否 | int | 每页数量 (20 ~100),默认 20 |
| sort_num | 否 | int | 列表排序规则 默认按入系统时间正序排列( 1 正序 ; 2 倒序) |
| status | 否 | string | 状态,默认不传返回所有状态。0 等待退款; 1 退款成功; 2 退款失败; 5 待商户审核; 6 审核不通过; 10 待平台审核; 11 平台审核不通过; 25 退款中; 26 退款Gas费不足等待中; |
| start_time | 否 | int | 开始时间(创建时间) 格式 :时间戳 |
| end_time | 否 | int | 结束时间(创建时间) 格式 :时间戳 |
| contract | 否 | string | 网络主币名 |
| coin | 否 | string | 币名 |
| receive_order_id | 否 | string | 关联的充值订单号 |
| receive_txid | 否 | string | 关联充值记录的链上交易hash |
| txid | 否 | string | 该退款交易的链上交易hash |
| from_address | 否 | string | 退款来源地址,即充值交易的收款用户地址 |
| to_address | 否 | string | 退款目标地址(冷地址或充值的来源地址) |
返回参数说明
| 参数名 | 类型 | 说明 |
|---|---|---|
| status | int | 状态码 |
| msg | string | 状态描述 |
| data | jsonObject | trade_id-由商户提供 |
| data.page | int | 第几页 |
| data.count | int | 本页记录数 |
| data.list | jsonArray | 具体每条记录 |
| data.list.block_number | int | 退款交易区块高度 |
| data.list.block_time | int | 退款交易上链时间 |
| data.list.coin | string | 币种 |
| data.list.contract | string | 主链 |
| data.list.contract_address | string | 币种合约地址 |
| data.list.created_at | int | 退款创建时间 |
| data.list.creator | string | 退款发起商家管理员 |
| data.list.end_time | int | 退款结束时间 |
| data.list.from_address | string | 退款来源地址,即充值交易的收款用户地址 |
| data.list.gas_fee | string | 退款交易链上手续费 |
| data.list.method | int | 退款方式,0原路返回,1冷钱包 |
| data.list.order_id | string | 退款订单号 |
| data.list.receive_amount | string | 被退款的充值交易金额 |
| data.list.receive_order_id | string | 关联的充值订单号 |
| data.list.receive_txid | string | 关联充值记录的链上交易hash |
| data.list.refund_amount | string | 实际退款金额 |
| data.list.remark | string | 备注 |
| data.list.status | int | 状态,0 等待退款; 1 退款成功; 2 退款失败; 5 待商户审核; 6 审核不通过; 10 待平台审核; 11 平台审核不通过; 25 退款中; 26 退款Gas费不足等待中; |
| data.list.to_address | string | 退款目标地址(冷地址或充值的来源地址) |
| data.list.txid | string | 退款交易的链上交易hash |
| data.list.type | int | 类型,0关联充值单 1无充值单且平台支持币种 2无充值单且平台不支持币种 3无充值单且平台不支持的主链 |
| date_time | string | 响应时间 |
| time_stamp | int | 无时区的秒 |
| sign | string | 签名 |
检测其账本记录的币种数量是否和其链上钱包的数据一致
$url = "http://api.xxxx.com/shopapi/reconcile/balances";
$header = [
'Content-Type:application/json',
];
$params = [
"version" => "1.0",
"app_id" => "hxgmau9imt86qky9",
"time" => "1578736053",
"list" => [
[
"chain" => "eth",
"coin" => "usdt_erc20",
"ledger_balance" => "100"
],
[
"chain" => "btc",
"coin" => "btc",
"ledger_balance" => "10"
]
],
"sign" => "dLtK+uiPcnxt2ACKMbBqQ6wI5ttAvesOHzK5ybVID1R6hqYPDTkagl7Tsjr5iLJafehcSLTZyJLtCRI8O2CtIWQUUroGXBneHZC486NUi/4FMOQs0FaAgm17pWlbhX5/96cWXXXMVeoe3IZFKaFNYSWaA14v3RcdDU6QDE/9ixGiSJ0DIxm9NKA0+RkbIFbyYeuFn8d63OcjmUhv7tsOE6rKCc3Q2yi7Qe9i6BNAQFYMFATztb18MsxsBHKUxNqklqyVnl0ofETAHmQhfOHLmungOJQnOqAAuwfmRtg50Qci5F+R2mXeqjmIXko/u3E+DLYW1ygDBp3afKZmU4PwmA=="
];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
$return = curl_exec($ch);
print_r($return);
var url = "http://api.xxxx.com/shopapi/reconcile/balances"
data := map[string]string{
"version": "1.0",
"app_id": "hxgmau9imt86qky9",
"time": "1578736053",
"list": [
{
"chain": "eth",
"coin": "usdt_erc20",
"ledger_balance": "100"
},
{
"chain": "btc",
"coin": "btc",
"ledger_balance": "10"
}
],
"sign": "OTA8utI8y8G93p7RPCyb4qIilFQ0B4Aq4iUjhaXWK9m2kgektqlHOASDKXT2VE7NPNysrGycYlVfjDR2WGZn1G66phHo3qa9CcCNpG9klOBEuBEMjiVbb/d8AXcxEzvQr9OCwNsikyxonyzLiY/lsNHeGm9cC5eRvlNLdUSVBipH+ajPd0lDHCayZPs1eCMfbm/xnf8e2lfy6z0UPOpHGfyX/0+hz99Ir5Xnx+0sBBzyZZJxKm4ROid5aDv/9m9guILpURae+Yw/IrkYF4uAKGX+/44cBvtTRQSdX76CAOBSiywZa6BAgDYBLRtkAPM+i+vwNzFBovqHUvI+4Ponaw==",
}
dataType, _ := json.Marshal(data)
resp, err := http.Post(url, "application/json", strings.NewReader(string(dataType)))
if err != nil {
fmt.Println(err)
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println(err)
}
fmt.Println(string(body))
let HTTP = require('http')
let postData = {
"version": "1.0",
"app_id": "hxgmau9imt86qky9",
"time": "1578736053",
"list": [
{
"chain": "eth",
"coin": "usdt_erc20",
"ledger_balance": "100"
},
{
"chain": "btc",
"coin": "btc",
"ledger_balance": "10"
}
],
"sign": "OTA8utI8y8G93p7RPCyb4qIilFQ0B4Aq4iUjhaXWK9m2kgektqlHOASDKXT2VE7NPNysrGycYlVfjDR2WGZn1G66phHo3qa9CcCNpG9klOBEuBEMjiVbb/d8AXcxEzvQr9OCwNsikyxonyzLiY/lsNHeGm9cC5eRvlNLdUSVBipH+ajPd0lDHCayZPs1eCMfbm/xnf8e2lfy6z0UPOpHGfyX/0+hz99Ir5Xnx+0sBBzyZZJxKm4ROid5aDv/9m9guILpURae+Yw/IrkYF4uAKGX+/44cBvtTRQSdX76CAOBSiywZa6BAgDYBLRtkAPM+i+vwNzFBovqHUvI+4Ponaw==",
};
let POST_OPTIONS = {
port: 80,
host: "api.xxxx.com",
path: "/shopapi/reconcile/balances",
method: 'POST',
headers: {
"Content-Type": "application/json; charset=utf-8"
}
};
const REQUEST = HTTP.request(POST_OPTIONS,function (res) {
let data = []
res.on('data', chunk => {
data.push(...chunk)
})
res.on('end', () => {
let _date = JSON.parse( new TextDecoder().decode(new Uint8Array(data)))
console.log(_date)
})
});
REQUEST.setTimeout(6000)
REQUEST.write(JSON.stringify(postData), 'utf8')
REQUEST.end()
public static void main(String[] args) {
// 完整实例请查看"签名规则"中的Java示例代码
String baseUrl = "http://api.xxxx.com/shopapi";
String priKey = "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCtdgvcfozY7fe/x6UlXR/Fff8+wX++CiG05YVRafDe90O8y5KJAMZ156TgajEUXSRyKZqASz7iVoMAcu5FqfK1KuOOdjTAg0LFe/twIZvKmAqHcCSS2pjUXk0fTpZEgQ5lmDCK12Mg07YXvr+BeHjF+kBpwRJMPMG/+DGBDYNFNeRSJqWyopt6yyF528soAykHIUQ7TTultJV5IPCrvjRQQrGdJ/QtCdE0vZg+tA09nFN7AqgraU99kIvzyS0sqysj+pP1SJRmTRSGtlVAO3mILfkXOekZl1KD60G7CF+7BIaaW83FPD55tZhAGhnbLMYyiq7OiIyU61LTRcNSaJ0tAgMBAAECggEBAIGgGKcSzxCBbMYdXLV6TPbZ/HeaRGrwyVWUu7cmc0E8CJu6iWvmb2jGzbiCwuCT5luF6ZZ8JKchvU4FlTfsE5r9TQY2IZ/Ht4s65qBaDUEts5iY3kv8HX9+ZSXDJZpV0ztqqsPmx4ZNj+NYwWXwcFiKdb5R8OmV8bgSsnPddD6wFhwewglUOBPRAjropHE4sqk1Vam6q1MlFq5kiekMn/CItyFYFFzST/ruqAtVTp7YIvazAMrfCKH+pvXWk6pYNHZmL/JZey0GglRyJ1nItiqL33X8Lji056FcbAclidq022h/KPLEJpZk6irWqYdqYZeF6YMLHtdZFDkTZ/hXY+UCgYEA5i794UTQ1Kd6K+iui/S8K5H8nGdiXb3+uZ5j5VKYfbRmzXhAdVYisYe8czeTECxhH+MeHgM4tLR4ifx9q60ylvZxl9Fav1p6EaE36YcvGVmpm7Gm3q6QDDBa4gB+X9u7CxCS4LpotV917YS1QvOIF9lnRonSj1zNzFtbXkywrN8CgYEAwOpx/mR40ZvgZxNCq9DsIdrSZYAFFKpw0xy0OtF1PpuwMaREoRabnlVw6Bb3Hofg50XA3JxemzAX6fB92ee+NfXfeL4UtC4vG1K9JyiXHtHq8p9Uw2W03ehIEeNa3xdoRRnLmD4VUpyfL19ViE2+7TM1Gd3TogjDT+AMOCSuq3MCgYBsurPH7gaq/LVT+mRAzgj4l8v4YUlwuGeTbIMJdvt7HXUWB4CDLH3U2CYnUpAQKrZyJok6ahEmIr1xiKggKP7lmmHL8eNo0icpHrtXfzi7Q8Q/PCpzs4dtioXTjaIkS5nNvzVyG/uL+RyuZmpsxrZ5dYM4KbAhchfwORMutxEZhwKBgQC5zpVw4jCEItBmNuTWO+nTScGvxTgfiXIVw+XLaQa2AJoZlhAL34yPWdffko79tv3lgweY9HsimZXO2rU8dbp8mo5c6ydhy8HPXUeWOcAkDSdv/ApWENW9jgYsRIC3swHY3Fl+Dv3Wjce8huQI3mjwaYvRmBhIToxfmHnscVhTBQKBgB9uciEHfz8hMI7ePrPo2PkyK/RbJDm3HnuWE2lFBp7MOUMlh53MXwv4dIRaYMbRrFuN1UIKEFxuKhWwTHSzZJufk/UENrha/81fpj2BoFsAKkEunKeETvaIh6fZSjec16h2+zxbzwkdS6b+yIYkSlaoAxmDYrMtae0C8G4e0YS9";
String pubKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2RZZISModRzproL3eTxRtvVK/nToDbeLmAVdmaVtHgNCwjXMeNCZvHySZKO7+t7XySzBd2PhhQjvAkDd8HRKB5Y0uvP6TFwvhxOMkMydTeBFcUobQWNeAI7ttRms1txSNrmyrZr0WpWfk79VIsO+yI/jFN/Pj2gxD+vh5UUKU1LD2IQq/VxgtEpf8Vs6w7SvafPwYkpdPGCKUFkRvN1FrY2+tq0j1MRVJbB2rIunWDnT8cDUh2sWLXf4yNaJVOaaTFB0zbAk/qcoicGQyW7bVG7dVW8WywKmOAPeQCCQa+SJ4BhfI1k8eEAwFVRuxz/f9Ecfog9hZJ+RgELkpS8qhQIDAQAB";
rsaSigner signer = new rsaSigner();
Map<String, Object> params = new HashMap<>();
params.put("app_id", "hxgmau9imt86qky9");
params.put("version", "1.0");
params.put("key_version", "admin");
params.put("time", Long.toString(System.currentTimeMillis() / 1000));
List<Map<String, String>> list = new ArrayList<>();
Map<String, String> item1 = new HashMap<>();
item1.put("chain", "eth");
item1.put("coin", "usdt_erc20");
item1.put("ledger_balance", "100");
list.add(item1);
params.put("list", list);
try {
params.put("sign", signer.genSign(params, priKey));
Gson gson = new GsonBuilder().create();
System.out.println("params = " + gson.toJson(params));
String res = doPost(baseUrl + "/reconcile/balances", gson.toJson(params));
if (null == res) {
throw new RuntimeException("http error");
}
System.out.println("response = " + res);
JsonParser jp = new JsonParser();
JsonObject resEle = jp.parse(res).getAsJsonObject();
boolean retSignOK = signer.verifySign(resEle, resEle.get("sign").getAsString(), pubKey);
if (!retSignOK) {
throw new RuntimeException("verify response sign fail");
}
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("OK");
}
返回结果示例:
{
"status": 200,
"msg": "处理成功",
"data": {
"list": [
{
"chain": "eth",
"coin": "usdt_erc20",
"ledger_balance": "100",
"onchain_balance": "100",
"matched": true,
"note": "",
"difference": "0"
},
{
"chain": "btc",
"coin": "btc",
"ledger_balance": "10",
"onchain_balance": "9",
"matched": false,
"note": "",
"difference": "-1"
}
]
},
"date_time": "2022-07-22 18:36:36",
"time_stamp": 1658486196,
"sign": "uuYWvmoMqM5xh7aTcxspJmW78y8op5BBjYXp0XoqcqFXe+HrSGzxN2Ls6LA7SlfsNndCtS4AX1/J+2o1MWZw/HFVfRqtxu02AEfWhM5ZSiJfEtO8f47H2/EGcsKw/eK8nxOnYAyAKwG6Ia6L4KgYIXLwsGt6Dt0VYWADu+vEQEes83/c6+Tc8QdqpdnLbs2XXXkYkl5eijoja+QEMaENbx+DHxnsVZV0iRK5FcSQH9PdOIpWmC944BA2v0tnPQWb6WDnOTsw5xoVKiL57WGIeOaxepvjo6poi1a/+HYrowT4IcejZZHi9YW0iM4eNm8MPK0tloAQ8GWY7kVs9uEwOA=="
}
HTTP Request
POST: /reconcile/balances
请求参数
| 参数名 | 必选 | 类型 | 说明 |
|---|---|---|---|
| 公共参数 | 是 | string | 公参指:签名(sign)、版本(version)、商户ID(app_id)、时间(time) |
| list.chain | 否 | string | 主链 |
| list.coin | 是 | string | 币种 |
| list.ledger_balance | 否 | string | 账本余额 |
返回参数说明
| 参数名 | 类型 | 说明 |
|---|---|---|
| status | int | 状态码 |
| msg | string | 状态描述 |
| data | jsonObject | data |
| data.list | jsonArray | 具体每条记录 |
| data.list.chain | string | 主链 |
| data.list.coin | string | 币种 |
| data.list.ledger_balance | string | 账本余额 |
| data.list.onchain_balance | string | 账本余额 |
| data.list.difference | string | 余额差值 |
| data.list.matched | bool | 余额是否匹配 |
| data.list.note | string | 说明描述 |
| date_time | string | 响应时间 |
| time_stamp | int | 无时区的秒 |
| sign | string | 签名 |
检测其某个账户地址的币种数量是否其链上数量一致
$url = "http://api.xxxx.com/shopapi/reconcile/addressBalance";
$header = [
'Content-Type:application/json',
];
$params = [
"version" => "1.0",
"app_id" => "hxgmau9imt86qky9",
"time" => "1578736053",
"list" => [
[
"chain" => "eth",
"coin" => "usdt_erc20",
"address" => "0x111...2222",
"ledger_balance" => "100"
],
[
"chain" => "btc",
"coin" => "btc",
"address" => "1bcd...zxc",
"ledger_balance" => "10"
]
],
"sign" => "dLtK+uiPcnxt2ACKMbBqQ6wI5ttAvesOHzK5ybVID1R6hqYPDTkagl7Tsjr5iLJafehcSLTZyJLtCRI8O2CtIWQUUroGXBneHZC486NUi/4FMOQs0FaAgm17pWlbhX5/96cWXXXMVeoe3IZFKaFNYSWaA14v3RcdDU6QDE/9ixGiSJ0DIxm9NKA0+RkbIFbyYeuFn8d63OcjmUhv7tsOE6rKCc3Q2yi7Qe9i6BNAQFYMFATztb18MsxsBHKUxNqklqyVnl0ofETAHmQhfOHLmungOJQnOqAAuwfmRtg50Qci5F+R2mXeqjmIXko/u3E+DLYW1ygDBp3afKZmU4PwmA=="
];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
$return = curl_exec($ch);
print_r($return);
var url = "http://api.xxxx.com/shopapi/reconcile/addressBalance"
data := map[string]string{
"version": "1.0",
"app_id": "hxgmau9imt86qky9",
"time": "1578736053",
"list": [
{
"chain": "eth",
"coin": "usdt_erc20",
"address": "0x111...2222",
"ledger_amount": "100"
},
{
"chain": "btc",
"coin": "btc",
"address": "1bcd...zxc",
"ledger_amount": "10",
"difference": "0"
}
],
"sign": "OTA8utI8y8G93p7RPCyb4qIilFQ0B4Aq4iUjhaXWK9m2kgektqlHOASDKXT2VE7NPNysrGycYlVfjDR2WGZn1G66phHo3qa9CcCNpG9klOBEuBEMjiVbb/d8AXcxEzvQr9OCwNsikyxonyzLiY/lsNHeGm9cC5eRvlNLdUSVBipH+ajPd0lDHCayZPs1eCMfbm/xnf8e2lfy6z0UPOpHGfyX/0+hz99Ir5Xnx+0sBBzyZZJxKm4ROid5aDv/9m9guILpURae+Yw/IrkYF4uAKGX+/44cBvtTRQSdX76CAOBSiywZa6BAgDYBLRtkAPM+i+vwNzFBovqHUvI+4Ponaw==",
}
dataType, _ := json.Marshal(data)
resp, err := http.Post(url, "application/json", strings.NewReader(string(dataType)))
if err != nil {
fmt.Println(err)
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println(err)
}
fmt.Println(string(body))
let HTTP = require('http')
let postData = {
"version": "1.0",
"app_id": "hxgmau9imt86qky9",
"time": "1578736053",
"list": [
{
"chain": "eth",
"coin": "usdt_erc20",
"address": "0x111...2222",
"ledger_amount": "100"
},
{
"chain": "btc",
"coin": "btc",
"address": "1bcd...zxc",
"ledger_amount": "10",
"difference": "0"
}
],
"sign": "OTA8utI8y8G93p7RPCyb4qIilFQ0B4Aq4iUjhaXWK9m2kgektqlHOASDKXT2VE7NPNysrGycYlVfjDR2WGZn1G66phHo3qa9CcCNpG9klOBEuBEMjiVbb/d8AXcxEzvQr9OCwNsikyxonyzLiY/lsNHeGm9cC5eRvlNLdUSVBipH+ajPd0lDHCayZPs1eCMfbm/xnf8e2lfy6z0UPOpHGfyX/0+hz99Ir5Xnx+0sBBzyZZJxKm4ROid5aDv/9m9guILpURae+Yw/IrkYF4uAKGX+/44cBvtTRQSdX76CAOBSiywZa6BAgDYBLRtkAPM+i+vwNzFBovqHUvI+4Ponaw==",
};
let POST_OPTIONS = {
port: 80,
host: "api.xxxx.com",
path: "/shopapi/reconcile/addressBalance",
method: 'POST',
headers: {
"Content-Type": "application/json; charset=utf-8"
}
};
const REQUEST = HTTP.request(POST_OPTIONS,function (res) {
let data = []
res.on('data', chunk => {
data.push(...chunk)
})
res.on('end', () => {
let _date = JSON.parse( new TextDecoder().decode(new Uint8Array(data)))
console.log(_date)
})
});
REQUEST.setTimeout(6000)
REQUEST.write(JSON.stringify(postData), 'utf8')
REQUEST.end()
public static void main(String[] args) {
// 完整实例请查看"签名规则"中的Java示例代码
String baseUrl = "http://api.xxxx.com/shopapi";
String priKey = "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCtdgvcfozY7fe/x6UlXR/Fff8+wX++CiG05YVRafDe90O8y5KJAMZ156TgajEUXSRyKZqASz7iVoMAcu5FqfK1KuOOdjTAg0LFe/twIZvKmAqHcCSS2pjUXk0fTpZEgQ5lmDCK12Mg07YXvr+BeHjF+kBpwRJMPMG/+DGBDYNFNeRSJqWyopt6yyF528soAykHIUQ7TTultJV5IPCrvjRQQrGdJ/QtCdE0vZg+tA09nFN7AqgraU99kIvzyS0sqysj+pP1SJRmTRSGtlVAO3mILfkXOekZl1KD60G7CF+7BIaaW83FPD55tZhAGhnbLMYyiq7OiIyU61LTRcNSaJ0tAgMBAAECggEBAIGgGKcSzxCBbMYdXLV6TPbZ/HeaRGrwyVWUu7cmc0E8CJu6iWvmb2jGzbiCwuCT5luF6ZZ8JKchvU4FlTfsE5r9TQY2IZ/Ht4s65qBaDUEts5iY3kv8HX9+ZSXDJZpV0ztqqsPmx4ZNj+NYwWXwcFiKdb5R8OmV8bgSsnPddD6wFhwewglUOBPRAjropHE4sqk1Vam6q1MlFq5kiekMn/CItyFYFFzST/ruqAtVTp7YIvazAMrfCKH+pvXWk6pYNHZmL/JZey0GglRyJ1nItiqL33X8Lji056FcbAclidq022h/KPLEJpZk6irWqYdqYZeF6YMLHtdZFDkTZ/hXY+UCgYEA5i794UTQ1Kd6K+iui/S8K5H8nGdiXb3+uZ5j5VKYfbRmzXhAdVYisYe8czeTECxhH+MeHgM4tLR4ifx9q60ylvZxl9Fav1p6EaE36YcvGVmpm7Gm3q6QDDBa4gB+X9u7CxCS4LpotV917YS1QvOIF9lnRonSj1zNzFtbXkywrN8CgYEAwOpx/mR40ZvgZxNCq9DsIdrSZYAFFKpw0xy0OtF1PpuwMaREoRabnlVw6Bb3Hofg50XA3JxemzAX6fB92ee+NfXfeL4UtC4vG1K9JyiXHtHq8p9Uw2W03ehIEeNa3xdoRRnLmD4VUpyfL19ViE2+7TM1Gd3TogjDT+AMOCSuq3MCgYBsurPH7gaq/LVT+mRAzgj4l8v4YUlwuGeTbIMJdvt7HXUWB4CDLH3U2CYnUpAQKrZyJok6ahEmIr1xiKggKP7lmmHL8eNo0icpHrtXfzi7Q8Q/PCpzs4dtioXTjaIkS5nNvzVyG/uL+RyuZmpsxrZ5dYM4KbAhchfwORMutxEZhwKBgQC5zpVw4jCEItBmNuTWO+nTScGvxTgfiXIVw+XLaQa2AJoZlhAL34yPWdffko79tv3lgweY9HsimZXO2rU8dbp8mo5c6ydhy8HPXUeWOcAkDSdv/ApWENW9jgYsRIC3swHY3Fl+Dv3Wjce8huQI3mjwaYvRmBhIToxfmHnscVhTBQKBgB9uciEHfz8hMI7ePrPo2PkyK/RbJDm3HnuWE2lFBp7MOUMlh53MXwv4dIRaYMbRrFuN1UIKEFxuKhWwTHSzZJufk/UENrha/81fpj2BoFsAKkEunKeETvaIh6fZSjec16h2+zxbzwkdS6b+yIYkSlaoAxmDYrMtae0C8G4e0YS9";
String pubKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2RZZISModRzproL3eTxRtvVK/nToDbeLmAVdmaVtHgNCwjXMeNCZvHySZKO7+t7XySzBd2PhhQjvAkDd8HRKB5Y0uvP6TFwvhxOMkMydTeBFcUobQWNeAI7ttRms1txSNrmyrZr0WpWfk79VIsO+yI/jFN/Pj2gxD+vh5UUKU1LD2IQq/VxgtEpf8Vs6w7SvafPwYkpdPGCKUFkRvN1FrY2+tq0j1MRVJbB2rIunWDnT8cDUh2sWLXf4yNaJVOaaTFB0zbAk/qcoicGQyW7bVG7dVW8WywKmOAPeQCCQa+SJ4BhfI1k8eEAwFVRuxz/f9Ecfog9hZJ+RgELkpS8qhQIDAQAB";
rsaSigner signer = new rsaSigner();
Map<String, Object> params = new HashMap<>();
params.put("app_id", "hxgmau9imt86qky9");
params.put("version", "1.0");
params.put("key_version", "admin");
params.put("time", Long.toString(System.currentTimeMillis() / 1000));
List<Map<String, String>> list = new ArrayList<>();
Map<String, String> item1 = new HashMap<>();
item1.put("chain", "eth");
item1.put("coin", "usdt_erc20");
item1.put("address", "0x111...2222");
item1.put("ledger_balance", "100");
list.add(item1);
params.put("list", list);
try {
params.put("sign", signer.genSign(params, priKey));
Gson gson = new GsonBuilder().create();
System.out.println("params = " + gson.toJson(params));
String res = doPost(baseUrl + "/reconcile/addressBalance", gson.toJson(params));
if (null == res) {
throw new RuntimeException("http error");
}
System.out.println("response = " + res);
JsonParser jp = new JsonParser();
JsonObject resEle = jp.parse(res).getAsJsonObject();
boolean retSignOK = signer.verifySign(resEle, resEle.get("sign").getAsString(), pubKey);
if (!retSignOK) {
throw new RuntimeException("verify response sign fail");
}
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("OK");
}
返回结果示例:
{
"status": 200,
"msg": "处理成功",
"data": {
"list": [
{
"chain": "eth",
"coin": "usdt_erc20",
"address": "0x111...2222",
"matched": true,
"ledger_amount": "100",
"onchain_balance": "100",
"note": "",
"difference": "0"
},
{
"chain": "btc",
"coin": "btc",
"address": "1bcd...zxc",
"matched": false,
"ledger_amount": "10",
"onchain_balance": "9",
"note": "",
"difference": "-1"
}
]
},
"date_time": "2022-07-22 18:36:36",
"time_stamp": 1658486196,
"sign": "uuYWvmoMqM5xh7aTcxspJmW78y8op5BBjYXp0XoqcqFXe+HrSGzxN2Ls6LA7SlfsNndCtS4AX1/J+2o1MWZw/HFVfRqtxu02AEfWhM5ZSiJfEtO8f47H2/EGcsKw/eK8nxOnYAyAKwG6Ia6L4KgYIXLwsGt6Dt0VYWADu+vEQEes83/c6+Tc8QdqpdnLbs2XXXkYkl5eijoja+QEMaENbx+DHxnsVZV0iRK5FcSQH9PdOIpWmC944BA2v0tnPQWb6WDnOTsw5xoVKiL57WGIeOaxepvjo6poi1a/+HYrowT4IcejZZHi9YW0iM4eNm8MPK0tloAQ8GWY7kVs9uEwOA=="
}
HTTP Request
POST: /reconcile/addressBalance
请求参数
| 参数名 | 必选 | 类型 | 说明 |
|---|---|---|---|
| 公共参数 | 是 | string | 公参指:签名(sign)、版本(version)、商户ID(app_id)、时间(time) |
| list.chain | 否 | string | 主链 |
| list.coin | 是 | string | 币种 |
| list.address | 是 | string | 链上账户地址 |
| list.ledger_balance | 否 | string | 账本余额 |
返回参数说明
| 参数名 | 类型 | 说明 |
|---|---|---|
| status | int | 状态码 |
| msg | string | 状态描述 |
| data | jsonObject | data |
| data.list | jsonArray | 具体每条记录 |
| data.list.chain | string | 主链 |
| data.list.coin | string | 币种 |
| data.list.address | string | 链上账户地址 |
| data.list.ledger_balance | string | 账本余额 |
| data.list.onchain_balance | string | 账本余额 |
| data.list.difference | string | 余额差值 |
| data.list.matched | bool | 余额是否匹配 |
| data.list.note | bool | 说明描述 |
| date_time | string | 响应时间 |
| time_stamp | int | 无时区的秒 |
| sign | string | 签名 |
检测内部账本记录的提币数据是否和其钱包链上的数据一致
$url = "http://api.xxxx.com/shopapi/reconcile/withdrawal";
$header = [
'Content-Type:application/json',
];
$params = [
"version" => "1.0",
"app_id" => "hxgmau9imt86qky9",
"time" => "1578736053",
"list" => [
[
"trade_id" => "W20250001",
"chain" => "eth",
"coin" => "usdt_erc20",
"from_address" => "0x111...222",
"to_address" => "0x111...333",
"txid" => "0x123...321",
"ledger_amount" => "100"
],
[
"trade_id" => "W20250002",
"chain" => "btc",
"coin" => "btc",
"from_address" => "bc1q...3cyx",
"to_address" => "bc1q...0cur",
"txid" => "dd8a...7ff8",
"ledger_amount" => "100"
]
],
"sign" => "dLtK+uiPcnxt2ACKMbBqQ6wI5ttAvesOHzK5ybVID1R6hqYPDTkagl7Tsjr5iLJafehcSLTZyJLtCRI8O2CtIWQUUroGXBneHZC486NUi/4FMOQs0FaAgm17pWlbhX5/96cWXXXMVeoe3IZFKaFNYSWaA14v3RcdDU6QDE/9ixGiSJ0DIxm9NKA0+RkbIFbyYeuFn8d63OcjmUhv7tsOE6rKCc3Q2yi7Qe9i6BNAQFYMFATztb18MsxsBHKUxNqklqyVnl0ofETAHmQhfOHLmungOJQnOqAAuwfmRtg50Qci5F+R2mXeqjmIXko/u3E+DLYW1ygDBp3afKZmU4PwmA=="
];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
$return = curl_exec($ch);
print_r($return);
var url = "http://api.xxxx.com/shopapi/reconcile/withdrawal"
data := map[string]string{
"version": "1.0",
"app_id": "hxgmau9imt86qky9",
"time": "1578736053",
"list": [
{
"trade_id": "W20250001",
"chain": "eth",
"coin": "usdt_erc20",
"from_address": "0x111...222",
"to_address": "0x111...333",
"txid": "0x123...321",
"ledger_amount": "100"
},
{
"trade_id": "W20250002",
"chain": "btc",
"coin": "btc",
"from_address": "bc1q...3cyx",
"to_address": "bc1q...0cur",
"txid": "dd8a...7ff8",
"ledger_amount": "100"
}
],
"sign": "OTA8utI8y8G93p7RPCyb4qIilFQ0B4Aq4iUjhaXWK9m2kgektqlHOASDKXT2VE7NPNysrGycYlVfjDR2WGZn1G66phHo3qa9CcCNpG9klOBEuBEMjiVbb/d8AXcxEzvQr9OCwNsikyxonyzLiY/lsNHeGm9cC5eRvlNLdUSVBipH+ajPd0lDHCayZPs1eCMfbm/xnf8e2lfy6z0UPOpHGfyX/0+hz99Ir5Xnx+0sBBzyZZJxKm4ROid5aDv/9m9guILpURae+Yw/IrkYF4uAKGX+/44cBvtTRQSdX76CAOBSiywZa6BAgDYBLRtkAPM+i+vwNzFBovqHUvI+4Ponaw==",
}
dataType, _ := json.Marshal(data)
resp, err := http.Post(url, "application/json", strings.NewReader(string(dataType)))
if err != nil {
fmt.Println(err)
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println(err)
}
fmt.Println(string(body))
let HTTP = require('http')
let postData = {
"version": "1.0",
"app_id": "hxgmau9imt86qky9",
"time": "1578736053",
"list": [
{
"trade_id": "W20250001",
"chain": "eth",
"coin": "usdt_erc20",
"from_address": "0x111...222",
"to_address": "0x111...333",
"txid": "0x123...321",
"ledger_amount": "100"
},
{
"trade_id": "W20250002",
"chain": "btc",
"coin": "btc",
"from_address": "bc1q...3cyx",
"to_address": "bc1q...0cur",
"txid": "dd8a...7ff8",
"ledger_amount": "100"
}
],
"sign": "OTA8utI8y8G93p7RPCyb4qIilFQ0B4Aq4iUjhaXWK9m2kgektqlHOASDKXT2VE7NPNysrGycYlVfjDR2WGZn1G66phHo3qa9CcCNpG9klOBEuBEMjiVbb/d8AXcxEzvQr9OCwNsikyxonyzLiY/lsNHeGm9cC5eRvlNLdUSVBipH+ajPd0lDHCayZPs1eCMfbm/xnf8e2lfy6z0UPOpHGfyX/0+hz99Ir5Xnx+0sBBzyZZJxKm4ROid5aDv/9m9guILpURae+Yw/IrkYF4uAKGX+/44cBvtTRQSdX76CAOBSiywZa6BAgDYBLRtkAPM+i+vwNzFBovqHUvI+4Ponaw==",
};
let POST_OPTIONS = {
port: 80,
host: "api.xxxx.com",
path: "/shopapi/reconcile/withdrawal",
method: 'POST',
headers: {
"Content-Type": "application/json; charset=utf-8"
}
};
const REQUEST = HTTP.request(POST_OPTIONS,function (res) {
let data = []
res.on('data', chunk => {
data.push(...chunk)
})
res.on('end', () => {
let _date = JSON.parse( new TextDecoder().decode(new Uint8Array(data)))
console.log(_date)
})
});
REQUEST.setTimeout(6000)
REQUEST.write(JSON.stringify(postData), 'utf8')
REQUEST.end()
public static void main(String[] args) {
// 完整实例请查看"签名规则"中的Java示例代码
String baseUrl = "http://api.xxxx.com/shopapi";
String priKey = "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCtdgvcfozY7fe/x6UlXR/Fff8+wX++CiG05YVRafDe90O8y5KJAMZ156TgajEUXSRyKZqASz7iVoMAcu5FqfK1KuOOdjTAg0LFe/twIZvKmAqHcCSS2pjUXk0fTpZEgQ5lmDCK12Mg07YXvr+BeHjF+kBpwRJMPMG/+DGBDYNFNeRSJqWyopt6yyF528soAykHIUQ7TTultJV5IPCrvjRQQrGdJ/QtCdE0vZg+tA09nFN7AqgraU99kIvzyS0sqysj+pP1SJRmTRSGtlVAO3mILfkXOekZl1KD60G7CF+7BIaaW83FPD55tZhAGhnbLMYyiq7OiIyU61LTRcNSaJ0tAgMBAAECggEBAIGgGKcSzxCBbMYdXLV6TPbZ/HeaRGrwyVWUu7cmc0E8CJu6iWvmb2jGzbiCwuCT5luF6ZZ8JKchvU4FlTfsE5r9TQY2IZ/Ht4s65qBaDUEts5iY3kv8HX9+ZSXDJZpV0ztqqsPmx4ZNj+NYwWXwcFiKdb5R8OmV8bgSsnPddD6wFhwewglUOBPRAjropHE4sqk1Vam6q1MlFq5kiekMn/CItyFYFFzST/ruqAtVTp7YIvazAMrfCKH+pvXWk6pYNHZmL/JZey0GglRyJ1nItiqL33X8Lji056FcbAclidq022h/KPLEJpZk6irWqYdqYZeF6YMLHtdZFDkTZ/hXY+UCgYEA5i794UTQ1Kd6K+iui/S8K5H8nGdiXb3+uZ5j5VKYfbRmzXhAdVYisYe8czeTECxhH+MeHgM4tLR4ifx9q60ylvZxl9Fav1p6EaE36YcvGVmpm7Gm3q6QDDBa4gB+X9u7CxCS4LpotV917YS1QvOIF9lnRonSj1zNzFtbXkywrN8CgYEAwOpx/mR40ZvgZxNCq9DsIdrSZYAFFKpw0xy0OtF1PpuwMaREoRabnlVw6Bb3Hofg50XA3JxemzAX6fB92ee+NfXfeL4UtC4vG1K9JyiXHtHq8p9Uw2W03ehIEeNa3xdoRRnLmD4VUpyfL19ViE2+7TM1Gd3TogjDT+AMOCSuq3MCgYBsurPH7gaq/LVT+mRAzgj4l8v4YUlwuGeTbIMJdvt7HXUWB4CDLH3U2CYnUpAQKrZyJok6ahEmIr1xiKggKP7lmmHL8eNo0icpHrtXfzi7Q8Q/PCpzs4dtioXTjaIkS5nNvzVyG/uL+RyuZmpsxrZ5dYM4KbAhchfwORMutxEZhwKBgQC5zpVw4jCEItBmNuTWO+nTScGvxTgfiXIVw+XLaQa2AJoZlhAL34yPWdffko79tv3lgweY9HsimZXO2rU8dbp8mo5c6ydhy8HPXUeWOcAkDSdv/ApWENW9jgYsRIC3swHY3Fl+Dv3Wjce8huQI3mjwaYvRmBhIToxfmHnscVhTBQKBgB9uciEHfz8hMI7ePrPo2PkyK/RbJDm3HnuWE2lFBp7MOUMlh53MXwv4dIRaYMbRrFuN1UIKEFxuKhWwTHSzZJufk/UENrha/81fpj2BoFsAKkEunKeETvaIh6fZSjec16h2+zxbzwkdS6b+yIYkSlaoAxmDYrMtae0C8G4e0YS9";
String pubKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2RZZISModRzproL3eTxRtvVK/nToDbeLmAVdmaVtHgNCwjXMeNCZvHySZKO7+t7XySzBd2PhhQjvAkDd8HRKB5Y0uvP6TFwvhxOMkMydTeBFcUobQWNeAI7ttRms1txSNrmyrZr0WpWfk79VIsO+yI/jFN/Pj2gxD+vh5UUKU1LD2IQq/VxgtEpf8Vs6w7SvafPwYkpdPGCKUFkRvN1FrY2+tq0j1MRVJbB2rIunWDnT8cDUh2sWLXf4yNaJVOaaTFB0zbAk/qcoicGQyW7bVG7dVW8WywKmOAPeQCCQa+SJ4BhfI1k8eEAwFVRuxz/f9Ecfog9hZJ+RgELkpS8qhQIDAQAB";
rsaSigner signer = new rsaSigner();
Map<String, Object> params = new HashMap<>();
params.put("app_id", "hxgmau9imt86qky9");
params.put("version", "1.0");
params.put("key_version", "admin");
params.put("time", Long.toString(System.currentTimeMillis() / 1000));
List<Map<String, String>> list = new ArrayList<>();
Map<String, String> item1 = new HashMap<>();
item1.put("trade_id", "W20250001");
item1.put("chain", "eth");
item1.put("coin", "usdt_erc20");
item1.put("from_address", "0x111...2222");
item1.put("to_address", "0x111...333");
item1.put("ledger_balance", "100");
list.add(item1);
params.put("list", list);
try {
params.put("sign", signer.genSign(params, priKey));
Gson gson = new GsonBuilder().create();
System.out.println("params = " + gson.toJson(params));
String res = doPost(baseUrl + "/reconcile/withdrawal", gson.toJson(params));
if (null == res) {
throw new RuntimeException("http error");
}
System.out.println("response = " + res);
JsonParser jp = new JsonParser();
JsonObject resEle = jp.parse(res).getAsJsonObject();
boolean retSignOK = signer.verifySign(resEle, resEle.get("sign").getAsString(), pubKey);
if (!retSignOK) {
throw new RuntimeException("verify response sign fail");
}
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("OK");
}
返回结果示例:
{
"status": 200,
"msg": "处理成功",
"data": {
"list": [
{
"trade_id": "W20250001",
"chain": "eth",
"coin": "usdt_erc20",
"from_address": "0x111...222",
"to_address": "0x111...333",
"txid": "0x123...321",
"matched": true,
"ledger_amount": "100.00",
"onchain_amount": "100.00",
"difference": "0",
"note": ""
},
{
"trade_id": "W20250002",
"chain": "btc",
"coin": "btc",
"from_address": "bc1q...3cyx",
"to_address": "bc1q...0cur",
"txid": "dd8a...7ff8",
"matched": false,
"onchain_amount": "99.12",
"ledger_amount": "100.00",
"difference": "-0.88",
"note": ""
}
]
},
"date_time": "2022-07-22 18:36:36",
"time_stamp": 1658486196,
"sign": "uuYWvmoMqM5xh7aTcxspJmW78y8op5BBjYXp0XoqcqFXe+HrSGzxN2Ls6LA7SlfsNndCtS4AX1/J+2o1MWZw/HFVfRqtxu02AEfWhM5ZSiJfEtO8f47H2/EGcsKw/eK8nxOnYAyAKwG6Ia6L4KgYIXLwsGt6Dt0VYWADu+vEQEes83/c6+Tc8QdqpdnLbs2XXXkYkl5eijoja+QEMaENbx+DHxnsVZV0iRK5FcSQH9PdOIpWmC944BA2v0tnPQWb6WDnOTsw5xoVKiL57WGIeOaxepvjo6poi1a/+HYrowT4IcejZZHi9YW0iM4eNm8MPK0tloAQ8GWY7kVs9uEwOA=="
}
HTTP Request
POST: /reconcile/withdrawal
请求参数
| 参数名 | 必选 | 类型 | 说明 |
|---|---|---|---|
| 公共参数 | 是 | string | 公参指:签名(sign)、版本(version)、商户ID(app_id)、时间(time) |
| list.trade_id | 是 | string | 商户提现单号 |
| list.coin | 否 | string | 币种 |
| list.ledger_amount | 否 | string | 转账数量 |
| list.from_address | 否 | string | 提现单链上出款账户地址 |
| list.to_address | 否 | string | 提现单链上收款账户地址 |
| list.txid | 否 | string | 提现单链上交易hash |
返回参数说明
| 参数名 | 类型 | 说明 |
|---|---|---|
| status | int | 状态码 |
| msg | string | 状态描述 |
| data | jsonObject | data |
| data.list | jsonArray | 具体每条记录 |
| data.list.trade_id | string | 商户提现单号 |
| data.list.chain | string | 主链 |
| data.list.coin | string | 币种 |
| data.list.from_address | string | 提现单链上出款账户地址 |
| data.list.to_address | string | 提现单链上收款账户地址 |
| data.list.ledger_amount | string | 账单记录转账数量 |
| data.list.onchain_amount | string | 链上交易转账数量 |
| data.list.difference | string | 数量差值 |
| data.list.matched | bool | 交易数量是否匹配 |
| data.list.note | string | 说明描述 |
| date_time | string | 响应时间 |
| time_stamp | int | 无时区的秒 |
| sign | string | 签名 |