外部地址
新增外部地址
$url = "http://api.xxxx.com/shopapi/outer_address/add";
$header = [
'Content-Type:application/json',
];
$params = [
"addresses": [
"0xeb482aee7b329058ec81223f98488d28e12b15a2",
"0x4d5fa5df5963405d5ecc40ea25c08fbed129004f"
],
"app_id": "hxgmau9imt86qky9",
"chain": "bnb_bsc",
"key_version": "admin",
"sign": "OZYwC4br4wti9PFst9X5QBuxRh3voVn29pkzxEUTc92npPoVa1plnsYCcTzvAr7sy9a8dk63My2dlNhnzsypI4XvLT0/zSboC+MCtM9Q8Q8l1B4lb4nZMBkAUZFfb/80UtEBUGOni2KfnU/ciHNOsE+f9bs8i+AnRypstHnajDEuhoKEqSwmOkeYA+PRtA5SVvUdvIXM6CMnlmWokYzRys6kvb9XET1gBo9HBMI5YdTZnLavCDky3mPv5jTyiIzN4NScnxC7hIepolEUbB8smsz3oNtXSDpzZDhzm9ZjJ/5ZWEbEvK413GmsV4fodnJHJdJM+EhvAWTgxVLIbyCuFA==",
"time": 1665478775,
"version": "1.0"
];
$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/outer_address/add"
data := map[string]string{
"addresses": [
"0xeb482aee7b329058ec81223f98488d28e12b15a2",
"0x4d5fa5df5963405d5ecc40ea25c08fbed129004f"
],
"app_id": "hxgmau9imt86qky9",
"chain": "bnb_bsc",
"key_version": "admin",
"sign": "OZYwC4br4wti9PFst9X5QBuxRh3voVn29pkzxEUTc92npPoVa1plnsYCcTzvAr7sy9a8dk63My2dlNhnzsypI4XvLT0/zSboC+MCtM9Q8Q8l1B4lb4nZMBkAUZFfb/80UtEBUGOni2KfnU/ciHNOsE+f9bs8i+AnRypstHnajDEuhoKEqSwmOkeYA+PRtA5SVvUdvIXM6CMnlmWokYzRys6kvb9XET1gBo9HBMI5YdTZnLavCDky3mPv5jTyiIzN4NScnxC7hIepolEUbB8smsz3oNtXSDpzZDhzm9ZjJ/5ZWEbEvK413GmsV4fodnJHJdJM+EhvAWTgxVLIbyCuFA==",
"time": 1665478775,
"version": "1.0",
}
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 = {
"addresses": [
"0xeb482aee7b329058ec81223f98488d28e12b15a2",
"0x4d5fa5df5963405d5ecc40ea25c08fbed129004f"
],
"app_id": "hxgmau9imt86qky9",
"chain": "bnb_bsc",
"key_version": "admin",
"sign": "OZYwC4br4wti9PFst9X5QBuxRh3voVn29pkzxEUTc92npPoVa1plnsYCcTzvAr7sy9a8dk63My2dlNhnzsypI4XvLT0/zSboC+MCtM9Q8Q8l1B4lb4nZMBkAUZFfb/80UtEBUGOni2KfnU/ciHNOsE+f9bs8i+AnRypstHnajDEuhoKEqSwmOkeYA+PRtA5SVvUdvIXM6CMnlmWokYzRys6kvb9XET1gBo9HBMI5YdTZnLavCDky3mPv5jTyiIzN4NScnxC7hIepolEUbB8smsz3oNtXSDpzZDhzm9ZjJ/5ZWEbEvK413GmsV4fodnJHJdJM+EhvAWTgxVLIbyCuFA==",
"time": 1665478775,
"version": "1.0",
};
let POST_OPTIONS = {
port: 80,
host: "api.xxxx.com",
path: "/shopapi/outer_address/add",
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("chain", "bnb_bsc");
List<String> addresses = new ArrayList<>();
addresses.add("0x4d5fa5df5963405d5ecc40ea25c08fbed129004f");
addresses.add("0xeb482aee7b329058ec81223f98488d28e12b15a2");
params.put("addresses", addresses);
try {
params.put("sign", signer.genSign(params, priKey));
Gson gson = new GsonBuilder().create();
System.out.println("params = " + gson.toJson(params));
String res = doPost(baseUrl + "/outer_address/add", 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": {
"fail_addresses": []
},
"date_time": "2022-10-11 16:59:35",
"time_stamp": 1665478775,
"sign": "AcNiY8kJTb/L2fZqtN0kVIVazbMdr/jiYSDetNBIlmEbEzwFhT7ZJxx15AzUcU62Ptnyb0wZF+xN/h/2YPo1XuMNVNcQdRvmdLfeDM8Pnk4+QCVnQjzqJ8fEjRTdkoujMS3VpywGJxL8ncMDMgmbnSWpXWMYprupQb27sKhPak7mSuib7xozc2/6D9T+oWxKIRMfvV7ZPq6p24PqUt1R9z6z2e3kxZanx/MMv2XljrAEMkI8iMbwQ910gNwuKkYP2GDCEXMBgzWMxJd2JdIEFexN+DFUk/pP1S5B+EPAwpoSB8Brflmpr1XAfwQKdocq+lDWRVI/HNEExcfuLdtUFA=="
}
- 商户提交想要监控交易的地址到平台
HTTP Request
POST : /outer_address/add
请求参数
| 参数名 | 必选 | 类型 | 说明 |
|---|---|---|---|
| 公共参数 | 是 | string | 公参指:签名(sign)、版本(version)、商户ID(app_id)、时间(time) |
| chain | 是 | string | 12个字符以内,地址所属主链 |
| addresses | 是 | string数组 | 地址,数组长度限制不超过100个 |
返回参数说明
| 参数名 | 类型 | 说明 |
|---|---|---|
| status | int | 状态码 |
| msg | string | 状态描述 |
| data | jsonObject | 具体见下面 “data细节说明”。 |
| data.fail_addresses | string数组 | 保存出错的地址,全部保存成功则该值为空 |
| date_time | string | 响应时间 |
| time_stamp | int | 响应时间单位秒 |
| sign | string | 签名 |
删除外部地址
$url = "http://api.xxxx.com/shopapi/outer_address/delete";
$header = [
'Content-Type:application/json',
];
$params = [
"addresses": [
"0xeb482aee7b329058ec81223f98488d28e12b15a2",
"0x4d5fa5df5963405d5ecc40ea25c08fbed129004f"
],
"app_id": "hxgmau9imt86qky9",
"chain": "bnb_bsc",
"key_version": "admin",
"sign": "OZYwC4br4wti9PFst9X5QBuxRh3voVn29pkzxEUTc92npPoVa1plnsYCcTzvAr7sy9a8dk63My2dlNhnzsypI4XvLT0/zSboC+MCtM9Q8Q8l1B4lb4nZMBkAUZFfb/80UtEBUGOni2KfnU/ciHNOsE+f9bs8i+AnRypstHnajDEuhoKEqSwmOkeYA+PRtA5SVvUdvIXM6CMnlmWokYzRys6kvb9XET1gBo9HBMI5YdTZnLavCDky3mPv5jTyiIzN4NScnxC7hIepolEUbB8smsz3oNtXSDpzZDhzm9ZjJ/5ZWEbEvK413GmsV4fodnJHJdJM+EhvAWTgxVLIbyCuFA==",
"time": 1665478775,
"version": "1.0"
];
$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/outer_address/delete"
data := map[string]string{
"addresses": [
"0xeb482aee7b329058ec81223f98488d28e12b15a2",
"0x4d5fa5df5963405d5ecc40ea25c08fbed129004f"
],
"app_id": "hxgmau9imt86qky9",
"chain": "bnb_bsc",
"key_version": "admin",
"sign": "OZYwC4br4wti9PFst9X5QBuxRh3voVn29pkzxEUTc92npPoVa1plnsYCcTzvAr7sy9a8dk63My2dlNhnzsypI4XvLT0/zSboC+MCtM9Q8Q8l1B4lb4nZMBkAUZFfb/80UtEBUGOni2KfnU/ciHNOsE+f9bs8i+AnRypstHnajDEuhoKEqSwmOkeYA+PRtA5SVvUdvIXM6CMnlmWokYzRys6kvb9XET1gBo9HBMI5YdTZnLavCDky3mPv5jTyiIzN4NScnxC7hIepolEUbB8smsz3oNtXSDpzZDhzm9ZjJ/5ZWEbEvK413GmsV4fodnJHJdJM+EhvAWTgxVLIbyCuFA==",
"time": 1665478775,
"version": "1.0",
}
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 = {
"addresses": [
"0xeb482aee7b329058ec81223f98488d28e12b15a2",
"0x4d5fa5df5963405d5ecc40ea25c08fbed129004f"
],
"app_id": "hxgmau9imt86qky9",
"chain": "bnb_bsc",
"key_version": "admin",
"sign": "OZYwC4br4wti9PFst9X5QBuxRh3voVn29pkzxEUTc92npPoVa1plnsYCcTzvAr7sy9a8dk63My2dlNhnzsypI4XvLT0/zSboC+MCtM9Q8Q8l1B4lb4nZMBkAUZFfb/80UtEBUGOni2KfnU/ciHNOsE+f9bs8i+AnRypstHnajDEuhoKEqSwmOkeYA+PRtA5SVvUdvIXM6CMnlmWokYzRys6kvb9XET1gBo9HBMI5YdTZnLavCDky3mPv5jTyiIzN4NScnxC7hIepolEUbB8smsz3oNtXSDpzZDhzm9ZjJ/5ZWEbEvK413GmsV4fodnJHJdJM+EhvAWTgxVLIbyCuFA==",
"time": 1665478775,
"version": "1.0",
};
let POST_OPTIONS = {
port: 80,
host: "api.xxxx.com",
path: "/shopapi/outer_address/delete",
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("chain", "bnb_bsc");
List<String> addresses = new ArrayList<>();
addresses.add("0x4d5fa5df5963405d5ecc40ea25c08fbed129004f");
addresses.add("0xeb482aee7b329058ec81223f98488d28e12b15a2");
params.put("addresses", addresses);
try {
params.put("sign", signer.genSign(params, priKey));
Gson gson = new GsonBuilder().create();
System.out.println("params = " + gson.toJson(params));
String res = doPost(baseUrl + "/outer_address/delete", 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": [],
"date_time": "2022-10-11 16:59:35",
"time_stamp": 1665478775,
"sign": "AcNiY8kJTb/L2fZqtN0kVIVazbMdr/jiYSDetNBIlmEbEzwFhT7ZJxx15AzUcU62Ptnyb0wZF+xN/h/2YPo1XuMNVNcQdRvmdLfeDM8Pnk4+QCVnQjzqJ8fEjRTdkoujMS3VpywGJxL8ncMDMgmbnSWpXWMYprupQb27sKhPak7mSuib7xozc2/6D9T+oWxKIRMfvV7ZPq6p24PqUt1R9z6z2e3kxZanx/MMv2XljrAEMkI8iMbwQ910gNwuKkYP2GDCEXMBgzWMxJd2JdIEFexN+DFUk/pP1S5B+EPAwpoSB8Brflmpr1XAfwQKdocq+lDWRVI/HNEExcfuLdtUFA=="
}
- 删除已加入交易监控的地址
HTTP Request
POST : /outer_address/delete
请求参数
| 参数名 | 必选 | 类型 | 说明 |
|---|---|---|---|
| 公共参数 | 是 | string | 公参指:签名(sign)、版本(version)、商户ID(app_id)、时间(time) |
| chain | 是 | string | 12个字符以内,地址所属主链 |
| addresses | 是 | string数组 | 地址,数组长度限制不超过100个 |
返回参数说明
| 参数名 | 类型 | 说明 |
|---|---|---|
| status | int | 状态码 |
| msg | string | 状态描述 |
| data | jsonObject | 无具体数据,返回空 |
| date_time | string | 响应时间 |
| time_stamp | int | 响应时间单位秒 |
| sign | string | 签名 |
外部地址交易变动回调通知
$url = "具体回调地址,由商户提供给平台方";
$header = [
'Content-Type:application/json',
];
$params = [
"data": {
"address": "0xeb482aee7b329058ec81223f98488d28e12b15a2",
"amount": "0.00013556",
"chain": "bnb_bsc",
"coin": "bnb_bsc",
"confirm_count": 12,
"gas_fee": "0.000105",
"status": 1,
"time": 1665479732,
"token_address": "",
"transaction_type": 2,
"txid": "0x735dc8becd0d5dc0023b526584b75c8772551fc9268668991608dadc69facb39",
},
"sign": "Yyyyg==",
];
$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 = "具体回调地址,由商户提供给平台方"
data := map[string]interface{}{
"data": {
"address": "0xeb482aee7b329058ec81223f98488d28e12b15a2",
"amount": "0.00013556",
"chain": "bnb_bsc",
"coin": "bnb_bsc",
"confirm_count": 12,
"gas_fee": "0.000105",
"status": 1,
"time": 1665479732,
"token_address": "",
"transaction_type": 2,
"txid": "0x735dc8becd0d5dc0023b526584b75c8772551fc9268668991608dadc69facb39",
},
"sign": "Yyyyg==",
}
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 = {
"data": {
"address": "0xeb482aee7b329058ec81223f98488d28e12b15a2",
"amount": "0.00013556",
"chain": "bnb_bsc",
"coin": "bnb_bsc",
"confirm_count": 12,
"gas_fee": "0.000105",
"status": 1,
"time": 1665479732,
"token_address": "",
"transaction_type": 2,
"txid": "0x735dc8becd0d5dc0023b526584b75c8772551fc9268668991608dadc69facb39",
},
"sign": "Yyyyg==",
};
let POST_OPTIONS = {
port: 80,
host: "具体回调地址,由商户提供给平台方",
path: "",
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 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 = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArXYL3H6M2O33v8elJV0fxX3/PsF/vgohtOWFUWnw3vdDvMuSiQDGdeek4GoxFF0kcimagEs+4laDAHLuRanytSrjjnY0wINCxXv7cCGbypgKh3AkktqY1F5NH06WRIEOZZgwitdjINO2F76/gXh4xfpAacESTDzBv/gxgQ2DRTXkUialsqKbesshedvLKAMpByFEO007pbSVeSDwq740UEKxnSf0LQnRNL2YPrQNPZxTewKoK2lPfZCL88ktLKsrI/qT9UiUZk0UhrZVQDt5iC35FznpGZdSg+tBuwhfuwSGmlvNxTw+ebWYQBoZ2yzGMoquzoiMlOtS00XDUmidLQIDAQAB";
rsaSigner signer = new rsaSigner();
Map<String, Object> data = new HashMap<>();
data.put("address", "0xeb482aee7b329058ec81223f98488d28e12b15a2");
data.put("amount", "0.00013556");
data.put("chain", "bnb_bsc");
data.put("coin", "bnb_bsc");
data.put("confirm_count", 12);
data.put("gas_fee", "0.000105");
data.put("status", 1);
data.put("time", 1665479732);
data.put("token_address", "");
data.put("transaction_type", 2);
data.put("txid", "0x735dc8becd0d5dc0023b526584b75c8772551fc9268668991608dadc69facb39");
try {
Map<String, Object> params = new HashMap<>();
params.put("data", data);
params.put("sign", signer.genSign(data, priKey));
Gson gson = new GsonBuilder().create();
System.out.println("params = " + gson.toJson(params));
String res;
// platform request shop callback API
// res = doPost("http://api.shophost.com/outer_address/recharge/callback", gson.toJson(params));
// if (null == res) {
// throw new RuntimeException("http error");
// }
// mock response from shop callback API
{
res = """
{
"status": 200,
"msg":"请求成功",
"sign": "Yyyyg==",
"data": {
"success_data": "success"
}
}
""";
}
System.out.println("response = " + res);
JsonParser jp = new JsonParser();
JsonObject resEle = jp.parse(res).getAsJsonObject();
boolean retSignOK = signer.verifySign(resEle.get("data"), 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":"请求成功",
"sign": "Yyyyg==",
"data": {
"success_data": "success"
}
}
- 商户加入监控的地址上发生交易,平台将请求该接口,由商户响应
- 若商户没有正确返回结果,平台将会重试请求,直到得到正确返回或者时间超过1小时。重试时间,第30秒、第1分钟、第3分钟、第7分钟、第15分钟、第25分钟、第40分钟、第60分钟。
HTTP Request
POST: 具体回调地址,由商户提供给平台方
请求参数
| 参数名 | 必选 | 类型 | 说明 |
|---|---|---|---|
| sign | 是 | string | 签名 |
| data | 是 | 对象 | 交易信息对象 |
| data.address | 是 | string | 商户监控的地址 |
| data.amount | 是 | string | 金额 |
| data.chain | 是 | string | 主链名 |
| data.coin | 是 | string | 币名 |
| data.confirm_count | 是 | int | 区块确认数 |
| data.gas_fee | 是 | string | 交易gas费 |
| data.status | 是 | int | 状态:0=待确认,1=已确认 |
| data.time | 是 | int | 交易区块的时间戳(单位秒) |
| data.token_address | 否 | string | 合约地址,主链币种该值为空 |
| data.transaction_type | 是 | int | 地址交易类型:1=转入,2=转出 |
| data.txid | 是 | string | 链上交易hash |
返回参数说明
| 参数名 | 必选 | 类型 | 说明 |
|---|---|---|---|
| status | 是 | int | 返回状态码,200为正常 |
| msg | 是 | string | 状态码描述 |
| data | 是 | null或JSONObjectString | 返回数据 |
| data.success_data | 是 | string | 业务上确认该回调处理成功,如果返回不是'success',平台将间隔一段时间后重试请求 |
| sign | 是 | string | 签名 |