The MPC Custom Source-Available Code Framework
CipherBC is introducing the Source-Available MPC Framework, a selected open initiative designed to provide transparency for auditors and partners while preserving the integrity of our core IP. Unlike traditional open-source projects, this framework follows an non-commercial license, allowing authorized institutions, compliance teams, and academic researchers to review, analyze, and validate our MPC-HSM Key Architecture under NDA.
With USD 1.17B+ in total transaction volume and USD 15B+ in assets under custody, this Source-Available MPC Framework delivers real, enterprise-grade advantages:
Flexibility & Transparency: Introduces a Source-Available model that adapts to the security requirements and privacy expectations of each enterprise partner. Access scopes, reviewed modules, and technical insight levels are customized on demand, guaranteeing that collaboration happens in a secured, private, and mutually trusted environment, enabling faster integration.
Security & Compliance: By granting access only to certified third-party auditors, security teams, and regulated partners, CipherBC strengthens code reliability and resilience through independent validation, establishing CipherBC as a foundation for bank-grade audits, institutional due-diligence, and regulatory scrutiny.
Collaborative IP Protection: Selective access is extended to academic institutions for non-commercial cryptography research and theoretical validation, enabling continuous knowledge exchange and fosters technological evolution, while custom licensing and legal safeguards ensure CipherBC’s core intellectual property and commercial value remain fully preserved.
Technology Architecture
Built on a professional Omnibus Wallet architecture, the project features a clean and modular code structure, enabling partners to perform systematic, comprehensive, and high-efficiency security audits with confidence.
Further Notes & Information
Please note that our project does not follow the traditional open-source definition set by the Open Source Initiative (OSI). It is a source-available project designed for controlled knowledge sharing and collaboration with trusted partners, rather than unrestricted community participation.
Access to our project source code requires an application. Please have your GitHub account ready and contact support@cipherbc.com for authorization.
To have a full understanding of this framework, please go visit: https://github.com/cipherbc1024/OpenSource
Welcome to CipherBC API
Preparing for API
1 Register APP_ID
Contact customer service to register for APP_ID,and provide relevant qualification information. Example:Company Name,domain name,IP, first person in charge and other business information needed。
2 Provide a list of main chains and contract currencies that needs to be supported.
Coin require basic information such as coin address、main chain、precision、name and other relevant information will be provided to business coordinator.
3 Debugging API test environment
API adopting RSA2048bit for two-way signature verification to ensures the credibility of communication. Merchants are required to give the public key to the platform, where platform uses it to verify request parameters sent to the platform. Merchants need to obtain the platform public key in advance, which can be used to verify platform response.
Supported Coin
Signature Regulations
<?php
$obj = new obj();
$obj->coin_list();
class obj
{
public $baseUrl = 'http://api.xxxxx.com/shopapi';
public $priKey = "-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC8d6RGCeQkrobx
+4xO1jXnHwiMU48UyOaRaNW2FMQrN9DcK/T2h58FyuA7kYN0CVNFEnaZQS9S8Nur
Tl0lOVJcbwKfCSnu9nmFYDvPWqlCTqQW3F83sKNi9IWrMFFny3CX35eUHpeJahE2
R9wma2oJIFJv3ux/I3+w8fQQ6zMPIqpDx4Tcu9sCVpot+/siWJDpyiQBlbXfcxuH
YOePUGx+tJ5HLXtJOUtPcgyhFTXRmW9r17DnnsjrT5Vc50IbN//JXbvr96eexQ/e
/IXHZP6MZWdthjuv9y2TaxS+JMnpKLrXfgazoQEsKmchAsTLEyX6tHG5tHq+3MaK
BSTFCoHHAgMBAAECggEAYodR1GPbZ+nuFpfhlF2ctIWe3G3awYz+LUrXX2ef3tBB
WrmISVJBqq+TZtD+Hi254MR0SE6xxPSygu5m98zt5/EJN8d8qrckdLwIyLCnCElA
s8rl5KFt6Y/YSdTq2g6bgGqePgt4QZi4At6yk0tYlgjV0DKFBTqzyPfVFvs/KEuZ
o8le0XjgJA+Rnti35Gi5UDL1Tn9LcmCU/JcdpksFgPvU/wPmlNb8azM68ougXcrf
hBebSRWbS0F2OXRJd7+hrTq+pwTNIH+IyzsUZHQCcH0tFe2Q304oDuVuwX5VxB3S
tYG8+LoECW1nKalJbolkmdRqVxZRXG/Ho8/aRCHBcQKBgQDBmoZzUaKU2F4Sa6P+
5vCQ5RAAiAATWao/WYfL9BBVnLzbkbzget3BNdJcJZKp1Avh6F/jeB0xUOD0aFgm
rJAZjVAFu77damKWwiEPxKfdgSbBedV/KWCMASzr4m4cdYKOcmlLFsh+Du2+oZW5
3Mn35hyfbTf1OyYxrvOVrhSu+wKBgQD5NVfxWTBsugAE++d4CCy8TUL7QCqb1I1v
EQ0FNdZsmXslPbCFlJ5UCFJXAF6s2x0MDKCl7y2ixlDo31H7DI6xlOP5kjYon7wr
mB0U2bclGtlJ3FvCwDBFkfZykYZqPyey8A3D+kf4pnvZvn/0BgKfWCVSYnqEB4mp
BI5WhywOpQKBgH4Mio8YTn8UZCMgG/UBDQ15ZbLC2THABj0aoHRkoiHrW3ala1DI
DgsWbLB78gJKQbZCofOqp28NVnkqWoJLhcJtI/Wnp/vmoOvA1t+6TQTFaqM7HIqf
OPHObh3iHYi/5VGzIeS2n7CbLaUY9S++lWymUGpoJK+wZAyi+IqyfVrzAoGAPKmI
g75zNDQ+pvfuy2AqC5g/Esv200H1P7EF21vUm1DtEg6nNo0L0WbJLFZxtWAM/Q7h
2CKVmEbwEQ+zdAoFfiLBL9Iwjsj7VB1ODvJES6ryc7FJQOnpljXGqPLVpm1DK6KV
pzv4YwWbplBh8zO3VbRuOVSxgAwZrWPnhhaXWeUCgYEAwVHYXN1qGTBS1uyrldDr
OMuXyfvE7lbfJlg2EfG2A7PtTooPkh1IbRjlJ8ACbiadM0pYhnGGPk0D1WSKvRxU
SmSc6PgW2weANQ8QCemo2V/zZ0DlWFZDdCV+7jMbAFBhQHcVh0qUr+uNyntjLTjj
OPdMSnhKLoKtleu+NiMIogc=
-----END PRIVATE KEY-----";
public $pubKey = "-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAk7K9s+r82lofBFaj3KWp
o/5E1ryDPDlLGZ4Rv68DcoCxV/bv0IvYX3cleC0WvTpwbdTpGtLjS6RHj89JREhi
svv5qmk5YTfjEqd3RmtYDmOVz2Ry6E76wLh9qi1pqpneMGr3shvEzZC6gkieXRCA
MOlEYbE7TSzxxDJxmovdeElowdRZcvwwPLvh/BLmCn+H1MXfdx01c/eFpTvu8BZG
1m7AqDOqnaPcR1ru/ekJoIwotF1jCPM2E5kAbQQutNaeSXhLbkfom4bxqF2/ni6k
Cwnz3fbBYcXP3Ww3/AdI1dn0iLr6450qn72yBpDtQY8OZ7+Krff4Fa5jOBY7OHEN
FwIDAQAB
-----END PUBLIC KEY-----";
public function coin_list()
{
$data = $this->get_public_data();
$data["chain"] = "eth";
$data["coin"] = "eth";
$data['sign'] = Signature::encryption($data, $this->priKey);
$res = self::curlByPost($this->baseUrl . '/coin/list', $data);
print_r($res);
// verification
$resp = json_decode($res, true);
if (Signature::checkSignature($resp["sign"], $resp, $this->pubKey)) {
print_r("verification successful");
} else {
print_r("verification failed");
}
}
public static function curlByPost($url, $data = null, $timeout = 60)
{
$SSL = substr($url, 0, 8) == "https://" ? TRUE : FALSE;
$ch = curl_init();
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_URL, $url);
if ($SSL) {
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
}
$data = json_encode($data);
$headers = [
'Content-Type: application/json; charset=utf-8',
'Content-Length:' . strlen($data)
];
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$output = curl_exec($ch);
return $output;
}
public function get_public_data()
{
$data['app_id'] = "xxxxxx";
$data['version'] = '1.0';
$data['key_version'] = 'admin';
$data['time'] = time();
return $data;
}
}
class Signature
{
/**
* Private key signing
*
* @param $data
* @param $private_key
*/
public static function encryption($data, $private_key)
{
if (is_array($data))
$signString = self::getSignString($data);
else
$signString = $data;
$privKeyId = openssl_pkey_get_private($private_key);
$signature = '';
openssl_sign($signString, $signature, $privKeyId, OPENSSL_ALGO_MD5);
openssl_free_key($privKeyId);
return base64_encode($signature);
}
/**
* Use the other party's public key to verify the signature and check whether the signature matches
*
* @param $sign
* @param $data
* @param $public_key
* @return bool
*/
public static function checkSignature($sign, $data, $public_key)
{
$toSign = self::getSignString($data);
$publicKeyId = openssl_pkey_get_public($public_key);
$result = openssl_verify($toSign, base64_decode($sign), $publicKeyId, OPENSSL_ALGO_MD5);
openssl_free_key($publicKeyId);
return $result === 1 ? true : false;
}
public static function getSignString($data)
{
unset($data['sign']);
ksort($data);
reset($data);
$pairs = array();
foreach ($data as $k => $v) {
if (is_array($v)) $v = self::arrayToString($v);
$pairs[] = "$k=$v";
}
return implode('&', $pairs);
}
private static function arrayToString($data)
{
$str = '';
foreach ($data as $list) {
if (is_array($list)) {
$str .= self::arrayToString($list);
} else {
$str .= $list;
}
}
return $str;
}
}
package main
import (
"crypto"
"crypto/md5"
"crypto/rand"
"crypto/rsa"
"crypto/x509"
"encoding/base64"
"encoding/json"
"encoding/pem"
"errors"
"fmt"
"github.com/imroc/req"
"github.com/tidwall/gjson"
"sort"
"time"
)
var (
BaseUrl = "http://api.xxxxx.com/shopapi"
signPrivateKey = `-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC8d6RGCeQkrobx
+4xO1jXnHwiMU48UyOaRaNW2FMQrN9DcK/T2h58FyuA7kYN0CVNFEnaZQS9S8Nur
Tl0lOVJcbwKfCSnu9nmFYDvPWqlCTqQW3F83sKNi9IWrMFFny3CX35eUHpeJahE2
R9wma2oJIFJv3ux/I3+w8fQQ6zMPIqpDx4Tcu9sCVpot+/siWJDpyiQBlbXfcxuH
YOePUGx+tJ5HLXtJOUtPcgyhFTXRmW9r17DnnsjrT5Vc50IbN//JXbvr96eexQ/e
/IXHZP6MZWdthjuv9y2TaxS+JMnpKLrXfgazoQEsKmchAsTLEyX6tHG5tHq+3MaK
BSTFCoHHAgMBAAECggEAYodR1GPbZ+nuFpfhlF2ctIWe3G3awYz+LUrXX2ef3tBB
WrmISVJBqq+TZtD+Hi254MR0SE6xxPSygu5m98zt5/EJN8d8qrckdLwIyLCnCElA
s8rl5KFt6Y/YSdTq2g6bgGqePgt4QZi4At6yk0tYlgjV0DKFBTqzyPfVFvs/KEuZ
o8le0XjgJA+Rnti35Gi5UDL1Tn9LcmCU/JcdpksFgPvU/wPmlNb8azM68ougXcrf
hBebSRWbS0F2OXRJd7+hrTq+pwTNIH+IyzsUZHQCcH0tFe2Q304oDuVuwX5VxB3S
tYG8+LoECW1nKalJbolkmdRqVxZRXG/Ho8/aRCHBcQKBgQDBmoZzUaKU2F4Sa6P+
5vCQ5RAAiAATWao/WYfL9BBVnLzbkbzget3BNdJcJZKp1Avh6F/jeB0xUOD0aFgm
rJAZjVAFu77damKWwiEPxKfdgSbBedV/KWCMASzr4m4cdYKOcmlLFsh+Du2+oZW5
3Mn35hyfbTf1OyYxrvOVrhSu+wKBgQD5NVfxWTBsugAE++d4CCy8TUL7QCqb1I1v
EQ0FNdZsmXslPbCFlJ5UCFJXAF6s2x0MDKCl7y2ixlDo31H7DI6xlOP5kjYon7wr
mB0U2bclGtlJ3FvCwDBFkfZykYZqPyey8A3D+kf4pnvZvn/0BgKfWCVSYnqEB4mp
BI5WhywOpQKBgH4Mio8YTn8UZCMgG/UBDQ15ZbLC2THABj0aoHRkoiHrW3ala1DI
DgsWbLB78gJKQbZCofOqp28NVnkqWoJLhcJtI/Wnp/vmoOvA1t+6TQTFaqM7HIqf
OPHObh3iHYi/5VGzIeS2n7CbLaUY9S++lWymUGpoJK+wZAyi+IqyfVrzAoGAPKmI
g75zNDQ+pvfuy2AqC5g/Esv200H1P7EF21vUm1DtEg6nNo0L0WbJLFZxtWAM/Q7h
2CKVmEbwEQ+zdAoFfiLBL9Iwjsj7VB1ODvJES6ryc7FJQOnpljXGqPLVpm1DK6KV
pzv4YwWbplBh8zO3VbRuOVSxgAwZrWPnhhaXWeUCgYEAwVHYXN1qGTBS1uyrldDr
OMuXyfvE7lbfJlg2EfG2A7PtTooPkh1IbRjlJ8ACbiadM0pYhnGGPk0D1WSKvRxU
SmSc6PgW2weANQ8QCemo2V/zZ0DlWFZDdCV+7jMbAFBhQHcVh0qUr+uNyntjLTjj
OPdMSnhKLoKtleu+NiMIogc=
-----END PRIVATE KEY-----
`
signPublicKey = `-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAk7K9s+r82lofBFaj3KWp
o/5E1ryDPDlLGZ4Rv68DcoCxV/bv0IvYX3cleC0WvTpwbdTpGtLjS6RHj89JREhi
svv5qmk5YTfjEqd3RmtYDmOVz2Ry6E76wLh9qi1pqpneMGr3shvEzZC6gkieXRCA
MOlEYbE7TSzxxDJxmovdeElowdRZcvwwPLvh/BLmCn+H1MXfdx01c/eFpTvu8BZG
1m7AqDOqnaPcR1ru/ekJoIwotF1jCPM2E5kAbQQutNaeSXhLbkfom4bxqF2/ni6k
Cwnz3fbBYcXP3Ww3/AdI1dn0iLr6450qn72yBpDtQY8OZ7+Krff4Fa5jOBY7OHEN
FwIDAQAB
-----END PUBLIC KEY-----
`
)
func main() {
pub := make(map[string]string)
// Open Parameter
pub["app_id"] = "xxxxxxxxx"
pub["version"] = "1.0"
pub["key_version"] = "admin"
pub["time"] = fmt.Sprintf("%d", time.Now().Unix())
// Business Coin Parameter
pub["chain"] = "eth"
pub["coin"] = "eth"
pub["sign"] = getSign(pub)
url := fmt.Sprintf("%s/coin/list", BaseUrl)
r := req.New()
r.EnableInsecureTLS(true)
post, err := r.Post(url, req.BodyJSON(&pub))
if err != nil {
panic(err)
}
fmt.Println("return", post.String())
// verification
checkSign(post.String())
}
// Getting signature string
func getSign(data map[string]string) string {
err, signStr := ApiSign(data, signPrivateKey)
if err != nil {
panic(err)
}
fmt.Println("signature string:", signStr)
return signStr
}
// verifying signature
func checkSign(resp string) {
var res map[string]interface{}
err := json.Unmarshal([]byte(resp), &res)
if err != nil {
panic(err)
}
sign := res["sign"].(string)
data := ParseJsonToClassMap(resp)
err = ApiVerifySign(data, signPublicKey, sign)
if err != nil {
fmt.Println("verification failed")
return
}
fmt.Println("verification successful")
}
/**
* Local private key signature
* @param data parameter
* @param priKey local private key
* @return error
* @return string
*/
func ApiSign(data map[string]string, priKey string) (error, string) {
hashed := getSignString(data)
// rsa
block, _ := pem.Decode([]byte(priKey))
if block == nil {
return errors.New("private key error"), ""
}
privateKey, err := x509.ParsePKCS8PrivateKey(block.Bytes)
if err != nil {
return err, ""
}
signature, err := rsa.SignPKCS1v15(rand.Reader, privateKey.(*rsa.PrivateKey), crypto.MD5, hashed)
if err != nil {
return err, ""
}
ciphertext := base64.StdEncoding.EncodeToString(signature)
return nil, ciphertext
}
/**
* Using other party's public key to verify the signature, and determine whether the signature matches
* @param data parameter
* @param signed signature body
* @param pubKey public key
* @return error
*/
func ApiVerifySign(data map[string]string, pubKey string, signed string) error {
hashed := getSignString(data)
block, _ := pem.Decode([]byte(pubKey))
if block == nil {
return errors.New("public key error")
}
// Parse public key
pubInterface, err := x509.ParsePKIXPublicKey(block.Bytes)
if err != nil {
return err
}
pub := pubInterface.(*rsa.PublicKey)
decodeString, err := base64.StdEncoding.DecodeString(signed)
if err != nil {
return err
}
err = rsa.VerifyPKCS1v15(pub, crypto.MD5, hashed, decodeString)
if err != nil {
return err
}
return nil
}
// Splice parameter
func getSignString(data map[string]string) []byte {
delete(data, "sign")
var keys []string
for k := range data {
keys = append(keys, k)
}
sort.Strings(keys)
var signStr string
for _, k := range keys {
if signStr != "" {
signStr = signStr + "&" + k + "=" + data[k]
} else {
signStr = k + "=" + data[k]
}
}
hashMd5 := md5.Sum([]byte(signStr))
hashed := hashMd5[:]
return hashed
}
func ParseJsonToClassMap(jsonStr string) (m map[string]string) {
m = make(map[string]string)
result := gjson.Parse(jsonStr)
result.ForEach(func(key, value gjson.Result) bool {
if value.Type == gjson.JSON && gjson.Valid(value.String()) {
m[key.String()] = JsonToString(value.String())
} else {
m[key.String()] = value.String()
}
return true
})
return
}
func JsonToString(jsonStr string) string {
str := ""
r := gjson.Parse(jsonStr)
r.ForEach(func(key, value gjson.Result) bool {
if value.Type == gjson.JSON && gjson.Valid(value.String()) {
str += JsonToString(value.String())
} else {
str += value.String()
}
return true
})
return str
}
var crypto = require('crypto');
var priKey = `-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC8d6RGCeQkrobx
+4xO1jXnHwiMU48UyOaRaNW2FMQrN9DcK/T2h58FyuA7kYN0CVNFEnaZQS9S8Nur
Tl0lOVJcbwKfCSnu9nmFYDvPWqlCTqQW3F83sKNi9IWrMFFny3CX35eUHpeJahE2
R9wma2oJIFJv3ux/I3+w8fQQ6zMPIqpDx4Tcu9sCVpot+/siWJDpyiQBlbXfcxuH
YOePUGx+tJ5HLXtJOUtPcgyhFTXRmW9r17DnnsjrT5Vc50IbN//JXbvr96eexQ/e
/IXHZP6MZWdthjuv9y2TaxS+JMnpKLrXfgazoQEsKmchAsTLEyX6tHG5tHq+3MaK
BSTFCoHHAgMBAAECggEAYodR1GPbZ+nuFpfhlF2ctIWe3G3awYz+LUrXX2ef3tBB
WrmISVJBqq+TZtD+Hi254MR0SE6xxPSygu5m98zt5/EJN8d8qrckdLwIyLCnCElA
s8rl5KFt6Y/YSdTq2g6bgGqePgt4QZi4At6yk0tYlgjV0DKFBTqzyPfVFvs/KEuZ
o8le0XjgJA+Rnti35Gi5UDL1Tn9LcmCU/JcdpksFgPvU/wPmlNb8azM68ougXcrf
hBebSRWbS0F2OXRJd7+hrTq+pwTNIH+IyzsUZHQCcH0tFe2Q304oDuVuwX5VxB3S
tYG8+LoECW1nKalJbolkmdRqVxZRXG/Ho8/aRCHBcQKBgQDBmoZzUaKU2F4Sa6P+
5vCQ5RAAiAATWao/WYfL9BBVnLzbkbzget3BNdJcJZKp1Avh6F/jeB0xUOD0aFgm
rJAZjVAFu77damKWwiEPxKfdgSbBedV/KWCMASzr4m4cdYKOcmlLFsh+Du2+oZW5
3Mn35hyfbTf1OyYxrvOVrhSu+wKBgQD5NVfxWTBsugAE++d4CCy8TUL7QCqb1I1v
EQ0FNdZsmXslPbCFlJ5UCFJXAF6s2x0MDKCl7y2ixlDo31H7DI6xlOP5kjYon7wr
mB0U2bclGtlJ3FvCwDBFkfZykYZqPyey8A3D+kf4pnvZvn/0BgKfWCVSYnqEB4mp
BI5WhywOpQKBgH4Mio8YTn8UZCMgG/UBDQ15ZbLC2THABj0aoHRkoiHrW3ala1DI
DgsWbLB78gJKQbZCofOqp28NVnkqWoJLhcJtI/Wnp/vmoOvA1t+6TQTFaqM7HIqf
OPHObh3iHYi/5VGzIeS2n7CbLaUY9S++lWymUGpoJK+wZAyi+IqyfVrzAoGAPKmI
g75zNDQ+pvfuy2AqC5g/Esv200H1P7EF21vUm1DtEg6nNo0L0WbJLFZxtWAM/Q7h
2CKVmEbwEQ+zdAoFfiLBL9Iwjsj7VB1ODvJES6ryc7FJQOnpljXGqPLVpm1DK6KV
pzv4YwWbplBh8zO3VbRuOVSxgAwZrWPnhhaXWeUCgYEAwVHYXN1qGTBS1uyrldDr
OMuXyfvE7lbfJlg2EfG2A7PtTooPkh1IbRjlJ8ACbiadM0pYhnGGPk0D1WSKvRxU
SmSc6PgW2weANQ8QCemo2V/zZ0DlWFZDdCV+7jMbAFBhQHcVh0qUr+uNyntjLTjj
OPdMSnhKLoKtleu+NiMIogc=
-----END PRIVATE KEY-----
`
var pubKey = `-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAk7K9s+r82lofBFaj3KWp
o/5E1ryDPDlLGZ4Rv68DcoCxV/bv0IvYX3cleC0WvTpwbdTpGtLjS6RHj89JREhi
svv5qmk5YTfjEqd3RmtYDmOVz2Ry6E76wLh9qi1pqpneMGr3shvEzZC6gkieXRCA
MOlEYbE7TSzxxDJxmovdeElowdRZcvwwPLvh/BLmCn+H1MXfdx01c/eFpTvu8BZG
1m7AqDOqnaPcR1ru/ekJoIwotF1jCPM2E5kAbQQutNaeSXhLbkfom4bxqF2/ni6k
Cwnz3fbBYcXP3Ww3/AdI1dn0iLr6450qn72yBpDtQY8OZ7+Krff4Fa5jOBY7OHEN
FwIDAQAB
-----END PUBLIC KEY-----
`
/**
* Private key signing
*/
function encryption(data) {
let signString = getSignString(data)
let sign = crypto.createSign('md5WithRSAEncryption');
sign.update(signString, 'utf8');
sign.end();
let signature = sign.sign(priKey, 'base64');
return signature
}
/**
* Use the other party's public key to verify the signature and check whether the signature matches
* @param sign
* @param data
* @return bool
*/
function checkSignature(sign, data) {
let signString = getSignString(data)
let verify = crypto.createVerify('md5WithRSAEncryption');
verify.update(signString, 'utf8');
verify.end();
return verify.verify(pubKey, sign, 'base64');
}
// Splice parameter
function getSignString(data) {
delete(data["sign"])
var keys = Object.keys(data)
keys = keys.sort()
let signStr = ""
for(let k in keys) {
if(typeof(data[keys[k]]) == "object") {
signStr = keys[k] + "=" + arrayToString(data[keys[k]])
}else {
if (signStr != "") {
signStr = signStr + "&" + keys[k] + "=" + data[keys[k]]
} else {
signStr = keys[k] + "=" + data[keys[k]]
}
}
}
return signStr
}
function arrayToString(data) {
let str = '';
for(let list in data) {
if (typeof (data[list]) == "object") {
str += arrayToString(data[list]);
} else {
str += data[list];
}
}
return str;
}
//send http post
function httpByPost(data) {
let HTTP = require('http')
let POST_OPTIONS = {
port: 8888,
host: "http://api.xxxxx.com/shopapi",
path: "/coin/list",
method: 'POST',
headers: {
"Content-Type": "application/json"
}
};
const REQUEST = HTTP.request(POST_OPTIONS, requestOnResponse)
REQUEST.setTimeout(6000)
REQUEST.write(JSON.stringify(data), 'utf8')
REQUEST.end()
}
function requestOnResponse(incomingMessage){
let data = []
incomingMessage.on('data', chunk => {
data.push(...chunk)
})
incomingMessage.on('end', () => {
let _date = JSON.parse( new TextDecoder().decode(new Uint8Array(data)))
let res = checkSignature(_date["sign"], _date)
console.log(res)
})
}
/*****testing********/
let data = {
'app_id' : 'xxxxxxxxx',
'version' : '1.0',
'key_version' : 'admin',
'time' : Math.floor(Date.now()/1000),
'chain' :'eth',
'coin' : 'eth',
}
data['sign'] = encryption(data)
httpByPost(data);
package com.junior.common;
import com.google.gson.*;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.security.*;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.*;
import java.util.stream.Collectors;
public class rsaSigner {
public static void main(String[] args) {
String baseUrl = "http://api.xxxxx.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", "trx");
try {
params.put("sign", signer.genSign(params, priKey));
Gson gson = new GsonBuilder().create();
System.out.println("params = " + gson.toJson(params));
String res = doPost(baseUrl + "/address/getBatch", 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");
}
public String genSign(Map<String, Object> data, String priKey) throws NoSuchAlgorithmException, InvalidKeySpecException, SignatureException, InvalidKeyException {
Map<String, String> stringMap = toStringMap(new GsonBuilder().create().toJson(data));
return this.sign(this.genSignString(stringMap), priKey);
}
public String genSignString(Map<String, String> params) {
if (null == params || params.size() == 0) {
return "";
}
List<String> sortedKeys = new ArrayList<>(params.keySet());
sortedKeys.remove("sign");
sortedKeys.sort(null);
String sb = sortedKeys.stream().map(s -> s + "=" + params.get(s)).collect(Collectors.joining("&"));
System.out.println("genSignString = " + sb);
return sb;
}
public String sign(String str, String priKey) throws NoSuchAlgorithmException, InvalidKeySpecException, InvalidKeyException, SignatureException {
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
byte[] decodedKey = Base64.getDecoder().decode(priKey.getBytes(StandardCharsets.UTF_8));
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(decodedKey);
PrivateKey pk = keyFactory.generatePrivate(keySpec);
Signature signature = Signature.getInstance("MD5withRSA");
signature.initSign(pk);
signature.update(str.getBytes(StandardCharsets.UTF_8));
return new String(Base64.getEncoder().encode(signature.sign()), StandardCharsets.UTF_8);
}
public boolean verifySign(JsonElement data, String sign, String pubKey) throws NoSuchAlgorithmException, InvalidKeySpecException, InvalidKeyException, SignatureException {
Map<String, String> resMap = toStringMap(data);
String signString = this.genSignString(resMap);
byte[] keyBytes = Base64.getDecoder().decode(pubKey.getBytes(StandardCharsets.UTF_8));
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PublicKey key = keyFactory.generatePublic(keySpec);
Signature signature = Signature.getInstance("MD5withRSA");
signature.initVerify(key);
signature.update(signString.getBytes(StandardCharsets.UTF_8));
return signature.verify(Base64.getDecoder().decode(sign.getBytes(StandardCharsets.UTF_8)));
}
public static Map<String, String> toStringMap(String str) {
JsonParser jp = new JsonParser();
JsonElement jEle = jp.parse(str);
return toStringMap(jEle);
}
public static Map<String, String> toStringMap(JsonElement jEle) {
Map<String, String> resMap = new HashMap<>();
if (null != jEle && jEle.isJsonObject()) {
for (Map.Entry<String, JsonElement> entry : jEle.getAsJsonObject().entrySet()) {
resMap.put(entry.getKey(), valueAsString(entry.getValue()));
}
}
return resMap;
}
public static String valueAsString(JsonElement element) {
if (element.isJsonNull()) {
return "";
} else if (element.isJsonPrimitive()) {
return element.getAsJsonPrimitive().getAsString();
} else if (element.isJsonObject()) {
StringBuilder sb = new StringBuilder();
for (Map.Entry<String, JsonElement> entry : element.getAsJsonObject().entrySet()) {
sb.append(valueAsString(entry.getValue()));
}
return sb.toString();
} else if (element.isJsonArray()) {
StringBuilder sb = new StringBuilder();
for (JsonElement vv : element.getAsJsonArray()) {
sb.append(valueAsString(vv));
}
return sb.toString();
}
return "";
}
public static String doPost(String httpUrl, String param) {
//send http post request
}
}
Create private key
openssl genrsa -out rsa_private_key.pem 2048
Create public key from private key
openssl rsa -in rsa_private_key.pem -out rsa_public_key.pem -pubout
Signature Algorithm Details
- 1. Get the request parameters and format them to get a new parameter formatted string:
- 2. Sign the first step data with the RSA private key and save the signature result to a variable:
Generate the signature string, for the following parameter array:
user_id = 1
coin = eth
address = 0x038B8E7406dED2Be112B6c7E4681Df5316957cad
amount = 10.001
trade_id = 20220131012030274786
Sort each key in the array in order from a to z. If the same first letter is encountered, look at the second letter, and so on. After sorting, connect all array values with "&" characters, such as $dataString:
address=0x038B8E7406dED2Be112B6c7E4681Df5316957cad&amount=10.001&coin=eth&trade_id=20220131012030274786&user_id=1
This string is the transfromed string.
Public information description
The following information is common to all interfaces, and the description of each interface is not repeated
Production Environment
Please contact customer service to obtain the API address
test environment
Please contact customer service to obtain the API address
Common paremeter in Request
| Parameter Name | Required | Type | Constraint | Case | Description |
|---|---|---|---|---|---|
| app_id | Yes | string | Generated by the system | A6vZLiqyRYxu | Merchant ID assigned by the system when docking |
| version | yes | string | fixed | 1.0 | interface version number - fixed according to the agreement at the time of access |
| sign | yes | string | length 344 bits | Dr7MnhPYh… | RSA-2048 bit key mode |
| time | yes | string | length 10 digits | 1578829811 | timestamp - ignoring timezone timestamp in seconds |
| key_version | no | string | dynamic enumeration type | default: admin | key version number: admin / read / arbitrary - can be authorized for any 1-n interfaces |
Public Information Notice
| Name | Type | Case | Description |
|---|---|---|---|
| time1 | timeStamp | 1578829811 | UTC time unified time without time zone |
| Time 2 | DateTime | 2020-01-09 15:48:42 | The global system defaults to Beijing time if this format appears |
| Request Method | POST | — | All requests are POST |
| Encoding | UTF-8 | — | Other encodings may produce garbled characters and errors |
| Communication Protocol | HTTPS | https | Currently only HTTPS is supported |
| Signature Type | RSA-2048-bit | Dr7MnhPYh… | Click to view rule details |
| Request and Return | JSON | — | All request and response parameters are in JSON format |
| Note on the amount parameter | string | — | The number of digits after the decimal point exceeds 8, and the number of digits before the decimal point exceeds 12, which cannot be passed, and the last invalid 0 must be deleted. |
Address
Address get
$url = "http://api.xxxx.com/shopapi/address/getBatch";
$header = [
'Content-Type:application/json',
];
$params = [
"coin" => "hc",
"app_id" => "hxgmau9imt86qky9",
"version" => "1.0",
"time" => 1578997143,
"sign" => "IUtWA3HEkK+wvTGaSBYwIrdx+ANyoOPl2/1LQTDevCSTxf4/lDXPrg6/ph+skNXIbZTR8Qs2yGGkqTUHEW/vbiTPzWkYZ874rRgplp06vhOBM/Pkw289K7PVCKy1ksOtLjwj1dUfDD/2AEqTgxRDjGyn+yDWRa7HLL/28bjU3pZoFwPPjbPyRxMK9BVL/li9IQ6hb8lyOyQNHNxS3C82sDVaQKqrB0dOqtP61OH0hBonrxMhBAMD8dUmaqO6Ef+bhHzbBm3BCC5VapkOkdthb+UWXKCiBoCipg3gqrwnBdOUGXqx/1mYicNZ+oHeVpBwnJlXudff6FT+HySszr5ISw=="
];
$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/address/getBatch"
data := map[string]string{
"coin" => "hc",
"app_id" => "hxgmau9imt86qky9",
"version" => "1.0",
"time" => "1578997143",
"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 = {
"coin" : "hc",
"app_id" : "hxgmau9imt86qky9",
"version" : "1.0",
"time" : "1578997143",
"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/address/getBatch",
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) {
// more detail functions, see "Signature Regulations"Java demo
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", "trx");
try {
params.put("sign", signer.genSign(params, priKey));
Gson gson = new GsonBuilder().create();
System.out.println("params = " + gson.toJson(params));
String res = doPost(baseUrl + "/address/getBatch", 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");
}
Example of return result:
{
"status":200,
"msg":"Request succeeded",
"data":[
"HsZWVPmCS92hXJ4mUpTwCs3DX74MK1ihEBn",
"HsCt7eYaJJkn331ZkprcbvGFDrRuqMYcAHx"
],
"date_time":"2020-06-29 14:43:17",
"time_stamp":1593412997,
"sign":"lwxzuuGuZN1Z/j4hTombrcict1wom1+D6+k2URGIxL/L4sezn6Sh1IDawPixO2nEC2VZ9O0JVpBP+CH8QfjYY8Q0A+DTwLMjLRneB3iV/++c+ODcT8rUwHU+jAZmETccI2Knln5ND9MbrQpcWSW3wwPmJtNTeh6sYcwK2vJR18IAE26j47LQZV5RMfmWzHnIO2O1oftZuOT40H2aXfU3Zk6xybsMFi3uzYaK7/Zz5porGe6GG3IVELsFoHGtVl7mFGRl1sLUtT9iUuwa8F8alKozMjuK9IyW44ExHv0OyDS2PZewhwRRLnvUTTTM5+8bgAeM5w0bRetfL22coHnSHw=="
}
{
"status": 500,
"msg": "Insufficient address",
"data": null,
"date_time": "2020-01-09 15:46:14",
"sign": "rzbmkcf0Vr1AEZAo0Lsnlmk1s6HGONYZkpQxWKhGwIFxyN/fkaYzA6UxhIm9C8Drlfa8oZxpyrH89POuoaVfToxPhC9p8w10rfb4G/kNaZBE/gIo2H8e4/CTvEsiX5lz/ASNLiSe6BmegtMubb0wRD55Bmeubb+TFClbsHSytUw
}
{
"status":551,
"msg":"There are 6 allocated unused addresses, please use them up before requesting a new address",
"data":"6",
"date_time":"2020-03-05 10:46:24",
"time_stamp":1583376384,
"sign":"e57nRfbDNvVIZuwvbXOsJaBnj9D+2hiP90SC8Q9ZCpdyTSbhB3WEpmotvZg11n3sW2Kzzle+ZSLPJH10iHqou3NgYzqEWD3EAThCzP0H8rhsj14NZ909JFAveRTe7XeP8xUcJINsY9HOliU2M5pt/qSnOx2CvdpFtxmVNLpIK+1VHdYuX6NRGc9TQ/Ptgwc6c9K7NNqqXY1y0e46LK8EBvXoEwbWa6L46f14Sx+/hN94Ymc6OKBUNFnbMGh31aeBp7E5YV/5fV2ZWKfNaNOxTyQVsPhpRt5NU9qCIzcgHKsqbroU72adWlBjyNrNWcXayilmwNHPAVJ1QKoqS6zoEQ=="
}
- Function: Return the new address to the merchant
- The number of addresses obtained at a time is N (default 200, return only 2 on test env), and merchants can request multiple times according to actual needs.
- For accounts like EOS + memo mode, this interface only returns memo, with the interface: /address/coinAccount
- Note: Platform eth, bnb_bsc(BNB Smart Chain), ht_heco (heco main chain) are sharing the eth address, when requesting the address-related api please use eth as the parameter value of coin (coin=eth). All main chain networks that share eth address: eth, bnb_bsc, ht_heco, pol, okt, avax_c, movr, eth_aurora, rei, smartbch, ftm, eth_optimism, eth_arbitrum, cmp, ethw, mbe, core, wemix, ethg, eth_zksync, gdcc, main_hec, cvn, nrk, eth_base, tfuel_theta, alyx, btc_merlin, etc, zeta, main_taiko
HTTP Request
POST: /address/getBatch
request parameters
| parameter name | required | type | description |
|---|---|---|---|
| common parameter | Yes | JSON | common parameter refer to: signature (sign), version (version), merchant ID (app_id), time (time) |
| coin | yes | string | main chain coin name within 12 characters, the coin name platform shall prevail (if bnb_bsc please use eth). Can query /coin/list to get available coins |
Response parameter description
| parameter name | required | type | description |
|---|---|---|---|
| status | yes | int | status code |
| msg | no | string | within 100 characters Status description |
| data | no | jsonObject | status 200 returns an array of addresses, 500 returns null for insufficient addresses, 551 has allocated unused addresses, returns unused numbers |
| date_time | No | DateTime | Beijing time: 2020-06-29 14:28:14 |
| time_stamp | no | string | response time in seconds: 1593412094 |
| sign | yes | string | return the signature, sign all the above parameters |
The contract coin and the main chain coin share the same address. Please only use the main chain coin name to apply. It is not supported to apply for the address by the contract coin name. Only one main chain coin address can be allocated. Example: user_coin table
| User ID | coin name | Address |
|---|---|---|
| 1688 | eth | 0xa6f8745c56a7c4fcb094678a2fbdcbd9ee9228f7 |
| 1688 | usdt_erc20 | 0xa6f8745c56a7c4fcb094678a2fbdcbd9ee9228f7 |
| 1688 | leek | 0xa6f8745c56a7c4fcb094678a2fbdcbd9ee9228f7 |
- Note: The above addresses belong to the ETH main chain address, and can also receive ETH contract coins
Address list
$url = "http://api.xxxx.com/shopapi/address/list";
$header = [
'Content-Type:application/json',
];
$params = [
"app_id" => "hxgmau9imt86qky9",
"version" => "1.0",
"time" => 1578997143,
"sign" => "IUtWA3HEkK+wvTGaSBYwIrdx+ANyoOPl2/1LQTDevCSTxf4/lDXPrg6/ph+skNXIbZTR8Qs2yGGkqTUHEW/vbiTPzWkYZ874rRgplp06vhOBM/Pkw289K7PVCKy1ksOtLjwj1dUfDD/2AEqTgxRDjGyn+yDWRa7HLL/28bjU3pZoFwPPjbPyRxMK9BVL/li9IQ6hb8lyOyQNHNxS3C82sDVaQKqrB0dOqtP61OH0hBonrxMhBAMD8dUmaqO6Ef+bhHzbBm3BCC5VapkOkdthb+UWXKCiBoCipg3gqrwnBdOUGXqx/1mYicNZ+oHeVpBwnJlXudff6FT+HySszr5ISw==",
"coin" => "hc",
"address" => "HsHGWeEMmx5QLds9UiWfjxarM4RbLAc3xrD",
"is_used" => "1",
"page" => "1"
];
$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/address/list"
data := map[string]string{
"app_id":"hxgmau9imt86qky9",
"version":"1.0",
"time":"1578997143",
"sign":"IUtWA3HEkK+wvTGaSBYwIrdx+ANyoOPl2/1LQTDevCSTxf4/lDXPrg6/ph+skNXIbZTR8Qs2yGGkqTUHEW/vbiTPzWkYZ874rRgplp06vhOBM/Pkw289K7PVCKy1ksOtLjwj1dUfDD/2AEqTgxRDjGyn+yDWRa7HLL/28bjU3pZoFwPPjbPyRxMK9BVL/li9IQ6hb8lyOyQNHNxS3C82sDVaQKqrB0dOqtP61OH0hBonrxMhBAMD8dUmaqO6Ef+bhHzbBm3BCC5VapkOkdthb+UWXKCiBoCipg3gqrwnBdOUGXqx/1mYicNZ+oHeVpBwnJlXudff6FT+HySszr5ISw==",
"coin":"hc",
"address":"HsHGWeEMmx5QLds9UiWfjxarM4RbLAc3xrD",
"is_used":"1",
"page":"1",
}
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":"1578997143",
"sign":"IUtWA3HEkK+wvTGaSBYwIrdx+ANyoOPl2/1LQTDevCSTxf4/lDXPrg6/ph+skNXIbZTR8Qs2yGGkqTUHEW/vbiTPzWkYZ874rRgplp06vhOBM/Pkw289K7PVCKy1ksOtLjwj1dUfDD/2AEqTgxRDjGyn+yDWRa7HLL/28bjU3pZoFwPPjbPyRxMK9BVL/li9IQ6hb8lyOyQNHNxS3C82sDVaQKqrB0dOqtP61OH0hBonrxMhBAMD8dUmaqO6Ef+bhHzbBm3BCC5VapkOkdthb+UWXKCiBoCipg3gqrwnBdOUGXqx/1mYicNZ+oHeVpBwnJlXudff6FT+HySszr5ISw==",
"coin":"hc",
"address":"HsHGWeEMmx5QLds9UiWfjxarM4RbLAc3xrD",
"is_used":"1",
"page":"1",
};
let POST_OPTIONS = {
port: 80,
host: "api.xxxx.com",
path: "/shopapi/address/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) {
// more detail functions, see "Signature Regulations"Java demo
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", "trx");
params.put("address", "HsHGWeEMmx5QLds9UiWfjxarM4RbLAc3xrD");
params.put("page", "1");
params.put("is_used", "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 + "/address/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");
}
Example of return result:
{
"status":200,
"msg":"Processing successful",
"data":{
"page":1,
"max_page":1,
"count":4,
"list":[
{
"address":"HsHGWeEMmx5QLds9UiWfjxarM4RbLAc3xrD",
"user_id":""
},
{
"address":"HsDZKWmgusF7fYbJ1Xw6FJJWx5Bkykdcfq9",
"user_id":""
}
]
},
"date_time":"2020-04-26 17:26:09",
"time_stamp":1587893169,
"sign":"LNnLd4tIHwNqRHgcd1d0E46u5rU0Jbm/fO5yZL8IIzt6cdfAwEBmtQ9kBczZhttp+KoP/rN7jZkex55SCZ5+9ILc276XOIalO6qF8L36GpwSJEizWYI1w6WjXTjdo9sCp2D6+ZUlV27mwkRtlwsIbF5gMmEnb2wmeyFoFctuDSHnPNLrs9WHHXvZ2q0lXU6L2LT1V8Ugfow3cZ7cCSbC9Vx9l8gMSGR/z7LRz8YB5iaM4rL9L2WpZy3SLoEd5d+Zu38de3z5TC2Cjnf3xkYxqKarPKy6mHe/RgIVFkYov8awveIYdaL2KZ+2bWmLeIXQLxUv7zVPaWytB82NPRz9Xg=="
}
- Query address usage status, address ownership.
HTTP Request
POST: /address/list
request parameters
| parameter name | required | type | description |
|---|---|---|---|
| common parameter | Yes | JSON | common parameter refer to: signature (sign), version (version), merchant ID (app_id), time (time) |
| coin | yes | string | main chain coin name - see the description of the public information of supported coins (if bnb_bsc please use eth) |
| address | no | string | address |
| page | no | int | 1<= N <=Max, if it exceeds Max, take Max, if it is less than 1, return 1 |
| is_used | no | int | 1=used, 2=not used |
Response parameter description
| Parameter name | Type | Description |
|---|---|---|
| status | int | status code |
| msg | string | status description |
| data | jsonObject | **See below** "data details". |
| data.page | int | current page |
| data.max_page | int | total pages |
| data.count | int | Number of records on this page |
| data.list | jsonArray | record |
| date_time | string | response time |
| time_stamp | int | timestamp in seconds |
| sign | string | signature |
EOS-like address + memo mode
$url = "http://api.xxxx.com/shopapi/address/coinAccount";
$header = [
'Content-Type:application/json',
];
$params = [
"app_id" => "hxgmau9imt86qky9",
"version" => "1.0",
"time" => 1578997143,
"sign" => "IUtWA3HEkK+wvTGaSBYwIrdx+ANyoOPl2/1LQTDevCSTxf4/lDXPrg6/ph+skNXIbZTR8Qs2yGGkqTUHEW/vbiTPzWkYZ874rRgplp06vhOBM/Pkw289K7PVCKy1ksOtLjwj1dUfDD/2AEqTgxRDjGyn+yDWRa7HLL/28bjU3pZoFwPPjbPyRxMK9BVL/li9IQ6hb8lyOyQNHNxS3C82sDVaQKqrB0dOqtP61OH0hBonrxMhBAMD8dUmaqO6Ef+bhHzbBm3BCC5VapkOkdthb+UWXKCiBoCipg3gqrwnBdOUGXqx/1mYicNZ+oHeVpBwnJlXudff6FT+HySszr5ISw==",
"coin" => "eos"
];
$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/address/coinAccount"
data := map[string]string{
"app_id":"hxgmau9imt86qky9",
"version":"1.0",
"time":"1578997143",
"sign":"IUtWA3HEkK+wvTGaSBYwIrdx+ANyoOPl2/1LQTDevCSTxf4/lDXPrg6/ph+skNXIbZTR8Qs2yGGkqTUHEW/vbiTPzWkYZ874rRgplp06vhOBM/Pkw289K7PVCKy1ksOtLjwj1dUfDD/2AEqTgxRDjGyn+yDWRa7HLL/28bjU3pZoFwPPjbPyRxMK9BVL/li9IQ6hb8lyOyQNHNxS3C82sDVaQKqrB0dOqtP61OH0hBonrxMhBAMD8dUmaqO6Ef+bhHzbBm3BCC5VapkOkdthb+UWXKCiBoCipg3gqrwnBdOUGXqx/1mYicNZ+oHeVpBwnJlXudff6FT+HySszr5ISw==",
"coin":"eos",
}
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":"1578997143",
"sign":"IUtWA3HEkK+wvTGaSBYwIrdx+ANyoOPl2/1LQTDevCSTxf4/lDXPrg6/ph+skNXIbZTR8Qs2yGGkqTUHEW/vbiTPzWkYZ874rRgplp06vhOBM/Pkw289K7PVCKy1ksOtLjwj1dUfDD/2AEqTgxRDjGyn+yDWRa7HLL/28bjU3pZoFwPPjbPyRxMK9BVL/li9IQ6hb8lyOyQNHNxS3C82sDVaQKqrB0dOqtP61OH0hBonrxMhBAMD8dUmaqO6Ef+bhHzbBm3BCC5VapkOkdthb+UWXKCiBoCipg3gqrwnBdOUGXqx/1mYicNZ+oHeVpBwnJlXudff6FT+HySszr5ISw==",
"coin":"eos",
};
let POST_OPTIONS = {
port: 80,
host: "api.xxxx.com",
path: "/shopapi/address/coinAccount",
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) {
// more detail functions, see "Signature Regulations"Java demo
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", "trx");
try {
params.put("sign", signer.genSign(params, priKey));
Gson gson = new GsonBuilder().create();
System.out.println("params = " + gson.toJson(params));
String res = doPost(baseUrl + "/address/coinAccount", 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");
}
Example of return result:
{
"status":200,
"msg":"Request succeeded",
"data":"hyperpayeos1",
"date_time":"2020-04-08 18:20:33",
"time_stamp":1586341233,
"sign":"r+AWadjxa5L9CY5gWNMy5+4n9gtmHGUIsxgsTVOhs5mHPe2/jmm1jYOXS+KW/TLZLBnN1AMLeAgnHCQ6UxztsldMJg71ef3MTgV1GikCDXO+RQwQXYVHjjq1Cn6z/dGYikl7pht+avjnlmvGHUQjZBmhkKCpWVyG7Hl+h1cJKyMAZhJNqKemmSpbmTxe5GEDDR/NSrqKNsd0gt0QXMJu4VwURr6piRqc3euNqbtY94xelXcie75ZE0SKKHSikk6H/k1RQCfbTmfqhwp+vDZfrZ6kBucvaenczgFgX4S7k9Akb1B/xJ1n5NjLUilzn1GO2STUwhY4ATE5IbXJ819QVQ=="
}
request parameters
| parameter name | required | type | description |
|---|---|---|---|
| common parameter | Yes | JSON | common parameter refer to: signature (sign), version (version), merchant ID (app_id), time (time) |
| coin | yes | string | main chain coin name - see the description of the public information of supported coins (if bnb_bsc please use eth) |
Response parameter description
| parameter name | type | description |
|---|---|---|
| status | int | status code |
| msg | string | state description |
| data | jsonObject | |
| date_time | string | response time |
| time_stamp | int | timestamp in seconds |
| sign | string | signature |
Address state synchronization
$url = "http://api.xxxx.com/shopapi/address/syncStatus";
$header = [
'Content-Type:application/json',
];
$params = [
"app_id" => "hxgmau9imt86qky9",
"version" => "1.0",
"time" => 1578997143,
"sign" => "IUtWA3HEkK+wvTGaSBYwIrdx+ANyoOPl2/1LQTDevCSTxf4/lDXPrg6/ph+skNXIbZTR8Qs2yGGkqTUHEW/vbiTPzWkYZ874rRgplp06vhOBM/Pkw289K7PVCKy1ksOtLjwj1dUfDD/2AEqTgxRDjGyn+yDWRa7HLL/28bjU3pZoFwPPjbPyRxMK9BVL/li9IQ6hb8lyOyQNHNxS3C82sDVaQKqrB0dOqtP61OH0hBonrxMhBAMD8dUmaqO6Ef+bhHzbBm3BCC5VapkOkdthb+UWXKCiBoCipg3gqrwnBdOUGXqx/1mYicNZ+oHeVpBwnJlXudff6FT+HySszr5ISw==",
"coin" => "eth",
"address" => "0xb930c8149bc0bbb0214ae4207164d3b1cb41f395",
"user_id" => "28"
];
$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/address/syncStatus"
data := map[string]string{
"app_id":"hxgmau9imt86qky9",
"version":"1.0",
"time":"1578997143",
"sign":"IUtWA3HEkK+wvTGaSBYwIrdx+ANyoOPl2/1LQTDevCSTxf4/lDXPrg6/ph+skNXIbZTR8Qs2yGGkqTUHEW/vbiTPzWkYZ874rRgplp06vhOBM/Pkw289K7PVCKy1ksOtLjwj1dUfDD/2AEqTgxRDjGyn+yDWRa7HLL/28bjU3pZoFwPPjbPyRxMK9BVL/li9IQ6hb8lyOyQNHNxS3C82sDVaQKqrB0dOqtP61OH0hBonrxMhBAMD8dUmaqO6Ef+bhHzbBm3BCC5VapkOkdthb+UWXKCiBoCipg3gqrwnBdOUGXqx/1mYicNZ+oHeVpBwnJlXudff6FT+HySszr5ISw==",
"coin":"eth",
"address":"0xb930c8149bc0bbb0214ae4207164d3b1cb41f395",
"user_id":"28",
}
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":"1578997143",
"sign":"IUtWA3HEkK+wvTGaSBYwIrdx+ANyoOPl2/1LQTDevCSTxf4/lDXPrg6/ph+skNXIbZTR8Qs2yGGkqTUHEW/vbiTPzWkYZ874rRgplp06vhOBM/Pkw289K7PVCKy1ksOtLjwj1dUfDD/2AEqTgxRDjGyn+yDWRa7HLL/28bjU3pZoFwPPjbPyRxMK9BVL/li9IQ6hb8lyOyQNHNxS3C82sDVaQKqrB0dOqtP61OH0hBonrxMhBAMD8dUmaqO6Ef+bhHzbBm3BCC5VapkOkdthb+UWXKCiBoCipg3gqrwnBdOUGXqx/1mYicNZ+oHeVpBwnJlXudff6FT+HySszr5ISw==",
"coin":"eth",
"address":"0xb930c8149bc0bbb0214ae4207164d3b1cb41f395",
"user_id":"28",
};
let POST_OPTIONS = {
port: 80,
host: "api.xxxx.com",
path: "/shopapi/address/syncStatus",
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) {
// more detail functions, see "Signature Regulations"Java demo
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", "trx");
params.put("address", "HsHGWeEMmx5QLds9UiWfjxarM4RbLAc3xrD");
params.put("user_id", "111");
try {
params.put("sign", signer.genSign(params, priKey));
Gson gson = new GsonBuilder().create();
System.out.println("params = " + gson.toJson(params));
String res = doPost(baseUrl + "/address/syncStatus", 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");
}
Example of return result:
{
"status":200,
"msg":"Successful synchronization",
"data":{
"address":"0x0603b5a606e6ae28e729d145f4d5a99bd8769950",
"coin":"eth"
},
"date_time":"2020-01-14 00:33:58",
"sign":"KVZrYNjK9xwZvqJHMSRxxK4PjbirEtS1vyI220BzK/rF7bp+iU+ClQU5BSERcaujFz0EqRtZW5LSojjgRPeGbh4Wyqmlpk/Qz7ulTC0lqkik3torj3xL4SP2MKvUMXyPRRn8MKh586c8XLIDUrAPRR48mBmDV
}
- After the merchant assigns the address to the user, it must notify the platform to update the address usage status through the "Status Synchronization Interface".
HTTP Request
POST: /address/syncStatus
request parameters
| parameter name | required | type | description |
|---|---|---|---|
| common parameter | Yes | JSON | common parameter refer to: signature (sign), version (version), merchant ID (app_id), time (time) |
| coin | yes | string | Within 12 characters, the main chain currency of the address (if bnb_bsc, please pass eth) |
| address | yes | string | address, within 128 characters |
| user_id | yes | string | User id related to the address, consists of letters, numbers, and underscores. length under 40. |
Response parameter description
| parameter name | required | type | description |
|---|---|---|---|
| status | yes | int | return status code |
| msg | yes | string | status code description |
| date_time | yes | string | interface return time |
| time_stamp | yes | string | no time zone time unit seconds |
| data | yes | null or JSONObjectString | return data |
| sign | yes | string | backend signature |
Note: After the merchant assigns the address to its own user, it must request the interface to return the usage status information, and obtain the correct status code return value of 200 before enabling the user's deposit and withdrawal function.
*1. If it is not synchronized, it will affect the use of the address acquisition interface (when the number of allocated unused addresses exceeds a certain amount, the platform will no longer allocate new addresses to merchants).
*2. If the status synchronization does not receive the correct return result, but reports an error prompt, please manually troubleshoot the error.
Design rules: The same currency or contract currency, the same merchant, and the same user ID can only be assigned one address.
If the above rules are violated, an error will be reported.
Address status batch synchronization
$url = "http://api.xxxx.com/shopapi/address/syncBatchStatus";
$header = [
'Content-Type:application/json',
];
$params = [
"app_id" => "hxgmau9imt86qky9",
"version" => "1.0",
"time" => 1578997143,
"sign" => "IUtWA3HEkK+wvTGaSBYwIrdx+ANyoOPl2/1LQTDevCSTxf4/lDXPrg6/ph+skNXIbZTR8Qs2yGGkqTUHEW/vbiTPzWkYZ874rRgplp06vhOBM/Pkw289K7PVCKy1ksOtLjwj1dUfDD/2AEqTgxRDjGyn+yDWRa7HLL/28bjU3pZoFwPPjbPyRxMK9BVL/li9IQ6hb8lyOyQNHNxS3C82sDVaQKqrB0dOqtP61OH0hBonrxMhBAMD8dUmaqO6Ef+bhHzbBm3BCC5VapkOkdthb+UWXKCiBoCipg3gqrwnBdOUGXqx/1mYicNZ+oHeVpBwnJlXudff6FT+HySszr5ISw==",
"address_list" => [
[
"address" => "0x038B8E7406dED2Be112B6c7E4681Df5316957cad",
"coin" => "eth",
"user_id" => "123sa"
],
[
"address" => "0xf854AC319A546ae11e367ef80a203AaC923ca6A3",
"coin" => "eth",
"user_id" => "123sb"
]
]
];
$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/address/syncBatchStatus"
data := map[string]interface{}{
"app_id": "hxgmau9imt86qky9",
"version": "1.0",
"time": "1578997143",
"sign": "IUtWA3HEkK+wvTGaSBYwIrdx+ANyoOPl2/1LQTDevCSTxf4/lDXPrg6/ph+skNXIbZTR8Qs2yGGkqTUHEW/vbiTPzWkYZ874rRgplp06vhOBM/Pkw289K7PVCKy1ksOtLjwj1dUfDD/2AEqTgxRDjGyn+yDWRa7HLL/28bjU3pZoFwPPjbPyRxMK9BVL/li9IQ6hb8lyOyQNHNxS3C82sDVaQKqrB0dOqtP61OH0hBonrxMhBAMD8dUmaqO6Ef+bhHzbBm3BCC5VapkOkdthb+UWXKCiBoCipg3gqrwnBdOUGXqx/1mYicNZ+oHeVpBwnJlXudff6FT+HySszr5ISw==",
"address_list": []interface{}{
map[string]interface{}{
"address": "0x038B8E7406dED2Be112B6c7E4681Df5316957cad",
"coin": "eth",
"user_id": "123sa",
},
map[string]interface{}{
"address": "0xf854AC319A546ae11e367ef80a203AaC923ca6A3",
"coin": "eth",
"user_id": "123sb",
},
},
}
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": "1578997143",
"sign": "IUtWA3HEkK+wvTGaSBYwIrdx+ANyoOPl2/1LQTDevCSTxf4/lDXPrg6/ph+skNXIbZTR8Qs2yGGkqTUHEW/vbiTPzWkYZ874rRgplp06vhOBM/Pkw289K7PVCKy1ksOtLjwj1dUfDD/2AEqTgxRDjGyn+yDWRa7HLL/28bjU3pZoFwPPjbPyRxMK9BVL/li9IQ6hb8lyOyQNHNxS3C82sDVaQKqrB0dOqtP61OH0hBonrxMhBAMD8dUmaqO6Ef+bhHzbBm3BCC5VapkOkdthb+UWXKCiBoCipg3gqrwnBdOUGXqx/1mYicNZ+oHeVpBwnJlXudff6FT+HySszr5ISw==",
"address_list": [
{
"address": "0x038B8E7406dED2Be112B6c7E4681Df5316957cad",
"coin": "eth",
"user_id": "123sa",
},
{
"address": "0xf854AC319A546ae11e367ef80a203AaC923ca6A3",
"coin": "eth",
"user_id": "123sb",
},
],
};
let POST_OPTIONS = {
port: 80,
host: "api.xxxx.com",
path: "/shopapi/address/syncBatchStatus",
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) {
// more detail functions, see "Signature Regulations"Java demo
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<addressObj> addressList = new ArrayList<addressObj>();
addressList.add(new addressObj("trx", "TFf9pAefXqKMekvizwiFi1YgdXH4fRjNYS", "111"));
addressList.add(new addressObj("trx", "TNsym9u9o2LGNMJ9pkXQ9EkubrKanCV1HJ", "222"));
params.put("address_list", addressList);
try {
params.put("sign", signer.genSign(params, priKey));
Gson gson = new GsonBuilder().create();
System.out.println("params = " + gson.toJson(params));
String res = doPost(baseUrl + "/address/syncBatchStatus", 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");
}
public class addressObj {
public String coin;
public String address;
@SerializedName("user_id")
public String userId;
addressObj(String coin, String address, String user_id) {
this.coin = coin;
this.address = address;
this.userId = user_id;
}
public String getAddress() {
return address;
}
public String getCoin() {
return coin;
}
public String getUserId() {
return userId;
}
}
Example of return result:
{
"status":200,
"msg":"Request succeeded",
"data":{
"success_data":[
{
"address":"0x038B8E7406dED2Be112B6c7E4681Df5316957cad",
"user_id":"123sa",
"coin":"eth"
}
],
"fail_data":[
{
"address":"0xf854AC319A546ae11e367ef80a203AaC923ca6A3",
"user_id":"123sb",
"coin":"eth",
"msg":"The address has been assigned to other users and cannot be assigned repeatedly",
"status":524,
"owner_user_id":"345ad"
}
]
},
"date_time":"2021-03-22 10:55:58",
"time_stamp":1616381758,
"sign":"NTQg0pwGcHoIBTDzUAx635olXJDzCVy3OWCvu7LWdcZ3/2uYGjpflNXgXDtO8lMoK57GYZqG8p4v+0zd2ggBIk+XVhGAjPId8YLEsRFjWWXFxCWKpZALT54vH5zH5RdBsoZPW2lR/YQbZNhCbVED1QGB+QxFSx8wkf1Qi+R9WC4/bKhYZmmJXi9aoJCR9+BcdVVf0D+GBg3VqRWDPAosOHiCDRPsOw5+X8DijEkS7n8GFf9w5AT/lajWinlVU5fN2nra7sunYoJqUrk4tm3yTvF6k0GxcW6byFUZcddMJts9rE/uG3F+G/xW2MMG/F0N8scYKjyD4r85oMNl/pxBeQ=="
}
- After the merchant assigns the address to the user, it must notify the platform to update the address usage status through the "status synchronization interface", which supports batch synchronization (recommended at most 100 at a time).
HTTP Request
POST: /address/syncBatchStatus
request parameters
| parameter name | required | type | length | description |
|---|---|---|---|---|
| common parameter | Yes | JSON | common parameter refer to: signature (sign), version (version), merchant ID (app_id), time (time) | |
| address_list | yes | array | ||
| address_list.address | yes | string | within 128 characters | address |
| address_list.coin | Yes | string | Within 12 characters | The currency of the main chain to which the address belongs (if bnb_bsc, please pass eth) |
| address_list.user_id | yes | string | string within 40 | User id related to the address, consists of letters, numbers, and underscores. |
Response parameter description
| parameter name | type | description |
|---|---|---|
| status | yes | int |
| msg | yes | string |
| date_time | yes | string |
| time_stamp | yes | string |
| success_data | yes | null or JSONObjectString |
| success_data.address | yes | string |
| success_data.coin | yes | string |
| success_data.user_id | yes | string |
| fail_data | yes | null or JSONObjectString |
| fail_data.address | yes | string |
| fail_data.coin | yes | string |
| fail_data.user_id | yes | string |
| fail_data.status | yes | string |
| fail_data.msg | yes | string |
| fail_data.old_address | yes | string |
| fail_data.owner_user_id | yes | string |
| sign | yes | string |
Note: After the merchant assigns the address to its own user, it must request the interface to return the usage status information, and obtain the correct status code return value of 200 before enabling the user's deposit and withdrawal function.
1. If it is not synchronized, it will affect the use of the address acquisition interface (when the number of allocated unused addresses exceeds a certain amount, the platform will no longer allocate new addresses to merchants).
2. If the status synchronization does not receive the correct return result, but reports an error prompt, please manually troubleshoot the error.
Design rules: The same currency or contract currency, the same merchant, and the same user ID can only be assigned one address.
If the above rules are violated, an error will be reported.
Address verification
$url = "http://api.xxxx.com/shopapi/address/verifyAddress";
$header = [
'Content-Type:application/json',
];
$params = [
"app_id" => "hxgmau9imt86qky9",
"version" => "1.0",
"time" => 1578997143,
"sign" => "IUtWA3HEkK+wvTGaSBYwIrdx+ANyoOPl2/1LQTDevCSTxf4/lDXPrg6/ph+skNXIbZTR8Qs2yGGkqTUHEW/vbiTPzWkYZ874rRgplp06vhOBM/Pkw289K7PVCKy1ksOtLjwj1dUfDD/2AEqTgxRDjGyn+yDWRa7HLL/28bjU3pZoFwPPjbPyRxMK9BVL/li9IQ6hb8lyOyQNHNxS3C82sDVaQKqrB0dOqtP61OH0hBonrxMhBAMD8dUmaqO6Ef+bhHzbBm3BCC5VapkOkdthb+UWXKCiBoCipg3gqrwnBdOUGXqx/1mYicNZ+oHeVpBwnJlXudff6FT+HySszr5ISw==",
"coin" => "trx",
"address" => "TUEgUZh24tA48EXiAQjA6Qf6rSS7bJKQ6g"
];
$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/address/verifyAddress"
data := map[string]string{
"app_id":"hxgmau9imt86qky9",
"version":"1.0",
"time":"1578997143",
"sign":"IUtWA3HEkK+wvTGaSBYwIrdx+ANyoOPl2/1LQTDevCSTxf4/lDXPrg6/ph+skNXIbZTR8Qs2yGGkqTUHEW/vbiTPzWkYZ874rRgplp06vhOBM/Pkw289K7PVCKy1ksOtLjwj1dUfDD/2AEqTgxRDjGyn+yDWRa7HLL/28bjU3pZoFwPPjbPyRxMK9BVL/li9IQ6hb8lyOyQNHNxS3C82sDVaQKqrB0dOqtP61OH0hBonrxMhBAMD8dUmaqO6Ef+bhHzbBm3BCC5VapkOkdthb+UWXKCiBoCipg3gqrwnBdOUGXqx/1mYicNZ+oHeVpBwnJlXudff6FT+HySszr5ISw==",
"coin":"trx",
"address":"TUEgUZh24tA48EXiAQjA6Qf6rSS7bJKQ6g",
}
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":"1578997143",
"sign":"IUtWA3HEkK+wvTGaSBYwIrdx+ANyoOPl2/1LQTDevCSTxf4/lDXPrg6/ph+skNXIbZTR8Qs2yGGkqTUHEW/vbiTPzWkYZ874rRgplp06vhOBM/Pkw289K7PVCKy1ksOtLjwj1dUfDD/2AEqTgxRDjGyn+yDWRa7HLL/28bjU3pZoFwPPjbPyRxMK9BVL/li9IQ6hb8lyOyQNHNxS3C82sDVaQKqrB0dOqtP61OH0hBonrxMhBAMD8dUmaqO6Ef+bhHzbBm3BCC5VapkOkdthb+UWXKCiBoCipg3gqrwnBdOUGXqx/1mYicNZ+oHeVpBwnJlXudff6FT+HySszr5ISw==",
"coin":"trx",
"address":"TUEgUZh24tA48EXiAQjA6Qf6rSS7bJKQ6g",
};
let POST_OPTIONS = {
port: 80,
host: "api.xxxx.com",
path: "/shopapi/address/verifyAddress",
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) {
// more detail functions, see "Signature Regulations"Java demo
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", "trx");
params.put("address", "HsHGWeEMmx5QLds9UiWfjxarM4RbLAc3xrD");
try {
params.put("sign", signer.genSign(params, priKey));
Gson gson = new GsonBuilder().create();
System.out.println("params = " + gson.toJson(params));
String res = doPost(baseUrl + "/address/verifyAddress", 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");
}
Example of return result:
{
"status":200,
"msg":"Verification succeeded",
"data":null,
"date_time":"2020-10-20 15:32:16",
"time_stamp":1603179136,
"sign":"isaqtnmKOJca5+QpHHeigqmAXh4Gquv3akniwzF0YEdIiz5prc0lMZ2+PWYsYkkqX66JedddyofD/7pgIjurh8qNaE9PWvVkupBgunzevlfwNUrIvsCUpUx8m1Iv8WPqUqdszoRbCDed3PqM2mcMe0Ol28QIRPeoMc8qRdSh4Bph9EfVtWS4x+8gqcax4SmSsbGGhCpe1LB4uS8OGaMbS18wz50asjz9HRnElwYiHbnz4R5TqHcnVqdFFXNWBlPM5QJjDqh+aArZneNwnmU4VCM82R4teLELZ/ldXOpUuCUzrI77iE8Of2qLaIIplKc3vZ6VqqoguD8M1QEyLAmk8A=="
}
- Address validity verification, currently only supports eth, trx, btc main chain address verification, and will continue to expand other main chain address verification in the future
HTTP Request
POST: /address/verifyAddress
request parameters
| parameter name | required | type | description |
|---|---|---|---|
| common parameter | yes | string | common parameter refers to: signature (sign), version (version), merchant ID (app_id), time (time) |
| coin | Yes | string | Main chain coin name within 12 characters, the coin name provided by the platform shall prevail |
| address | yes | string | address |
Response parameter description
| parameter name | required | type | description |
|---|---|---|---|
| status | yes | int | Return value: 200 Verification successful; 543 Verification failed; 565 Currency not supported |
| msg | no | string | within 100 characters, state description |
| data | yes | jsonObject | — |
| date_time | No | DateTime | Beijing time: 2020-06-29 14:28:14 |
| time_stamp | no | string | response time in seconds: 1593412094 |
| sign | yes | string | return the signature, sign all the above parameters |
- Note: The above addresses belong to the ETH main chain address, and can also receive ETH contract coin
Address AML verification
$url = "http://api.xxxx.com/shopapi/address/verifyAml";
$header = [
'Content-Type:application/json',
];
$params = [
"app_id" => "hxgmau9imt86qky9",
"version" => "1.0",
"time" => 1578997143,
"sign" => "IUtWA3HEkK+wvTGaSBYwIrdx+ANyoOPl2/1LQTDevCSTxf4/lDXPrg6/ph+skNXIbZTR8Qs2yGGkqTUHEW/vbiTPzWkYZ874rRgplp06vhOBM/Pkw289K7PVCKy1ksOtLjwj1dUfDD/2AEqTgxRDjGyn+yDWRa7HLL/28bjU3pZoFwPPjbPyRxMK9BVL/li9IQ6hb8lyOyQNHNxS3C82sDVaQKqrB0dOqtP61OH0hBonrxMhBAMD8dUmaqO6Ef+bhHzbBm3BCC5VapkOkdthb+UWXKCiBoCipg3gqrwnBdOUGXqx/1mYicNZ+oHeVpBwnJlXudff6FT+HySszr5ISw==",
"chain" => "trx",
"address" => "TUEgUZh24tA48EXiAQjA6Qf6rSS7bJKQ6g",
"skip_api_source" => "OK_LINK"
];
$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/address/verifyAml"
data := map[string]string{
"app_id":"hxgmau9imt86qky9",
"version":"1.0",
"time":"1578997143",
"sign":"IUtWA3HEkK+wvTGaSBYwIrdx+ANyoOPl2/1LQTDevCSTxf4/lDXPrg6/ph+skNXIbZTR8Qs2yGGkqTUHEW/vbiTPzWkYZ874rRgplp06vhOBM/Pkw289K7PVCKy1ksOtLjwj1dUfDD/2AEqTgxRDjGyn+yDWRa7HLL/28bjU3pZoFwPPjbPyRxMK9BVL/li9IQ6hb8lyOyQNHNxS3C82sDVaQKqrB0dOqtP61OH0hBonrxMhBAMD8dUmaqO6Ef+bhHzbBm3BCC5VapkOkdthb+UWXKCiBoCipg3gqrwnBdOUGXqx/1mYicNZ+oHeVpBwnJlXudff6FT+HySszr5ISw==",
"chain":"trx",
"address":"TUEgUZh24tA48EXiAQjA6Qf6rSS7bJKQ6g",
"skip_api_source": "OK_LINK",
}
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":"1578997143",
"sign":"IUtWA3HEkK+wvTGaSBYwIrdx+ANyoOPl2/1LQTDevCSTxf4/lDXPrg6/ph+skNXIbZTR8Qs2yGGkqTUHEW/vbiTPzWkYZ874rRgplp06vhOBM/Pkw289K7PVCKy1ksOtLjwj1dUfDD/2AEqTgxRDjGyn+yDWRa7HLL/28bjU3pZoFwPPjbPyRxMK9BVL/li9IQ6hb8lyOyQNHNxS3C82sDVaQKqrB0dOqtP61OH0hBonrxMhBAMD8dUmaqO6Ef+bhHzbBm3BCC5VapkOkdthb+UWXKCiBoCipg3gqrwnBdOUGXqx/1mYicNZ+oHeVpBwnJlXudff6FT+HySszr5ISw==",
"chain":"trx",
"address":"TUEgUZh24tA48EXiAQjA6Qf6rSS7bJKQ6g",
"skip_api_source": "OK_LINK",
};
let POST_OPTIONS = {
port: 80,
host: "api.xxxx.com",
path: "/shopapi/address/verifyAml",
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) {
// more detail functions, see "Signature Regulations"Java demo
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", "trx");
params.put("address", "HsHGWeEMmx5QLds9UiWfjxarM4RbLAc3xrD");
params.put("skip_api_source", "OK_LINK");
try {
params.put("sign", signer.genSign(params, priKey));
Gson gson = new GsonBuilder().create();
System.out.println("params = " + gson.toJson(params));
String res = doPost(baseUrl + "/address/verifyAml", 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");
}
Example of return result:
{
"data": {
"address": "0x8e609ac80f4324e499a6efd24f221a2caa868224",
"chain": "eth",
"detail": "{\"可疑交易\":[\"大额交易比例较高\",\"存在高频交易行为\",\"交易的集中程度高\"],\"黑地址关联方\":[\"黑客关联方\"]}",
"level": "MEDIUM",
"risk_code": 5103,
"risk_score": "62",
"source": "OK_LINK",
"tag": "风险中等:黑地址关联方;可疑交易"
},
"date_time": "2023-11-22 18:19:54",
"msg": "SUCCESS",
"sign": "PSkdliG8jomX+ojV9jJ6Vv19/uTw6WqYnNCedm1dySNi4AqFbhW/gQVYmuXhcff51uJvsHKsJXGkAtATi5iqMsHKVZDNdNbsmUFV8pdUKIEHrLCHpIq5G7SYSdU0O5t1BYLVAmCIZa7YLF9vnPKc0gF1Y2so8HmznuFToO5jlHqS0hsLvc8HAjEDuKkl1Zpgykciftc7MvXC4hE14PwLssHmKc8J97oh+ab1BG+AnjxiI1fcArNAZbwj+YUK9l2RqD0C9wh+13qRTC7Aj0rZHGFBwFoTOqpcpxruarSlEcdi98ueZgrLd0amb7/l5tKPTbpasBv0yjzezfrsP2/NIg==",
"status": 200,
"time_stamp": 1700648394
}
- Address AML verification. Current support btc,eos,etc,eth,trx,usdt,xrp. If you need support this feature, please contact customer service。
HTTP Request
POST : /address/verifyAml
request parameters
| parameter name | required | type | description |
|---|---|---|---|
| common parameter | yes | string | common parameter refers to: signature (sign), version (version), merchant ID (app_id), time (time) |
| chain | Yes | string | Main chain coin name within 12 characters, the coin name provided by the platform shall prevail |
| address | yes | string | address |
| skip_api_source | no | string | Specify the aml source that skips remote api query, you can fill in the source OK_LINK or BEOSIN, separated by multiple commas. The premise is that the corresponding source has been activated through customer service. |
Response parameter description
| parameter name | required | type | description |
|---|---|---|---|
| status | yes | int | Return value: 200 success |
| msg | no | string | within 100 characters, state description |
| data | yes | jsonObject | — |
| data.chain | yes | string | main coin name of chain |
| data.address | yes | string | address |
| data.risk_code | yes | int | risk code. default value 0, means no risk. Non Zero means there is risk, and more code will be added later. |
| data.source | yes | string | AML data source,OK_LINK,SLOW_MIST,BEOSIN |
| data.tag | no | string | risk tags |
| data.detail | no | string | risk description |
| data.risk_score | no | string | OK_LINK risk score,value 100 means no risk.The lower the score, the higher the risk. |
| data.level | no | string | OK_LINK risk level,SEVERE,HIGH,MEDIUM,LOW,NONE |
| date_time | No | DateTime | Beijing time: 2020-06-29 14:28:14 |
| time_stamp | no | string | response time in seconds: 1593412094 |
| sign | yes | string | return the signature, sign all the above parameters |
risk_code description
| risk_code | description |
|---|---|
| 0 | no risk |
| 5001 | Extortion involving malicious mining activities |
| 5002 | money theft attacks |
| 5003 | phishing attacks |
| 5004 | phishing attacks involving cybercrime |
| 5101 | SEVERE risk level(source OK_LINK) |
| 5102 | HIGH risk level(source OK_LINK) |
| 5103 | MEDIUM risk level(source OK_LINK) |
| 5104 | LOW risk level(source OK_LINK) |
| 5201 | Severe risk level(source BEOSIN) |
| 5202 | High risk level(source BEOSIN) |
| 5203 | Medium risk level(source BEOSIN) |
| 5204 | Low risk level(source BEOSIN) |
| xxxx | may more codes ... |
Deposit
Top-up list
$url = "http://api.xxxx.com/shopapi/receive/list";
$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==",
"page" => 1,
"coin" => "eth",
"order_id" => "20200803220112662436",
"status" => "1",
"start_time" => "1578736053",
"end_time" => "1578836053",
"page_size" => "20",
"sort_num" => 2
];
$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/receive/list"
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==",
"page": "1",
"coin" : "eth",
"order_id" : "20200803220112662436",
"status" : "1",
"start_time" : "1578736053",
"end_time" : "1578836053",
"page_size" : "20",
"sort_num" : "2",
}
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==",
"page": "1",
"coin" : "eth",
"order_id" : "20200803220112662436",
"status" : "1",
"start_time" : "1578736053",
"end_time" : "1578836053",
"page_size" : "20",
"sort_num" : "2",
};
let POST_OPTIONS = {
port: 80,
host: "api.xxxx.com",
path: "/shopapi/receive/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) {
// more detail functions, see "Signature Regulations"Java demo
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");
params.put("coin", "eth");
params.put("order_id", "20200803220112662436");
params.put("status", "1");
params.put("start_time", "1578736053");
params.put("end_time", "1578836053");
params.put("page_size", "20");
params.put("sort_num", "2");
try {
params.put("sign", signer.genSign(params, priKey));
Gson gson = new GsonBuilder().create();
System.out.println("params = " + gson.toJson(params));
String res = doPost(baseUrl + "/receive/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");
}
Example of return result:
{
"status":200,
"msg":"Processing successful",
"data":{
"page":1,
"count":9,
"list":[
{
"coin":"hc",
"txid":"b064a252228105d7be10fefabf02fcdfbb863a071304298f7c3c1c1ace471e2b",
"total":"0.30000000",
"chain":"hc",
"confirm_count":"6",
"order_id":"20200803220112662436",
"status":"0",
"address":"0", #Add address,
"from_address":"0", #from address
"time":"1583922327", #Add the time with status=1 if there is no time with status=0
"type": "1"
}
]
},
"date_time":"2020-03-11 18:25:27",
"time_stamp":1583922327,
"sign":"ESIOqIfhKnYHFh3HPD1XewWYBraPz+MukYIFcMrMLv7zEKZEIY/ZsxOYTwQ1AtcfSPiVlOJtp9SqtAVxRxcwRNK9X0ZHjSo+eP8YRXYhDCTi0jFETy5hA2Cy8j3X0t7LFiO9feGE6qA/Xok4sngbTwbQ3MqZP+lN/P3dK2VZyiFKywx5/pPi4tUAOpCo4SJEtLkapS4rCHwNreo72Z7D8L9YiT4iCOkzYBL/2ryuwZrpM1sX6WvC4Zf3LRLTE+X4XFZ++AlbrAuSS+zis+bWEG/qEYAdTXOXhkQrgfuidpH/U2HGjA9zf/skYlisdAt4cMiMiQmgIHTuO2Ujobn2Ow=="
}
Query order status through the batch query interface
HTTP Request
POST: /receive/list
request parameters
| parameter name | required | type | description |
|---|---|---|---|
| common parameter | yes | string | common parameter refers to: signature (sign), version (version), merchant ID (app_id), time (time) |
| page | no | int, default is 1 | 1<= N <=Max, N>Max ? N=Max ; N<1 ? N=1 |
| coin | no | varchar | coin name (eg: eth) |
| order_id | no | varchar | platform order number |
| status | no | int | 0 pending review 1 transfer successful |
| start_time | no | int | start time (creation time) format: timestamp |
| end_time | no | int | end time (creation time) format: timestamp |
| page_size | no | int | number of pages per page (20-100), default 20 |
| sort_num | no | int | default list sorting is ascanding order of record creation time ( 1 positive order; 2 reverse order) |
Response parameter description
| parameter name | type | description |
|---|---|---|
| status | int | status code |
| msg | string | state description |
| data | jsonObject | |
| data.page | int | page number |
| data.count | int | number of records on this page |
| data.list | jsonArray | specific record |
| data.list.coin | string | currency |
| data.list.txid | string | on-chain txid |
| data.list.total | numberString | total amount |
| data.list.chain | string | main chain coin name |
| data.list.confirm_count | string | number of confirmations |
| data.list.order_id | string | order number |
| data.list.status | string | 0 credited but not confirmed 1 confirmed successful 5 failed 8 waiting for refund 10 refunding 20 refunded |
| data.list.address | string | forwarding address |
| data.list.from_address | string | from address |
| data.list.time | string | The default is the time of status=1, if status=0 is the time of status=0 |
| data.list.type | string | 1 on-site deposit 2 on-chain deposit |
| date_time | string | response time |
| time_stamp | int | unix timestamp in second |
| sign | string | signature |
Account balance query
$url = "http://api.xxxx.com/shopapi/balance";
$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" => "etc"
];
$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"
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": "etc",
}
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": "etc",
};
let POST_OPTIONS = {
port: 80,
host: "api.xxxx.com",
path: "/shopapi/balance",
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) {
// more detail functions, see "Signature Regulations"Java demo
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");
params.put("coin", "trx");
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", 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");
}
Example of return result:
{
"status": 200,
"msg": "Request succeeded",
"data": {
"chain_hot_amount": "0",
"amount": "0",
"freeze_amount": "0",
"total": "0",
"waiting_collect_amount": "0"
},
"date_time": "2022-07-22 19:03:08",
"time_stamp": 1658487788,
"sign": "tA8F3+VBGqyA0hmPPGMSIGgCH6hRssZc6Ez+KPst+c28SoakNI0k6Xoqh6qbHXsaPNBuPuaQnpR3unxWsOs675podt8vQREhzInOH1iieceqRzdtzKifEcaekhWDblGUK+h6yJTYGY0ABRtDDfb7X/GByEdmzBeOGz8LFa3oRNkVc59r5CPfBBbqGyYVM5KJM5l2RHXezXC8z2OmL7XK23o/zxD2JAQHukXqrAj5WhUpClhw4WEVzBhswj/dELKq4jUI2Rp4PVDLMj+H4itPf7XLkV3F/cwc67rBlTXgR31vUqwCbFbdbDIjcbm+9ksrTH4QHkkdW4GlXCLO/aqvEA=="
}
Currency balance query interface, which returns the total remaining balance of on-chain deposit of a single currency.
HTTP Request
POST: /balance
request parameters
| parameter name | required | type | description |
|---|---|---|---|
| common parameter | Yes | JSON | common parameter refer to: signature (sign), version (version), merchant ID (app_id), time (time) |
| coin | yes | string | coin name within 20 characters, the coin name provided by the platform shall prevail |
Response parameter description
| parameter name | type | description |
|---|---|---|
| status | int | status code |
| msg | string | state description |
| data | jsonObject | |
| data.amount | string | — |
| data.freeze_amount | string | — |
| data.total | string | — |
| data.chain_hot_amount | string | — |
| date_time | string | response time |
| time_stamp | int | unix timestamp in second |
| sign | string | signature |
Deposit result callback notification
$url = "The specific callback address is provided by the merchant to the platform";
$header = [
'Content-Type:application/json',
];
$params = [
"data" => [
"order_id" => "2020010211153423123456",
"coin" => "eth",
"chain" => "eth",
"address" => "this is test address",
"from_address" => "this is test address",
"txid" => "this is txid",
"total" => "5",
"amount" => "10.0089",
"fee" => "0",
"status" => "0",
"confirm_count" => "5",
"time" => "1650011196",
"type" => 1
],
"sign" => "OTA8utI8y8G93p7RPCyb4qIilFQ0B4Aq4iUjhaXWK9m2kgektqlHOASDKXT2VE7NPNysrGycYlVfjDR2WGZn1G66phHo3qa9CcCNpG9klOBEuBEMjiVbb/d8AXcxEzvQr9OCwNsikyxonyzLiY/lsNHeGm9cC5eRvlNLdUSVBipH+ajPd0lDHCayZPs1eCMfbm/xnf8e2lfy6z0UPOpHGfyX/0+hz99Ir5Xnx+0sBBzyZZJxKm4ROid5aDv/9m9guILpURae+Yw/IrkYF4uAKGX+/44cBvtTRQSdX76CAOBSiywZa6BAgDYBLRtkAPM+i+vwNzFBovqHUvI+4Ponaw==",
];
$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 = "The specific callback address, provided by the merchant to the platform side"
data := map[string]interface{}{
"data": map[string]string{
"order_id": "2020010211153423123456",
"coin": "eth",
"chain": "eth",
"address": "this is test address",
"from_address": "this is test address",
"txid": "this is txid",
"total": "5",
"amount": "10.0089",
"fee": "0",
"status": "0",
"confirm_count": "5",
"time": "1650011196",
"type": "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 = {
"data": {
"order_id": "2020010211153423123456",
"coin": "eth",
"chain": "eth",
"address": "this is test address",
"from_address": "this is test address",
"txid": "this is txid",
"total": "5",
"amount": "10.0089",
"fee": "0",
"status": "0",
"confirm_count": "5",
"time": "1650011196",
"type": "1",
},
"sign": "OTA8utI8y8G93p7RPCyb4qIilFQ0B4Aq4iUjhaXWK9m2kgektqlHOASDKXT2VE7NPNysrGycYlVfjDR2WGZn1G66phHo3qa9CcCNpG9klOBEuBEMjiVbb/d8AXcxEzvQr9OCwNsikyxonyzLiY/lsNHeGm9cC5eRvlNLdUSVBipH+ajPd0lDHCayZPs1eCMfbm/xnf8e2lfy6z0UPOpHGfyX/0+hz99Ir5Xnx+0sBBzyZZJxKm4ROid5aDv/9m9guILpURae+Yw/IrkYF4uAKGX+/44cBvtTRQSdX76CAOBSiywZa6BAgDYBLRtkAPM+i+vwNzFBovqHUvI+4Ponaw==",
};
let POST_OPTIONS = {
port: 80,
host: "The specific callback address, provided by the merchant to the platform side",
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("order_id", "2020010211153423123456");
data.put("coin", "eth");
data.put("chain", "eth");
data.put("address", "this is test address");
data.put("from_address", "this is test address");
data.put("txid", "this is txid");
data.put("amount", "1");
data.put("fee", "0");
data.put("total", "1");
data.put("status", "1");
data.put("confirm_count", "3");
data.put("time", "1650011196");
data.put("type", "1");
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/deposit/callback", gson.toJson(params));
// if (null == res) {
// throw new RuntimeException("http error");
// }
// mock response from shop callback API
{
res = """
{
"status":200,
"sign": "A3wCWwcw1w7Ee/xDDWBpf80i2Wc1oqpcqChznv9mr7dgLcKPQAECtemvmRTPwAxsZm6SJeGSN7P3ssB8/wmyZcJiVykr1HWbcQNL/YNYb6MCJqBXpbpnOwaBSWGr+aOh/1ql1ciW04W/rhF8rHch13Se+ZQ1TmJ5/JooEssCxaIRI4EiwGM47cpFSpuMv1e0UMsozCNvudAZDhwh/fDU4eIk2n3qikFEN6uAkG2gN2Y0dseG1/ua1RLYn97lb6oU4cYTpmrlGYZCMzc+cvhDkBL83UsU1hiVYMQtTJ5jtrUe5sumkYuVqkT0VjZklszvKtDDblK/KYXtZ2kRkWn2kg==",
"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");
}
Example of return result:
{
"status":200,
"sign": "OTA8utI8y8G93p7RPCyb4qIilFQ0B4Aq4iUjhaXWK9m2kgektqlHOASDKXT2VE7NPNysrGycYlVfjDR2WGZn1G66phHo3qa9CcCNpG9klOBEuBEMjiVbb/d8AXcxEzvQr9OCwNsikyxonyzLiY/lsNHeGm9cC5eRvlNLdUSVBipH+ajPd0lDHCayZPs1eCMfbm/xnf8e2lfy6z0UPOpHGfyX/0+hz99Ir5Xnx+0sBBzyZZJxKm4ROid5aDv/9m9guILpURae+Yw/IrkYF4uAKGX+/44cBvtTRQSdX76CAOBSiywZa6BAgDYBLRtkAPM+i+vwNzFBovqHUvI+4Ponaw==",
"data":{
"success_data":"success"
}
}
User's deposit arrival notification callback, a platform initiates a request, and the merchant responds
HTTP Request
POST: The specific callback URL is provided by the merchant to the platform side
request parameters
| parameter name | required | type | description |
|---|---|---|---|
| data | no | string | callback notification carries data structure |
| data.order_id | yes | string | order number |
| data.coin | yes | string | coin name |
| data.chain | yes | string | main chain coin name |
| data.address | yes | string | account address |
| data.from_address | yes | string | from address,product environment return this field only for merchant, who created after 2023-05-05. |
| data.txid | yes | string | on-chain txid |
| data.total | yes | string | actual credit total = amount - fee |
| data.fee | yes | string | platform fee |
| data.amount | no | string | on-chain amount (this field is for reference only) |
| data.status | yes | int | 0 credited but not confirmed 1 confirmed successful 5 failed 8 waiting for refund 10 refunding 20 refunded |
| data.confirm_count | Yes | int | Confirmation count is for reference only, with status=1 as successful entry |
| data.time | yes | int | order confirmation time |
| data.type | yes | int | 1 on-site deposit 2 on-chain deposit |
| data.reject_reason | no | string | The rejection reason selected during merchant review. See the following table for value description. This parameter does not exist by default. If you need to return it, please contact us. |
| sign | yes | string | sign the data in data |
Response parameter description
| parameter name | required | type | description |
|---|---|---|---|
| status | yes | int | status code |
| data | yes | jsonObject | returns the data object |
| data.success_data | yes | sring | success Received successfully |
| sign | yes | string | signature |
request parameter data.reject_reason description
| value | description |
|---|---|
| no-shop-coin | Shop coin not supported |
| shop-coin-no-recharge | Shop coin not support recharge |
| aml-slow-mist | Slow Mist aml risk address |
| aml-ok-link | OKLink aml risk address |
| other | other |
Withdraw
Withdrawal application
$url = "http://api.xxxx.com/shopapi/transfer";
$header = [
'Content-Type:application/json',
];
$params = [
"app_id" => "hxgmau9imt86qky9",
"version" => "1.0",
"time" => 1579004943,
"user_id" => "0",
"coin" => "hc",
"address" => "HsRDEePh7WBCsdJPfo1UsjfurwLBU6HD5Vi",
"amount" => "0.02",
"trade_id" => "20200114202903274786",
"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"
data := map[string]interface{}{
"app_id":"hxgmau9imt86qky9",
"version":"1.0",
"time":"1579004943",
"user_id":"0",
"coin":"hc",
"address":"HsRDEePh7WBCsdJPfo1UsjfurwLBU6HD5Vi",
"amount":"0.02",
"trade_id":"20200114202903274786",
"sign":"dLtK+uiPcnxt2ACKMbBqQ6wI5ttAvesOHzK5ybVID1R6hqYPDTkagl7Tsjr5iLJafehcSLTZyJLtCRI8O2CtIWQUUroGXBneHZC486NUi/4FMOQs0FaAgm17pWlbhX5/96cWXXXMVeoe3IZFKaFNYSWaA14v3RcdDU6QDE/9ixGiSJ0DIxm9NKA0+RkbIFbyYeuFn8d63OcjmUhv7tsOE6rKCc3Q2yi7Qe9i6BNAQFYMFATztb18MsxsBHKUxNqklqyVnl0ofETAHmQhfOHLmungOJQnOqAAuwfmRtg50Qci5F+R2mXeqjmIXko/u3E+DLYW1ygDBp3afKZmU4PwmA==",
}
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",
"user_id":"0",
"coin":"hc",
"address":"HsRDEePh7WBCsdJPfo1UsjfurwLBU6HD5Vi",
"amount":"0.02",
"trade_id":"20200114202903274786",
"sign":"dLtK+uiPcnxt2ACKMbBqQ6wI5ttAvesOHzK5ybVID1R6hqYPDTkagl7Tsjr5iLJafehcSLTZyJLtCRI8O2CtIWQUUroGXBneHZC486NUi/4FMOQs0FaAgm17pWlbhX5/96cWXXXMVeoe3IZFKaFNYSWaA14v3RcdDU6QDE/9ixGiSJ0DIxm9NKA0+RkbIFbyYeuFn8d63OcjmUhv7tsOE6rKCc3Q2yi7Qe9i6BNAQFYMFATztb18MsxsBHKUxNqklqyVnl0ofETAHmQhfOHLmungOJQnOqAAuwfmRtg50Qci5F+R2mXeqjmIXko/u3E+DLYW1ygDBp3afKZmU4PwmA==",
};
let POST_OPTIONS = {
port: 80,
host: "api.xxxx.com",
path: "/shopapi/transfer",
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) {
// more detail functions, see "Signature Regulations"Java demo
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("user_id", "1");
params.put("coin", "hc");
params.put("address", "HsRDEePh7WBCsdJPfo1UsjfurwLBU6HD5Vi");
params.put("amount", "0.02");
params.put("trade_id", "20200114202903274786");
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", 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");
}
Example of return result:
{
"status":200,
"msg":"Request succeeded",
"data":{
"trade_id":"20200114005026028784"
},
"date_time":"2020-01-14 00:50:27",
"sign":"ib1gqr0E0gJ02yo3InXKcKGaPqIp+r1izMego+KMRvE0B4ZdkFGrLmOtxGStUBibGVMzJRGWppKyU4PzcK877AOEvQlSFiUI+hDL1z8WaZsWD3r3ykbPzU0uWo4U+6WQTpOEo1gJ/N2FlAgwgzJsd
}
The merchant initial a on-chain withdrawal request will use this API. In order to complete the withdrawl request, merchant need to prepare the callback API for risk control callback. ( Detail please refer to the Risk Control callback -> The second review of the withdrawal order)
POST: /transfer
request parameters
| parameter name | required | type | description |
|---|---|---|---|
| common parameter | yes | string | common parameter refers to: signature (sign), version (version), merchant ID (app_id), time (time) |
| user_id | no | string | user ID, composed of letters, numbers and underscores, within 40 characters in length |
| coin | yes | string | currency abbreviation - platform agreement shall prevail |
| amount | yes | string | withdrawal amount, an error will occur if it exceeds the range |
| address | yes | string | payment address, an error will occur if it exceeds the range |
| memo | no | string | memo/tag needs to be filled in when the current currency is eos and its tokens |
| trade_id | Yes | string | The unique ID of the merchant's transaction (recommended format: year, month, day, hour, minute, second + 6-digit random number case: 20200311202903000001) |
Response parameter description
| parameter name | type | description |
|---|---|---|
| status | int | status code |
| msg | string | state description |
| data | jsonObject | |
| data.trade_id | string | Merchant-side transaction unique ID |
| date_time | string | response time |
| time_stamp | int | unix timestamp in second |
| sign | string | signature |
- Remark: This api is for submit the withdrawal request, having the result of successfully is only mean the withdraw request is received. The final withdrawal request result will use the withdrawal request callback API to notify the merchant. For more return error codes, please see the error code description on the home page.
Withdrawal list
$url = "http://api.xxxx.com/shopapi/transfer/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/transfer/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/transfer/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) {
// more detail functions, see "Signature Regulations"Java demo
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 + "/transfer/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");
}
Example of return result:
{
"status": 200,
"msg": "Processing successful",
"data": {
"page": 1,
"max_page": 1,
"count": 1,
"list": [{
"trade_id": "20200114202903274786",
"coin": "hc",
"chain": "hc",
"txid": "",
"amount": "0.02",
"fee": "0",
"total": "0.02",
"address": "HsRDEePh7WBCsdJPfo1UsjfurwLBU6HD5Vi",
"from_address": "the transaction from address",
"status": "2",
"time": "1658482253",
"type": "2",
"gas_fee": "0.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=="
}
You can query the status of an order through this interface, you can query only one, or you can query multiple ones vaguely.
HTTP Request
POST: /transfer/list
request parameters
| parameter name | required | type | description |
|---|---|---|---|
| common parameter | yes | string | common parameter refers to: signature (sign), version (version), merchant ID (app_id), time (time) |
| trade_id | No | string | If the trade_id is passed as exact search, the following parameters will be invalid |
| page | no | int | 1<= N <=Max, take Max if it exceeds Max, return 1 if it is less than 1 or if no parameter is passed |
| status | no | int | 0 pending review 1 successful withdrawal, 2 waiting for risk control processing, 5 waiting for currency issuance, 10 review failed, 20 transfer failed |
| start_time | no | int | start time (creation time) format: timestamp |
| end_time | no | int | end time (creation time) format: timestamp |
| page_size | no | int | number of pages per page (20 ~ 100), default 20 |
| sort_num | no | int | default list sorting is ascanding order of record creation time ( 1 positive order; 2 reverse order) |
Response parameter description
| parameter name | type | description |
|---|---|---|
| status | int | status code |
| msg | string | state description |
| data | jsonObject | |
| data.page | int | page number |
| data.count | int | number of records on this page |
| data.list | jsonArray | specific record |
| data.list.trade_id | string | trade id |
| data.list.coin | string | currency |
| data.list.txid | string | on-chain txid |
| data.list.amount | string | total amount |
| data.list.fee | string | handling fee (business rule fee is not on-chain gasfee), external deduction mode |
| data.list.total | string | Total withdrawal amount total = amount+fee |
| data.list.address | string | withdrawal transaction to address |
| data.list.from_address | string | withdrawal transaction from address, product environment return this field only for merchant, who created after 2025-01-22 |
| data.list.chain | string | main chain coin name |
| data.list.memo | string | memo/tag will return this field when it is currently eos and its token |
| data.list.status | enum | 0 pending review, 1 successful withdrawal, 2 waiting for risk control processing, 5 waiting for currency issuance, 10 review failed, 20 transfer failed |
| data.list.time | time_stamp | Status time, finally fixed at the time when status=1 |
| data.list.type | string | 1 On-site transaction 2 On-chain transaction 5 Centralized withdrawal |
| data.list.gas_fee | string | gas fee,product environment return this field only for merchant, who created after 2024-08-14, the precision is 8 digits |
| date_time | string | response time |
| time_stamp | int | unix timestamp in second |
| sign | string | signature |
Withdrawal result callback notification
$url = "The withdrawal callback URL configured in the backend of the merchant";
$header = [
'Content-Type:application/json',
];
$params = [
"data" => [
"trade_id" => "this is trade_id",
"coin" => "eth",
"txid" => "this is txid",
"address" => "this is to address",
"from_address" => "this is from address",
"time" => "1591779242",
"amount" => "10.1",
"fee" => "0",
"total" => "10.1",
"status" => "1",
"msg" => "Prompt information",
"type" => 1,
"gas_fee" => "0.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 = "The withdrawal callback URL configured in the backend of the merchant"
data := map[string]interface{}{
"data": map[string]string{
"trade_id":"this is trade_id",
"coin":"eth",
"txid":"this is txid",
"address":"this is to address",
"from_address":"this is from address",
"time":"1591779242",
"amount": "10.1",
"fee":"0",
"total":"10.1",
"status":"1",
"msg":"Prompt information",
"type":"1",
"gas_fee":"0.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 = {
"data": {
"trade_id":"this is trade_id",
"coin":"eth",
"txid":"this is txid",
"address":"this is to address",
"from_address":"this is from address",
"time":"1591779242",
"amount": "10.1",
"fee":"0",
"total":"10.1",
"status":"1",
"msg":"Prompt information",
"type":"1",
"gas_fee":"0.1",
},
"sign": "OTA8utI8y8G93p7RPCyb4qIilFQ0B4Aq4iUjhaXWK9m2kgektqlHOASDKXT2VE7NPNysrGycYlVfjDR2WGZn1G66phHo3qa9CcCNpG9klOBEuBEMjiVbb/d8AXcxEzvQr9OCwNsikyxonyzLiY/lsNHeGm9cC5eRvlNLdUSVBipH+ajPd0lDHCayZPs1eCMfbm/xnf8e2lfy6z0UPOpHGfyX/0+hz99Ir5Xnx+0sBBzyZZJxKm4ROid5aDv/9m9guILpURae+Yw/IrkYF4uAKGX+/44cBvtTRQSdX76CAOBSiywZa6BAgDYBLRtkAPM+i+vwNzFBovqHUvI+4Ponaw==",
};
let POST_OPTIONS = {
port: 80,
host: "The withdrawal callback URL configured in the backend of the merchant",
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("trade_id","this is trade_id");
data.put("coin","eth");
data.put("txid","this is txid");
data.put("address","this is to address");
data.put("from_address","this is from address");
data.put("time","1591779242");
data.put("amount", "10.1");
data.put("fee","0");
data.put("total","10.1");
data.put("status","1");
data.put("msg","Prompt information");
data.put("type","1");
data.put("gas_fee","0.1");
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/withdraw/callback", gson.toJson(params));
// if (null == res) {
// throw new RuntimeException("http error");
// }
// mock response from shop callback API
{
res = """
{
"status":200,
"sign": "A3wCWwcw1w7Ee/xDDWBpf80i2Wc1oqpcqChznv9mr7dgLcKPQAECtemvmRTPwAxsZm6SJeGSN7P3ssB8/wmyZcJiVykr1HWbcQNL/YNYb6MCJqBXpbpnOwaBSWGr+aOh/1ql1ciW04W/rhF8rHch13Se+ZQ1TmJ5/JooEssCxaIRI4EiwGM47cpFSpuMv1e0UMsozCNvudAZDhwh/fDU4eIk2n3qikFEN6uAkG2gN2Y0dseG1/ua1RLYn97lb6oU4cYTpmrlGYZCMzc+cvhDkBL83UsU1hiVYMQtTJ5jtrUe5sumkYuVqkT0VjZklszvKtDDblK/KYXtZ2kRkWn2kg==",
"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");
}
Example of return result:
{
"status":200,
"sign": "OTA8utI8y8G93p7RPCyb4qIilFQ0B4Aq4iUjhaXWK9m2kgektqlHOASDKXT2VE7NPNysrGycYlVfjDR2WGZn1G66phHo3qa9CcCNpG9klOBEuBEMjiVbb/d8AXcxEzvQr9OCwNsikyxonyzLiY/lsNHeGm9cC5eRvlNLdUSVBipH+ajPd0lDHCayZPs1eCMfbm/xnf8e2lfy6z0UPOpHGfyX/0+hz99Ir5Xnx+0sBBzyZZJxKm4ROid5aDv/9m9guILpURae+Yw/IrkYF4uAKGX+/44cBvtTRQSdX76CAOBSiywZa6BAgDYBLRtkAPM+i+vwNzFBovqHUvI+4Ponaw==",
"data":{
"success_data":"success"
}
}
- Asynchronous user withdrawal result notification function, the merchant will be notified of the final success or failure of the withdrawal.
- Among them, if the withdrawal fails due to the merchant's reasons, the merchant will handle it, otherwise, the platform will handle it.
HTTP Request
POST: The specific callback URL is provided by the merchant to the platform side
request parameters
| parameter name | required | type | description |
|---|---|---|---|
| data | no | string | as follows |
| data.trade_id | yes | string | trade id |
| data.coin | yes | string | coin name |
| data.chain | yes | string | main chain coin name |
| data.txid | yes | string | txid |
| data.address | yes | string | withdrawal to address |
| data.from_address | 是 | string | withdrawal from address,product environment return this field only for merchant, who created after 2025-01-22 |
| data.time | yes | string | order last update time |
| data.amount | yes | string | withdrawal amount, the precision is 8 digits |
| data.fee | yes | string | handling fee, the precision is 8 digits |
| data.total | yes | string | total amount of withdrawal total=amount+fee, the precision is 8 digits |
| data.status | Yes | string | Withdrawal status: 1 success;5 waiting confirm(txid generated but not confirm yet); 10 review failed; 20 transfer failed; other error codes (refer to the description of error codes) |
| data.msg | yes | string | state description |
| data.type | yes | int | 1 on-site deposit 2 on-chain deposit |
| data.gas_fee | no | string | gas fee,product environment return this field only for merchant, who created after 2024-08-14, the precision is 8 digits |
| sign | yes | string | sign the data in data |
Response parameter description
| parameter | required | type | description |
|---|---|---|---|
| status | yes | int | status code |
| data | yes | jsonObject | returns the data object |
| data.success_data | yes | sring | success Received successfully |
| sign | yes | string | signature |
- For the situation and handling method of transfer failure
| Type | Content | Merchant Handling |
|---|---|---|
| Success | Status=1 corresponding to trade_id | Merchant can consider it to be successful |
| Change to 1 after success | Rollback due to chain failure, txid changes. The trade_id and status remain unchanged | The merchant side can consider it to be successful, just update the txid |
| Change to 2 after success | The platform broadcast fails, the platform handles | The merchant side can think it must be successful, just update the txid |
| Failure 1 | Because the merchant gave the wrong address, the btc address was given to eth | The platform does not deduct the money, which requires the merchant to re-request |
| Failure 2 | Due to insufficient user balance | The platform does not deduct money, which requires the merchant to re-request |
To put it simply: Merchant-side errors cause failures, and merchants re-request for processing. Platform-side errors are handled by the platform. Orders are absolutely unique for platform processing. txid is subject to change.
* Asynchronous notification time point
The platform side executes and finds a client error, or the platform side determines the success or changes after the success.
Exchange
Redemption application
$url = "http://api.xxxx.com/shopapi/exchange/index";
$header = [
'Content-Type:application/json',
];
$params = [
"version" => "1.0",
"app_id" => "hxgmau9imt86qky9",
"time" => 1578736053,
"user_id" => "28",
"source_coin" => "eth",
"target_coin" => "usdt",
"amount" => "0.011",
"trade_id" => "20200114202903274786",
"limit_price" => "5",
"type" => 1,
"max_time" => 5,
"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/exchange/index"
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==",
"user_id":"28",
"source_coin":"eth",
"target_coin":"usdt",
"amount":"0.011",
"trade_id":"20200114202903274786",
"limit_price":"5",
"type":"1",
"max_time":"5",
}
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==",
"user_id":"28",
"source_coin":"eth",
"target_coin":"usdt",
"amount":"0.011",
"trade_id":"20200114202903274786",
"limit_price":"5",
"type":"1",
"max_time":"5",
};
let POST_OPTIONS = {
port: 80,
host: "api.xxxx.com",
path: "/shopapi/exchange/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) {
// more detail functions, see "Signature Regulations"Java demo
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("user_id", "28");
params.put("source_coin", "eth");
params.put("target_coin", "usdt");
params.put("amount", "0.011");
params.put("trade_id", "20200114202903274786");
params.put("limit_price", "5");
params.put("type", "1");
params.put("max_time", "5");
try {
params.put("sign", signer.genSign(params, priKey));
Gson gson = new GsonBuilder().create();
System.out.println("params = " + gson.toJson(params));
String res = doPost(baseUrl + "/exchange/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");
}
Example of return result:
{
"status":200,
"msg":"Request succeeded",
"data":{
"trade_id":"2424sfshdrsfsf210"
},
"date_time":"2020-12-29 09:14:10",
"time_stamp":1609204450,
"sign":"folFicr8IuNfZVJe/RO3qbP4nCvmVrQS1+hq8MyK9eVE63KRVe8CNdKjlBzt89buN/weu9fLBtdRk1YgAEUB0ZBd8KcMuzvbuk0WZtW3YKjlPidoQWE9ooSU7HmUJ3larBK4iMGpkXcC+t4ucDy8vnc2s8sQWBBOxuXG22cx3LnXXm9KDXRWkV0T4DnaA65/G7UKPATvwNuQCilwLdyej94CAQnHRoVaSjm27i4EWvr2HcM8q38ceswFNwzQ/UYm54A7OidSwRIkDjs9dC0bFMfJvE8vgsUVX0UYDN9Vs276qC6XkbhBWr3B8HN65lJw7OhxqbnGG1QkNM1AGCso0Q=="
}
Merchant initiates redemption and requests this interface.
HTTP Request
POST: /exchange/index
request parameters
| parameter name | required | type | description |
|---|---|---|---|
| common parameter | Yes | JSON | common parameter refer to: signature (sign), version (version), merchant ID (app_id), time (time) |
| user_id | No | string | Merchant user id (required for merchants with risk control enabled) |
| source_coin | yes | string | exchange coin |
| target_coin | yes | string | exchange target coin |
| amount | yes | string | amount of currency exchanged |
| trade_id | Yes | string | Merchant-side transaction unique ID (up to 32 characters in length. Recommended format: year, month, day, hour, minute, second + 6-digit random number Case column: 20200311202903000001) |
| limit_price | no | string | limit price (if type=0, this field is required). The minimum exchange price when exchanging stable coins, or the maximum exchange price when exchanging virtual currency. |
| type | yes | int | exchange mode (1 closing mode / 0 general exchange), default 1. Generally, a pending order is placed under the condition that the minimum price is met. There may be some successes and some failures. If the exchange is not successful within a certain period of time, the order will be cancelled. The closing mode is that the order will be successfully placed, regardless of the impact of slippage, and will continue to try to place the order on the exchange regardless of the price. |
| max_time | no | int | unit second - maximum redemption time - the redemption will be stopped if the redemption will be completed (the general mode only takes effect) |
Response parameter description
| parameter name | type | description |
|---|---|---|
| status | int | status code |
| msg | string | state description |
| data | jsonObject | |
| data.trade_id | string | trade_id - given by the merchant |
| date_time | string | Beijing time |
| time_stamp | string | response time in seconds |
| sign | string | signature - the signature for all participating parameters above |
- The return of this interface is only successful, but it does not mean that the exchange is successful. The processing result is subject to the data returned by the notification interface.
Exchange account recharge
$url = "http://api.xxxx.com/shopapi/exchange/transfer";
$header = [
'Content-Type:application/json',
];
$params = [
"version" => "1.0",
"app_id" => "hxgmau9imt86qky9",
"time" => "1578736053",
"coin" => "usdt_erc20",
"exchange_coin" => "usdt",
"amount" => "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/exchange/transfer"
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" : "usdt_erc20",
"exchange_coin" : "usdt",
"amount":"10",
}
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":"usdt_erc20",
"exchange_coin":"usdt",
"amount":"10",
};
let POST_OPTIONS = {
port: 80,
host: "api.xxxx.com",
path: "/shopapi/exchange/transfer",
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) {
// more detail functions, see "Signature Regulations"Java demo
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", "usdt_erc20");
params.put("exchange_coin", "usdt");
params.put("amount", "10");
try {
params.put("sign", signer.genSign(params, priKey));
Gson gson = new GsonBuilder().create();
System.out.println("params = " + gson.toJson(params));
String res = doPost(baseUrl + "/exchange/transfer", 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": "2021-08-20 15:44:25",
"time_stamp": 1629445465,
"sign": "lRQQoEIc5B9ZwYoTCW3B58M+3GB17wUwTX+SmaOQ9iofK3Vs9RIb4TWzwtpOLZyGls2Ixe6s6MDSZZufjjqiqnSrgx1vqd5k3BkVLeHKJJmPWb8aXBT55qjlqifF7tRWCJJ8ToboBOWaJldWnvJgyQxwgdcGKUR/G2IVlIBddLdUkRlIf+hDqZAqboMU8b9k5tra3iIgIF0AMFrjYas4MeKxHDrnTZr9dJkKqJqWHOdn3cYkkxK9I27s+ZEOHVNhezS/tpwKm9pOJeNdIUPzumnUT7rkd2dSrimlokR85cC48qrqZehoz3lj6Rua4ravWmz0nr8mPLodnkKOerF3qA=="
}
HTTP Request
POST: /exchange/transfer
request parameters
| parameter name | required | type | description |
|---|---|---|---|
| common parameter | Yes | JSON | common parameter refer to: signature (sign), version (version), merchant ID (app_id), time (time) |
| coin | yes | string | hot wallet coin |
| exchange_coin | yes | string | exchange account coin |
| amount | yes | string | recharge amount |
Response parameter description
| parameter name | type | description |
|---|---|---|
| status | int | status code |
| msg | string | state description |
| data | jsonObject | |
| date_time | string | Beijing time |
| time_stamp | string | response time in seconds |
| sign | string | signature - the signature for all participating parameters above |
Exchange rate
$url = "http://api.xxxx.com/shopapi/rate/exchange";
$header = [
'Content-Type:application/json',
];
$params = [
"version" => "1.0",
"app_id" => "hxgmau9imt86qky9",
"time" => "1578736053",
"source_coin" => "eth",
"target_coin" => "usdt",
"amount" => "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/rate/exchange"
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==",
"source_coin":"eth",
"target_coin":"usdt",
"amount":"10",
}
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==",
"source_coin":"eth",
"target_coin":"usdt",
"amount":"10",
};
let POST_OPTIONS = {
port: 80,
host: "api.xxxx.com",
path: "/shopapi/rate/exchange",
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) {
// more detail functions, see "Signature Regulations"Java demo
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");
params.put("amount", "0.011");
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/exchange", 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");
}
Example of return result:
{
"status": 200,
"msg": "Request succeeded",
"data": {
"rate": "3233.688",
"max": "20",
"min": "15",
"source_unit": "4",
"base_coin": "usdt"
},
"date_time": "2021-08-20 15:44:25",
"time_stamp": 1629445465,
"sign": "lRQQoEIc5B9ZwYoTCW3B58M+3GB17wUwTX+SmaOQ9iofK3Vs9RIb4TWzwtpOLZyGls2Ixe6s6MDSZZufjjqiqnSrgx1vqd5k3BkVLeHKJJmPWb8aXBT55qjlqifF7tRWCJJ8ToboBOWaJldWnvJgyQxwgdcGKUR/G2IVlIBddLdUkRlIf+hDqZAqboMU8b9k5tra3iIgIF0AMFrjYas4MeKxHDrnTZr9dJkKqJqWHOdn3cYkkxK9I27s+ZEOHVNhezS/tpwKm9pOJeNdIUPzumnUT7rkd2dSrimlokR85cC48qrqZehoz3lj6Rua4ravWmz0nr8mPLodnkKOerF3qA=="
}
Before exchanging, check the exchange rate.
HTTP Request
POST: /rate/exchange
request parameters
| parameter name | required | type | description |
|---|---|---|---|
| common parameter | Yes | JSON | common parameter refer to: signature (sign), version (version), merchant ID (app_id), time (time) |
| source_coin | yes | string | exchange coin |
| target_coin | yes | string | exchange target coin |
| amount | yes | string | amount of currency exchanged |
Response parameter description
| parameter name | type | description |
|---|---|---|
| status | int | status code |
| msg | string | state description |
| data | jsonObject | |
| data.rate | string | The exchange rate of other currencies corresponding to usdt |
| data.max | string | The maximum number of coins that can be exchanged in a single transaction |
| data.min | string | The minimum supported single exchange quantity of the exchange currency |
| data.source_unit | int | Supports the length of the decimal places of the exchange currency (a value such as 4 means that up to 4 decimal places are supported) |
| data.base_coin | string | Base currency, the trading area supports the currency as the base currency for the transaction price |
| date_time | string | Beijing time |
| time_stamp | string | response time in seconds |
| sign | string | signature - the signature for all participating parameters above |
Batch query exchange rate
$url = "http://api.xxxx.com/shopapi/rate/exchange_batch";
$header = [
'Content-Type:application/json',
];
$params = [
"version" => "1.0",
"app_id" => "hxgmau9imt86qky9",
"time" => "1578736053",
"source_coin" => "eth",
"target_coin" => "usdt",
"amount" => "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/rate/exchange_batch"
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==",
"source_coin":"eth",
"target_coin":"usdt",
"amount":"10",
}
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==",
"source_coin":"eth",
"target_coin":"usdt",
"amount":"10",
};
let POST_OPTIONS = {
port: 80,
host: "api.xxxx.com",
path: "/shopapi/rate/exchange_batch",
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) {
// more detail functions, see "Signature Regulations"Java demo
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));
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/exchange_batch", 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");
}
Example of return result:
{
"status": 200,
"msg": "Request succeeded",
"data": [
{
"source_coin": "eth",
"target_coin": "usdt",
"rate": 3198.707676,
"max": 0,
"min": 0,
"source_unit": 4,
"base_coin": "usdt"
},
{
"source_coin": "usdt",
"target_coin": "eth",
"rate": 3231.075,
"max": 20,
"min": 15,
"source_unit": 4,
"base_coin": "usdt"
}
],
"date_time": "2021-08-20 15:47:52",
"time_stamp": 1629445672,
"sign": "Jjkpqtjw6oITCvxpIcEDC0EQfhKjDfWQKcnxRqDYOHqCB3oXl7GDHFEQ3g7JFc3g8tW2XQRaQldCnNXd1jw9gddZRUWimULPSiOrdaCYn5wxLBLGTf4bHX//P34ZBrNa45APCURqk26U68ZzQmnmcpzH8te1WOiey2WnCkSABVkBEeMwLjsM8pO3kmiWx5ZQ+hVQqHO6wONRsIToMisDKgr/4YzcxB3fAuY+7J5Ns3ZTrBTKPxg6Idy41sIi0sSjssXFD/mVBt6sIRaD/JknOwCdwCE5a8rVMWT7wPbQdaCDSgNMnjit14x1665a6tNG8S6IC+o/pn4dgVk9rCqVHA=="
}
HTTP Request
POST: /rate/exchange_batch
request parameters
| parameter name | required | type | description |
|---|---|---|---|
| common parameter | Yes | JSON | common parameter refer to: signature (sign), version (version), merchant ID (app_id), time (time) |
Response parameter description
| parameter name | type | description |
|---|---|---|
| status | int | status code |
| msg | string | state description |
| data | jsonObject | |
| data.rate | string | The exchange rate of other currencies corresponding to usdt |
| data.max | string | The maximum number of coins that can be exchanged in a single transaction |
| data.min | string | The minimum supported single exchange quantity of the exchange currency |
| data.source_unit | int | Supports the length of the decimal places of the exchange currency (a value such as 4 means that up to 4 decimal places are supported) |
| data.base_coin | string | Base currency, the trading area supports the currency as the base currency for the transaction price |
| data.source_coin | string | exchange coin |
| data.target_coin | string | target coin |
| date_time | string | Beijing time |
| time_stamp | string | response time in seconds |
| sign | string | signature - the signature for all participating parameters above |
Exchange balance query
$url = "http://api.xxxx.com/shopapi/balance/exchange";
$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/balance/exchange"
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 POST_OPTIONS = {
port: 80,
host: "api.xxxx.com",
path: "/shopapi/balance/exchange",
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) {
// more detail functions, see "Signature Regulations"Java demo
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/exchange", 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");
}
Example of return result:
{
"status": 200,
"msg": "Request succeeded",
"data": [{
"coin": "eth",
"amount": 0,
"freeze_amount": 0,
"total": 0
}],
"date_time": "2022-07-22 20:18:01",
"time_stamp": 1658492281,
"sign": "xqLyFst5Xv2mqargS2couk7anmeWMZ+1wVEBUYQHlnfJAHdmeXh3eev/bqK5CnfEHGN/A1q+z/vFmMdXfgmzY5S+3iGRz+qGLwqBOFjC4S7J6+fgHu/ciaQedR9jss4KmonxxYrGHoNgsXe/H3toDGe/z/EO956nhZW3K3g9bh/CzZJc/OfNKT0TfgXuOy+B3MvZ5oxZi2mygaXk2aWEjcrZoUEiZfJkx/AzLpolCTrqDt5+1l/U5pQpCptGaR6lOIjTmbd3ycUYRGOxuhoK4OzO3euQIEVxbaf5aRnJU9r48QU2lPUC0PGd3i4+hAHy9gg1S2pNVuWA9PGJvpFhpg=="
}
Exchange account balance query interface, returns the exchange account balance of a single currency
HTTP Request
POST: /balance/exchange
request parameters
| parameter name | required | type | description |
|---|---|---|---|
| common parameter | Yes | JSON | common parameter refer to: signature (sign), version (version), merchant ID (app_id), time (time) |
| coin | No | string | Coin name within 20 characters, which is provided by the coin platform. If the parameter is empty, all coins will be returned |
Response parameter description
| parameter name | type | description |
|---|---|---|
| status | int | status code |
| msg | string | state description |
| data | jsonObject | |
| data.amount | float | available balance |
| data.freeze_amount | float | Freeze balance |
| data.total | float | frozen + available balance |
| date_time | string | Beijing time |
| time_stamp | string | response time in seconds |
| sign | string | signature - the signature for all participating parameters above |
Exchange transaction pair query
$url = "http://api.xxxx.com/shopapi/exchange/coin";
$header = [
'Content-Type:application/json',
];
$params = [
"version"=> "1.0",
"app_id"=> "hxgmau9imt86qky9",
"time"=> "1578736053",
"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/exchange/coin"
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==",
}
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==",
};
let POST_OPTIONS = {
port: 80,
host: "api.xxxx.com",
path: "/shopapi/exchange/coin",
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) {
// more detail functions, see "Signature Regulations"Java demo
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));
try {
params.put("sign", signer.genSign(params, priKey));
Gson gson = new GsonBuilder().create();
System.out.println("params = " + gson.toJson(params));
String res = doPost(baseUrl + "/exchange/coin", 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");
}
Example of return result:
{
"status": 200,
"msg": "Processing successful",
"data": [
{
"source_coin": "eth",
"target_coin": "usdt",
"source_min_amount": "0",
"source_max_amount": "0",
"source_unit": "4",
"target_unit": "2"
},
{
"source_coin": "usdt_trc20",
"target_coin": "usdt",
"source_min_amount": "0",
"source_max_amount": "0",
"source_unit": "2",
"target_unit": "6"
}
],
"date_time": "2021-08-10 09:32:26",
"time_stamp": 1628559146,
"sign": "uqhR4gE6jZ1cK0pz3QoUjJIHMBwaK2dYTBVEgjhsq4bbk12rDLJ4VKq99BT510POmouF0o5ZsK2Y9/MlUdumb90rLam2PFwVqcwuBHEIJ7RTMwzcrF4G1z3oCQS4/sPkmOlX8pTK7StcNGzJfbqQB3Gr+4x1chxZR8MZSvXnkKtElco75K/4LyuoYbOUTtGSYgUgYsa5Yh8EnZeKfekR3yclet8WThtqJJ187RdXZMkMUWNU+27N3PbDf0bI8Vxiz26tFg2Y1FIUTJbmOnG2zTNuUUtdgu5H3USRsCMGHUq8YZeyFAZW54odZGrqc5njO2GkRdoyS7f1JGEXwMfdEA=="
}
Query supported exchange currencies
HTTP Request
POST: /exchange/coin
request parameters
| parameter name | required | type | description |
|---|---|---|---|
| common parameter | Yes | JSON | common parameter refer to: signature (sign), version (version), merchant ID (app_id), time (time) |
Response parameter description
| parameter name | type | description |
|---|---|---|
| status | int | status code |
| msg | string | state description |
| data | jsonObject | |
| data.source_coin | string | source currency |
| data.target_coin | string | target currency |
| data.source_min_amount | string | The minimum supported single exchange amount of the exchange currency |
| data.source_max_amount | string | The maximum supported single exchange amount of the exchange currency |
| data.source_unit | string | Supports the length of decimal places for exchange currency (a value such as 4 means that up to 4 decimal places are supported) |
| data.target_unit | string | Supports the length of the decimal places of the target currency (a value such as 4 means that up to 4 decimal places are supported) |
| date_time | string | Beijing time |
| time_stamp | string | response time in seconds |
| sign | string | signature - the signature for all participating parameters above |
Exchange list query
$url = "http://api.xxxx.com/shopapi/exchange/list";
$header = [
'Content-Type:application/json',
];
$params = [
"version" => "1.0",
"app_id" => "hxgmau9imt86qky9",
"time" => "1578736053",
"trade_id" => "",
"source_coin" => "eth",
"target_coin" => "usdt",
"start_time" => "1587004987",
"end_time" => "1599616679",
"status" => "1",
"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/exchange/list"
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==",
"trade_id":"",
"source_coin":"eth",
"target_coin":"usdt",
"start_time":"1587004987",
"end_time":"1599616679",
"status":"1",
"page":"1",
"page_size":"20",
}
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==",
"trade_id":"",
"source_coin":"eth",
"target_coin":"usdt",
"start_time":"1587004987",
"end_time":"1599616679",
"status":"1",
"page":"1",
"page_size":"20",
};
let POST_OPTIONS = {
port: 80,
host: "api.xxxx.com",
path: "/shopapi/exchange/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) {
// more detail functions, see "Signature Regulations"Java demo
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("trade_id","");
params.put("source_coin","eth");
params.put("target_coin","usdt");
params.put("start_time","1587004987");
params.put("end_time","1599616679");
params.put("status","1");
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 + "/exchange/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");
}
Example of return result:
{
"status": 200,
"msg": "Processing successful",
"data": {
"page": 1,
"max_page": 1,
"count": 4,
"list": [
{
"order_id": "20210811162504870081",
"trade_id": "2424sfshdrsfsf211wqe11",
"user_id": "1001",
"source_coin": "eth",
"target_coin": "usdt",
"source_amount": "0.1234",
"source_success_amount": "0",
"source_failed_amount": "0",
"target_amount": "0",
"limit_price": "3.4",
"type": "1",
"exchange_fee": "0",
"exchange_rate": "0",
"status": "2",
"time": "1629252807"
},
{
"order_id": "20210811162442276466",
"trade_id": "2424sfshdrsfsf211wqe1",
"user_id": "1002",
"source_coin": "eth",
"target_coin": "usdt",
"source_amount": "0.1234",
"source_success_amount": "0",
"source_failed_amount": "0",
"target_amount": "0",
"limit_price": "3.4",
"type": "1",
"exchange_fee": "0",
"exchange_rate": "0",
"status": "2",
"time": "1628670282"
}
]
},
"date_time": "2021-08-18 17:11:54",
"time_stamp": 1629277914,
"sign": "EC2LAtl7T3h0Q93nsqf3QzJAAUDrxqRYPpEsClzg9S+SGk77wCxEkQvNAJEK3IYHBvkTtyrlggbBaH7YA7q4dJeFsuwMVlvuVQ9yHuzEe3XVA8CLDVn98QDvmSjprBHUrQKG4FCvD3YiOlaZj46xXaGD2Dm/A3gvxclDfafUMzKOqXbb2yhOraz71+VzhqszKkZQyghx4Et55GA0ZqSIu1Ui81qjVLvu1t2J90kzq/ffE6rUCz4ZidA+9ybnxTU8T9swzdSpudHiuxMOa5kNaJD0daqVbz3Ez17r0c7w78U9Hj5WWicNSQ8j4VLyQ2BK6hIKqj79ibqM84mxec7Ltw=="
}
Exchange account balance query
Investigate and deal with exchange order status interface, support multi-dimensional query
HTTP Request
POST: /exchange/list
request parameters
| parameter name | required | type | description |
|---|---|---|---|
| common parameter | Yes | JSON | common parameter refer to: signature (sign), version (version), merchant ID (app_id), time (time) |
| trade_id | No | string | If the trade_id is passed as exact search, the following parameters will be invalid |
| source_coin | no | string | exchange coin |
| target_coin | no | string | exchange target coin |
| page | no | int | 1<= N <=Max, take Max if it exceeds Max, return 1 if it is less than 1 or if no parameter is passed |
| status | no | int | 0 pending review 1 successful exchange, 5 approved, 10 failed, 20 failed |
| start_time | no | int | start time (creation time) format: timestamp |
| end_time | no | int | end time (creation time) format: timestamp |
| page_size | no | int | number of pages per page (20 ~ 500), default 20 |
Response parameter description
| parameter name | type | description |
|---|---|---|
| status | int | status code |
| msg | string | state description |
| data | jsonObject | |
| data.page | int | page number |
| data.count | int | number of records on this page |
| data.list | jsonArray | specific record |
| data.list.trade_id | string | trade id |
| data.list.source_coin | string | exchange coin |
| data.list.target_coin | string | Exchange target coin |
| data.list.source_amount | string | Amount of currency exchanged |
| data.list.target_amount | string | The amount of target currency to exchange |
| data.list.limit_price | string | limit price |
| data.list.type | string | Exchange mode (0 general exchange / 1 closing mode) |
| data.list.exchange_fee | string | Exchange fee (unit: target currency) |
| data.list.status | string | Order status: 0 pending approval, 1 exchange completed, 2 pending, 5 approved, 10 approved, 20 failed transfer |
| data.list.time | string | Status time, finally fixed at the time when status=1 |
| data.list.order_id | string | order id |
| data.list.exchange_rate | string | Exchange rate (average transaction price) |
| data.list.source_success_amount | string | The actual exchange amount of the exchange currency (there are partial exchanges in the general exchange mode) |
| data.list.source_failed_amount | string | The amount of exchange failed to exchange currency (the system will automatically return it to the exchange account) |
| data.list.user_id | string | User ID |
| date_time | string | Beijing time |
| time_stamp | string | response time in seconds |
| sign | string | signature - the signature for all participating parameters above |
Redeem callback notification
$url = "The specific callback address is provided by the merchant to the platform";
$header = [
'Content-Type:application/json',
];
$params = [
"data" => [
"trade_id"=> "20200114202903274786",
"order_id"=> "2020010211153423123456",
"source_coin"=> "eth",
"target_coin"=> "eth",
"source_amount"=> "10",
"target_amount"=> "100",
"exchange_rate"=> "5",
"exchange_fee"=> "1",
"limit_price"=> "100",
"type"=> "0",
"status"=> "1",
"time"=> "1650011196",
"source_success_amount"=> 10,
"source_failed_amount"=> 100,
"user_id"=> 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 = "The specific callback address, provided by the merchant to the platform side"
data := map[string]interface{}{
"data": map[string]string{
"trade_id":"20200114202903274786",
"order_id":"2020010211153423123456",
"source_coin":"eth",
"target_coin":"eth",
"source_amount":"10",
"target_amount":"100",
"exchange_rate":"5",
"exchange_fee":"1",
"limit_price":"100",
"type":"0",
"status":"1",
"time":"1650011196",
"source_success_amount":"10",
"source_failed_amount":"100",
"user_id":"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 = {
"data": {
"trade_id":"20200114202903274786",
"order_id":"2020010211153423123456",
"source_coin":"eth",
"target_coin":"eth",
"source_amount":"10",
"target_amount":"100",
"exchange_rate":"5",
"exchange_fee":"1",
"limit_price":"100",
"type":"0",
"status":"1",
"time":"1650011196",
"source_success_amount":"10",
"source_failed_amount":"100",
"user_id":"1",
},
"sign": "OTA8utI8y8G93p7RPCyb4qIilFQ0B4Aq4iUjhaXWK9m2kgektqlHOASDKXT2VE7NPNysrGycYlVfjDR2WGZn1G66phHo3qa9CcCNpG9klOBEuBEMjiVbb/d8AXcxEzvQr9OCwNsikyxonyzLiY/lsNHeGm9cC5eRvlNLdUSVBipH+ajPd0lDHCayZPs1eCMfbm/xnf8e2lfy6z0UPOpHGfyX/0+hz99Ir5Xnx+0sBBzyZZJxKm4ROid5aDv/9m9guILpURae+Yw/IrkYF4uAKGX+/44cBvtTRQSdX76CAOBSiywZa6BAgDYBLRtkAPM+i+vwNzFBovqHUvI+4Ponaw==",
};
let POST_OPTIONS = {
port: 80,
host: "The specific callback address, provided by the merchant to the platform side",
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()
Example of return result:
{
"status":200,
"sign": "OTA8utI8y8G93p7RPCyb4qIilFQ0B4Aq4iUjhaXWK9m2kgektqlHOASDKXT2VE7NPNysrGycYlVfjDR2WGZn1G66phHo3qa9CcCNpG9klOBEuBEMjiVbb/d8AXcxEzvQr9OCwNsikyxonyzLiY/lsNHeGm9cC5eRvlNLdUSVBipH+ajPd0lDHCayZPs1eCMfbm/xnf8e2lfy6z0UPOpHGfyX/0+hz99Ir5Xnx+0sBBzyZZJxKm4ROid5aDv/9m9guILpURae+Yw/IrkYF4uAKGX+/44cBvtTRQSdX76CAOBSiywZa6BAgDYBLRtkAPM+i+vwNzFBovqHUvI+4Ponaw==",
"data":{
"success_data":"success"
}
}
Exchange result notification (success/failure), a platform initiates a request, and the merchant responds
- In this API, mechant and platform each need generate their own pair of rsa key
- When sending the request, Platform will use its own privater key to generate a sign, and the mechant will use the platform's public key to verify the sign.
- When mechant respond back to the request from the platform, mechant will use its private key to sign and platform will use merchant's public key to verify the sign
- Please refer back to the Signature Regulations section for the step
HTTP Request
POST: The specific callback address is provided by the merchant to the platform side
request parameters
| parameter name | required | type | description |
|---|---|---|---|
| data | no | string | callback notification carries data structure |
| data.trade_id | yes | string | Merchant trade order number |
| data.order_id | yes | string | platform redemption order number |
| data.source_coin | yes | string | exchange coin |
| data.target_coin | yes | string | exchange target coin |
| data.source_amount | yes | string | actual amount of currency exchanged |
| data.target_amount | yes | string | amount of target currency exchanged for |
| data.exchange_rate | yes | string | exchange rate (average transaction price) |
| data.exchange_fee | yes | string | exchange fee (unit: target currency) |
| data.limit_price | yes | string | limit price |
| data.type | yes | string | exchange mode (0 general exchange / 1 closing mode) |
| data.status | Yes | string | Order status: 0 pending, 1 exchange completed, 2 pending, 5 approved, 10 approved, 20 failed transfer |
| data.time | yes | int | time of occurrence (timestamp) |
| data.source_success_amount | Yes | string | The actual exchange amount of the exchange currency (there are partial exchanges in the general exchange mode) |
| data.source_failed_amount | Yes | string | The amount of exchange failed to exchange currency (the system will automatically return it to the exchange account) |
| data.user_id | yes | string | user id |
| sign | yes | string | sign the data in data |
Response parameter description
| parameter name | required | type | description |
|---|---|---|---|
| status | yes | int | status code |
| data | yes | jsonObject | returns the data object |
| data.success_data | yes | sring | success Received successfully |
| sign | yes | string | signature |
Statistics
Merchant financial settlement ledger
$url = "http://api.xxxx.com/shopapi/balance/generalAccount";
$header = [
'Content-Type:application/json',
];
$params = [
"app_id"=> "hxgmau9imt86qky9",
"version"=> "1.0",
"time"=> 1578997143,
"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/balance/generalAccount"
data := map[string]string{
"app_id":"hxgmau9imt86qky9",
"version":"1.0",
"time":"1578997143",
"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":"1578997143",
"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/balance/generalAccount",
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) {
// more detail functions, see "Signature Regulations"Java demo
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));
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/generalAccount", 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");
}
Example of return result:
{
"status":200,
"msg":"Request successful",
"data":[
{
"coin" :"eth",
"receive_amount":"2.202508",
"send_amount":0,
"hot_address_amount":"28.49831843",
"settlement_amount":"2.15252525",
"wait_settlement_amount":"0.04998275",
},
{
"coin" :"trx",
"receive_amount":0,
"send_amount":0,
"hot_address_amount":0,
"settlement_amount":0,
"wait_settlement_amount":0,
},
"usdt_erc20":
{
"coin" :"trx",
"receive_amount":"23092870.028105",
"send_amount":"1242995.611177",
"hot_address_amount":"357014.388823",
"settlement_amount":"23033124.2080808",
"wait_settlement_amount":"59745.8200242",
}
],
"date_time":"2020-09-07 11:12:49",
"time_stamp":1599448369,
"sign":"Ddhz62FBeMzsxD9ARVwOmMXIgBRHWksbESZ2SFbKymcU94ZP0HIq4UkjaIw/HcU+LFiTLuTIxogsvAhCDVQAA1JPP78eiQCty98Q2HrN/uei5J3lvQFrBxk+/8ys/J9c7tKAU5ltDUBTAMshcSrcMivfGFXFBxwNOHbIFt6WXxDyq9R32EtgzNNLTCsLx9jU76+0aFthgxcy/At6/I5OLRcCya32GsqIi7YK7UOK5wSC64rCnroZFN7OWNkAlVgk9Fo0tyLjTO8ga+SX8BHgWBci2Ue1S4u8ctspWulsP7BLEhQDSKCe0pFDHc3//vWyeOEuLZxM/xDCE0BXmvjzNkqiog=="
}
- Query: Merchant's total deposit, total withdrawal, total settlement, etc.
HTTP Request
POST: /balance/generalAccount
request parameters
| parameter name | required | type | description |
|---|---|---|---|
| common parameter | yes | string | common parameter refers to: signature (sign), version (version), merchant ID (app_id), time (time) |
Response parameter description
| parameter name | type | description |
|---|---|---|
| status | int | status code |
| msg | string | state description |
| data | jsonObject | For details, see "data details" below. |
| data.coin | string | coin name |
| data.receive_amount | string | The total amount of deposits on the chain |
| data.send_amount | string | The total amount of on-chain withdrawals |
| data.hot_address_amount | string | Hot wallet balance |
| data.settlement_amount | string | Amount settled to merchant |
| data.wait_settlement_amount | string | Amount to be settle to the merchant |
| date_time | string | response time |
| time_stamp | int | unix timestamp in second |
| sign | string | signature |
Merchant deposit/withdrawal successful number
$url = "http://api.xxxx.com/shopapi/statistics/transfer";
$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/statistics/transfer"
data := map[string]string{
"version": "1.0",
"app_id": "hxgmau9imt86qky9",
"time": "1578736053",
"coin": "eth",
"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": "1578736053",
"coin": "eth",
"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/statistics/transfer",
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) {
// more detail functions, see "Signature Regulations"Java demo
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 + "/statistics/transfer", 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");
}
Example of return result:
{
"status": 200,
"msg": "Processing successful",
"data": {
"success_send_count": 60,
"success_receive_count": 57
},
"date_time": "2020-06-02 16:52:05",
"time_stamp": 1591087925,
"sign": "tZI1x6RqVW4llNpqMIPe1avItAOWHSqUAdeUrK/8Jpswlq5XyFlOXypDlx/d/ctVkIly8n5qw/po/AUQhEpKCM+rs6pDjk7xRoT1i1dpU01cAvc32D/2Z+olmPeo7iikIDeUlZKxHWtu9V9/xxjEtlEyZXNpJmlCTVttPmYjr1D0WbfL0gXKPK0Qkm8rQlih3mv0BsiTzea7RFOiFP5bWG8FYj0QjL8WqglUgm0AS8812HTmvwlQTkJWO9PS7lsa+Q0nBny5JZ1Rv/rJ4RhhRPXcskgUWqDB26wljHYEppoGJh1XOx/pTVeDIJA0iZohGBmHruYG79m+nCLxF5B5KA=="
}
- Query the number of successfully processed deposits/withdrawals
HTTP Request
POST: /statistics/transfer
request parameters
| parameter name | required | type | description |
|---|---|---|---|
| common parameter | yes | string | common parameter refers to: signature (sign), version (version), merchant ID (app_id), time (time) |
| coin | no | string |
Response parameter description
| parameter name | type | description |
|---|---|---|
| status | int | status code |
| msg | string | state description |
| data | jsonObject | For details, see "data details" below. |
| data.success_send_count | int | number of successful withdrawals |
| data.success_receive_count | int | number of successful deposits |
| date_time | string | response time |
| time_stamp | int | unix timestamp in second |
| sign | string | signature |
Risk control callback
The second review of the withdrawal order
$url = "http://*****/withdrawal/order/check";
$header = [
'Content-Type:application/json',
];
$params = [
"data" => [
"amount" => 2.00000000,
"coin_symbol" => "USDT_TRC20",
"address" => "TLhdZuFU1fDPnzxPoXfJ6WZZMpKzY15DUi",
"user_id" => "1",
"order_id" => "1394934189494173697",
"timestamp" => 1621493658
],
"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://*****/withdrawal/order/check"
data := map[string]interface{}{
"data": map[string]string{
"amount":"2.00000000",
"coin_symbol":"USDT_TRC20",
"address":"TLhdZuFU1fDPnzxPoXfJ6WZZMpKzY15DUi",
"user_id":"1",
"order_id":"1394934189494173697",
"timestamp":"1621493658",
},
"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 = {
"data": {
"amount":"2.00000000",
"coin_symbol":"USDT_TRC20",
"address":"TLhdZuFU1fDPnzxPoXfJ6WZZMpKzY15DUi",
"user_id":"1",
"order_id":"1394934189494173697",
"timestamp":"1621493658",
},
"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: "/withdrawal/order/check",
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("amount", "2.00000000");
data.put("coin_symbol", "USDT_TRC20");
data.put("address", "TLhdZuFU1fDPnzxPoXfJ6WZZMpKzY15DUi");
data.put("user_id", "1");
data.put("order_id", "1394934189494173697");
data.put("timestamp", "1621493658");
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/withdrawal/order/check", gson.toJson(params));
// if (null == res) {
// throw new RuntimeException("http error");
// }
// mock response from shop callback API
{
res = """
{
"status":200,
"data":{
"status_code": 200,
"timestamp":1620617260,
"order_id":"202105101123221335892766889804"
},
"sign":"YbRyMoUmsCxLbWopD2JD5EZqkT+pIRARsdTSFo+WyhebOMP/TZ96zV/vy4CYn+9gk6nJ55acFnqSO78N4/uemiOyBgE+a8SaIjutc+kFCWGaCorboy9alFBFUbYPvHvFFKHNFJx19Z2cyv9uceGdOdz09g0OBgp8bTyfkCUNrhbUmut2M2S2ixSH3wSefqUq2SUpohb5hlD6tOsyO3JfZr7M/16aiRGcEye2XglsOMFTO5XRkj4hwHKB+nHacttvuZKnGH67ELyoajCc+ef1DkmzmO3P7vFLIuVtVXQ2FPlXVkzCR/+VesyDOpYogHwqyR1BzCCSzxpbZ/aFc/uANg=="
}
""";
}
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");
}
Example of return result:
{
"status":200,
"data":{
"status_code": 200,
"timestamp":1620617260,
"order_id":"202105101123221335892766889804"
},
"sign":"YbRyMoUmsCxLbWopD2JD5EZqkT+pIRARsdTSFo+WyhebOMP/TZ96zV/vy4CYn+9gk6nJ55acFnqSO78N4/uemiOyBgE+a8SaIjutc+kFCWGaCorboy9alFBFUbYPvHvFFKHNFJx19Z2cyv9uceGdOdz09g0OBgp8bTyfkCUNrhbUmut2M2S2ixSH3wSefqUq2SUpohb5hlD6tOsyO3JfZr7M/16aiRGcEye2XglsOMFTO5XRkj4hwHKB+nHacttvuZKnGH67ELyoajCc+ef1DkmzmO3P7vFLIuVtVXQ2FPlXVkzCR/+VesyDOpYogHwqyR1BzCCSzxpbZ/aFc/uANg=="
}
- 2nd risk control review for merchant withdrawal order API
- Note: The platform assigns a separate risk control public key to the merchant (different from the deposit/withdrawal public key)
HTTP Request
POST The specific callback URL is provided by the merchant to the platform side
request parameters
| parameter name | required | type | description |
|---|---|---|---|
| data | no | string | as follows |
| data.order_id | Yes | string | The unique ID of the merchant transaction (trade_id when withdrawing) |
| data.user_id | yes | string | user the order belongs to |
| data.coin_symbol | yes | string | lowercase coin name, subject to the coin provided by the platform |
| data.address | yes | string | withdrawal address |
| data.amount | yes | decimal(20,8) | withdrawal amount |
| data.timestamp | yes | int | current timestamp in second |
| sign | yes | string | signature, only the parameters in data are signed |
Response parameter description
| parameter name | type | description |
|---|---|---|
| status | int | 200 passed, 2001 awaiting review, 5400 failed signature verification, 5401 time is less than 30s, 5402 order number does not exist, 5001 platform order_id is different, 5002 amount is wrong, 5003 user uid is wrong, 5004 address is wrong, 5005 currency The symbol is wrong, 5006 order rejection, 5007 other, the description information can be expanded by yourself |
| data | jsonObject | |
| data.timestamp | int | current timestamp in second |
| data.status_code | int | order status, same as status value, after 2021-12-10, this parameter is required |
| data.order_id | String | Order Id |
| sign | string | signature - the signature of the content of the data field in the response parameter |
- status=200; the order passed directly
- status in (2001,5400); the order will put into the retry queue. Please return status code of 2001 if the exception happen otherwise the respond wll be categories as rejected order.
- status=other; the order is directly rejected
2nd review for exchange order
$url = "http://*****/exchange/order/check";
$header = [
'Content-Type:application/json',
];
$params = [
"data" => [
"amount" => "2.00000000",
"source_coin" => "eth",
"target_coin" => "usdt_erc20",
"user_id" => "1",
"trade_id" => "1394934189494173697",
"time" => 1621493658
],
"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://*****/exchange/order/check"
data := map[string]interface{}{
"data": map[string]string{
"amount":"2.00000000",
"source_coin":"eth",
"target_coin":"usdt_erc20",
"user_id":"1",
"trade_id":"1394934189494173697",
"time":"1621493658",
},
"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 = {
"data": {
"amount":"2.00000000",
"source_coin":"eth",
"target_coin":"usdt_erc20",
"user_id":"1",
"trade_id":"1394934189494173697",
"time":"1621493658",
},
"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: "/exchange/order/check",
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("amount", "2.00000000");
data.put("source_coin", "eth");
data.put("target_coin", "usdt_erc20");
data.put("user_id", "1");
data.put("trade_id", "1394934189494173697");
data.put("time", "1621493658");
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/exchange/order/check", gson.toJson(params));
// if (null == res) {
// throw new RuntimeException("http error");
// }
// mock response from shop callback API
{
res = """
{
"status":200,
"data":{
"time":1620617260,
"trade_id":"202105101123221335892766889804"
},
"sign":"YbRyMoUmsCxLbWopD2JD5EZqkT+pIRARsdTSFo+WyhebOMP/TZ96zV/vy4CYn+9gk6nJ55acFnqSO78N4/uemiOyBgE+a8SaIjutc+kFCWGaCorboy9alFBFUbYPvHvFFKHNFJx19Z2cyv9uceGdOdz09g0OBgp8bTyfkCUNrhbUmut2M2S2ixSH3wSefqUq2SUpohb5hlD6tOsyO3JfZr7M/16aiRGcEye2XglsOMFTO5XRkj4hwHKB+nHacttvuZKnGH67ELyoajCc+ef1DkmzmO3P7vFLIuVtVXQ2FPlXVkzCR/+VesyDOpYogHwqyR1BzCCSzxpbZ/aFc/uANg=="
}
""";
}
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");
}
Example of return result:
{
"status":200,
"data":{
"time":1620617260,
"trade_id":"202105101123221335892766889804"
},
"sign":"YbRyMoUmsCxLbWopD2JD5EZqkT+pIRARsdTSFo+WyhebOMP/TZ96zV/vy4CYn+9gk6nJ55acFnqSO78N4/uemiOyBgE+a8SaIjutc+kFCWGaCorboy9alFBFUbYPvHvFFKHNFJx19Z2cyv9uceGdOdz09g0OBgp8bTyfkCUNrhbUmut2M2S2ixSH3wSefqUq2SUpohb5hlD6tOsyO3JfZr7M/16aiRGcEye2XglsOMFTO5XRkj4hwHKB+nHacttvuZKnGH67ELyoajCc+ef1DkmzmO3P7vFLIuVtVXQ2FPlXVkzCR/+VesyDOpYogHwqyR1BzCCSzxpbZ/aFc/uANg=="
}
- 2nd risk control review for merchant withdrawal order API
- Note: The platform assigns a separate risk control public key to the merchant (different from the deposit/withdrawal public key)
- In this API, mechant and platform each need generate their own pair of rsa key
- When sending the request, Platform will use its own privater key to generate a sign, and the mechant will use the platform's public key to verify the sign.
- When mechant respond back to the request from the platform, mechant will use its private key to sign and platform will use merchant's public key to verify the sign
- Please refer back to the Signature Regulations section for the step
HTTP Request
POST The specific callback URL is provided by the merchant to the platform side
request parameters
| parameter name | required | type | description |
|---|---|---|---|
| data | no | string | as follows |
| data.trade_id | yes | string | Merchant-side transaction unique ID |
| data.user_id | yes | string | the user the order belongs to |
| data.source_coin | Yes | string | The source coin must be in lowercase, the coin provided by the platform shall prevail |
| data.target_coin | yes | string | target coin namemust be in lowercase, the coin provided by the platform shall prevail |
| data.amount | yes | decimal(20,8) | exchange amount |
| data.time | yes | int | current timestamp in second |
| sign | yes | string | sign the data in data |
Response parameter description
| parameter name | type | description |
|---|---|---|
| status | int | 200 passed, 2001 pending review, 5400 failed signature verification, 5401 time less than 30s, 5402 order number does not exist, 5001 platform order_id is different, 5002 amount is wrong, 5003 user uid is wrong, 5004 address is wrong, 5005 currency The symbol is wrong, 5006 order rejection, 5007 other, the description information can be expanded by yourself |
| msg | string | state description |
| data | jsonObject | |
| data.time | int | current time |
| data.trade_id | String | Order Id |
| sign | string | signature - the signature of the content of the data field in the response parameter |
- status=200; the order passed directly
- status in (2001,5400); the order will put into the retry queue. Please return status code of 2001 if the exception happen otherwise the respond wll be categories as rejected order.
- status=other; the order is directly rejected
Mpc order review API
$url = "http://*****/mpc/order/check";
$header = [
'Content-Type:application/json',
];
$params = [
"data" => [
"amount" => 2.00000000,
"coin_symbol" => "USDT_TRC20",
"address" => "TLhdZuFU1fDPnzxPoXfJ6WZZMpKzY15DUi",
"user_id" => "1",
"order_id" => "1394934189494173697",
"timestamp" => 1621493658
],
"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://*****/mpc/order/check"
data := map[string]interface{}{
"data": map[string]string{
"amount":"2.00000000",
"coin_symbol":"USDT_TRC20",
"address":"TLhdZuFU1fDPnzxPoXfJ6WZZMpKzY15DUi",
"user_id":"1",
"order_id":"1394934189494173697",
"timestamp":"1621493658",
},
"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 = {
"data": {
"amount":"2.00000000",
"coin_symbol":"USDT_TRC20",
"address":"TLhdZuFU1fDPnzxPoXfJ6WZZMpKzY15DUi",
"user_id":"1",
"order_id":"1394934189494173697",
"timestamp":"1621493658",
},
"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: "/mpc/order/check",
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("amount", "2.00000000");
data.put("coin_symbol", "USDT_TRC20");
data.put("address", "TLhdZuFU1fDPnzxPoXfJ6WZZMpKzY15DUi");
data.put("user_id", "1");
data.put("order_id", "1394934189494173697");
data.put("timestamp", "1621493658");
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/mpc/order/check", gson.toJson(params));
// if (null == res) {
// throw new RuntimeException("http error");
// }
// mock response from shop callback API
{
res = """
{
"status":200,
"data":{
"time":1620617260,
"trade_id":"202105101123221335892766889804"
},
"sign":"YbRyMoUmsCxLbWopD2JD5EZqkT+pIRARsdTSFo+WyhebOMP/TZ96zV/vy4CYn+9gk6nJ55acFnqSO78N4/uemiOyBgE+a8SaIjutc+kFCWGaCorboy9alFBFUbYPvHvFFKHNFJx19Z2cyv9uceGdOdz09g0OBgp8bTyfkCUNrhbUmut2M2S2ixSH3wSefqUq2SUpohb5hlD6tOsyO3JfZr7M/16aiRGcEye2XglsOMFTO5XRkj4hwHKB+nHacttvuZKnGH67ELyoajCc+ef1DkmzmO3P7vFLIuVtVXQ2FPlXVkzCR/+VesyDOpYogHwqyR1BzCCSzxpbZ/aFc/uANg=="
}
""";
}
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");
}
Example of return result:
{
"status":200,
"data":{
"is_valid": 1,
"timestamp":1620617260,
"order_id":"1394934189494173697"
},
"sign":"YbRyMoUmsCxLbWopD2JD5EZqkT+pIRARsdTSFo+WyhebOMP/TZ96zV/vy4CYn+9gk6nJ55acFnqSO78N4/uemiOyBgE+a8SaIjutc+kFCWGaCorboy9alFBFUbYPvHvFFKHNFJx19Z2cyv9uceGdOdz09g0OBgp8bTyfkCUNrhbUmut2M2S2ixSH3wSefqUq2SUpohb5hlD6tOsyO3JfZr7M/16aiRGcEye2XglsOMFTO5XRkj4hwHKB+nHacttvuZKnGH67ELyoajCc+ef1DkmzmO3P7vFLIuVtVXQ2FPlXVkzCR/+VesyDOpYogHwqyR1BzCCSzxpbZ/aFc/uANg=="
}
- This is use for merchant to review the MPC withdrawal
- Note: The platform assigns a separate mpc public key to the merchant (different from the deposit/withdrawal/risk control public key)
- In this API, mechant and platform each need generate their own pair of rsa key
- When sending the request, Platform will use its own privater key to generate a sign, and the mechant will use the platform's public key to verify the sign.
- When mechant respond back to the request from the platform, mechant will use its private key to sign and platform will use merchant's public key to verify the sign
- Please refer back to the Signature Regulations section for the step
HTTP Request
POST The specific callback URL is provided by the merchant to the platform side
request parameters
| parameter name | required | type | description |
|---|---|---|---|
| data | no | string | as follows |
| data.order_id | Yes | string | The unique ID of the merchant transaction (trade_id when withdrawing) |
| data.user_id | yes | string | user the order belongs to |
| data.coin_symbol | yes | string | lowercase coin name, subject to the coin provided by the platform |
| data.address | yes | string | withdrawal address |
| data.amount | yes | decimal(20,8) | withdrawal amount |
| data.timestamp | yes | int | current timestamp in second |
| sign | yes | string | sign the data in data |
Response parameter description
| parameter name | type | description |
|---|---|---|
| status | int | 200 passed, 2001 pending review, 5400 failed signature verification, 5401 time less than 30s, 5402 order number does not exist, 5001 platform order_id is different, 5002 amount is wrong, 5003 user uid is wrong, 5004 address is wrong, 5005 currency The symbol is wrong, 5006 order rejection, 5007 other, the description information can be expanded by yourself |
| msg | string | state description |
| data | jsonObject | |
| data.is_valid | int | 1 pass; 2 fail |
| data.order_id | string | order number |
| data.timestamp | int | current time |
| sign | string | signature - the signature of the content of the data field in the response parameter |
H5 Deposit
Create Order
$url = "/h5_order/create";
$header = [
'Content-Type:application/json',
];
$params = [
"version": "1.0",
"app_id": "hxgmamt86qk",
"time": "1663741239",
"sign": "nR+UEj2oCup5bhcxrQlJ24+jeq3AMHdnC5BfOxaqCKwE6EcPc1020ogHHcZ0sLeqAg==",
"amount": "0.0013",
"currency": "usd",
"merchant_order_id" :"8MrxIV1lJd",
"return_url" :"http://xxxx.com",
"lang" :"en"
];
$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 = "/h5_order/create"
data := map[string]string{
"version": "1.0",
"app_id": "hxgmamt86qk",
"time": "1663741239",
"sign": "nR+UEj2oCup5bhcxrQlJ24+jeq3AMHdnC5BfOxaqCKwE6EcPc1020ogHHcZ0sLeqAg==",
"amount": "0.0013",
"currency": "usd",
"merchant_order_id" :"8MrxIV1lJd",
"return_url" :"http://xxxx.com",
"lang" :"en",
}
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": "hxgmamt86qk",
"time": "1663741239",
"sign": "nR+UEj2oCup5bhcxrQlJ24+jeq3AMHdnC5BfOxaqCKwE6EcPc1020ogHHcZ0sLeqAg==",
"amount": "0.0013",
"currency": "usd",
"merchant_order_id" :"8MrxIV1lJd",
"return_url" :"http://xxxx.com",
"lang" :"en",
};
let POST_OPTIONS = {
port: 80,
host: "api.xxxx.com",
path: "/shopapi/h5_order/create",
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) {
// more detail functions, see "Signature Regulations"Java demo
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("amount","0.0013");
params.put("currency","usd");
params.put("merchant_order_id","8MrxIV1lJd");
params.put("return_url","http://xxxx.com");
params.put("lang","en");
try {
params.put("sign", signer.genSign(params, priKey));
Gson gson = new GsonBuilder().create();
System.out.println("params = " + gson.toJson(params));
String res = doPost(baseUrl + "/h5_order/create", 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");
}
Example of return result:
{
"status":200,
"msg":"success",
"data":{
"order_no":"BCTOTNI57P",
"merchant_order_id":"8MrxIV1lJd",
"amount":"0.0013",
"currency":"usd",
"status":0,
"created_at":1665659047,
"expires_at":1665660847,
"addresses":[
{
"coin":"usdt_erc20",
"address":"0x1708F6b16D5437730D410D983B8D0235c345433c",
"amount":"0.0013"
},
{
"coin":"usdt_trc20",
"address":"TKzqd9hTDgeeQcHf1RXiCuG6vPPFJK8BDP",
"amount":"0.0013"
}
],
"return_url":"https://xxx.com/pay",
"checkout_url":"http://api.xxxx.com/order/BCTOTNI57P?lang=en"
},
"date_time":"2022-10-13 19:04:07",
"time_stamp":1665659047,
"sign":"C4XPA9jK32xYngKAEsb1KEQDyOFBD29H1MqfQNSl4jnxvT2RQHdiUtf2TMX96O2Pv0AGHv3EJU89l6k1hHa5arQ6LQUIbD8c/WbpXvhaoWYbhnrPhrVXcHMFlP714W6hmURWXkauySq5VzB8iS+Bb2HAv"
}
HTTP Request
POST : /h5_order/create
request parameters
| parameter name | required | type | description |
|---|---|---|---|
| common parameter | yes | string | common parameter refers to: signature (sign), version (version), merchant ID (app_id), time (time) |
| merchant_order_id | yes | string | merchant trade order number |
| amount | yes | string | order amount |
| currency | no | string | fiat currency, defaultusd |
| return_url | no | string | page jump return address |
| lang | no | string | language “en”, “ko”, “zh” |
Response parameter description
| parameter name | type | description |
|---|---|---|
| status | int | status code |
| msg | string | state description |
| data | jsonObject | |
| data.order_no | string | platform order number |
| data.merchant_order_id | string | merchant trade order number |
| data.amount | string | order amount |
| data.currency | string | fiat currency |
| data.status | int | 0 pending payment 1 completed 2 abnormal payment 10 cancelled |
| data.return_url | string | page jump return address |
| data.checkout_url | string | cashier address |
| data.expires_time | int | order expiration time |
| data.create_time | int | creation time |
| data.addresses | jsonArray | address information |
| data.addresses.coin | string | coin name |
| data.addresses.address | string | address |
| data.addresses.amount | string | amount payable in currency |
| date_time | string | Beijing time |
| time_stamp | int | response time in seconds |
| sign | string | signature - the signature for all participating parameters above |
Cancel Order
$url = "/h5_order/cancel";
$header = [
'Content-Type:application/json',
];
$params = [
"version": "1.0",
"app_id": "hxgmamt86qk",
"time": "1663741239",
"sign": "nR+UEj2oCup5bhcxrQlJ24+jeq3AMHdnC5BfOxaqCKwE6EcPc1020ogHHcZ0sLeqAg==",
"order_no": "test123",
];
$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 = "/h5_order/cancel"
data := map[string]string{
"version": "1.0",
"app_id": "hxgmamt86qk",
"time": "1663741239",
"sign": "nR+UEj2oCup5bhcxrQlJ24+jeq3AMHdnC5BfOxaqCKwE6EcPc1020ogHHcZ0sLeqAg==",
"order_no": "test123",
}
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": "hxgmamt86qk",
"time": "1663741239",
"sign": "nR+UEj2oCup5bhcxrQlJ24+jeq3AMHdnC5BfOxaqCKwE6EcPc1020ogHHcZ0sLeqAg==",
"order_no": "test123",
};
let POST_OPTIONS = {
port: 80,
host: "api.xxxx.com",
path: "/shopapi/h5_order/cancel",
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) {
// more detail functions, see "Signature Regulations"Java demo
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("order_no","test123");
try {
params.put("sign", signer.genSign(params, priKey));
Gson gson = new GsonBuilder().create();
System.out.println("params = " + gson.toJson(params));
String res = doPost(baseUrl + "/h5_order/cancel", 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");
}
Example of return result:
{
"status": 200,
"msg": "success",
"data": [],
"date_time": "2020-11-23 16:51:51",
"time_stamp": 1606121511,
"sign": "OotOCtyUPfYQFjE+FEPMQQK5PQ2eGJtcvwNBCI0ilTpNn/B9gBtzR+ibmyK00kW/bg=="
}
HTTP Request
POST : /h5_order/cancel
request parameters
| parameter name | required | type | description |
|---|---|---|---|
| common parameter | yes | string | common parameter refer to: signature (sign), version (version), merchant ID (app_id), time (time) |
| order_no | yes | string | platform order number |
Response parameter description
| Parameter name | Type | Description |
|---|---|---|
| status | int | status code |
| msg | string | status description |
| data | jsonObject | empty |
| date_time | string | Beijing time |
| time_stamp | int | response time in seconds |
| sign | string | signature - the signature for all participating parameters above |
Order Details
$url = "/h5_order/detail";
$header = [
'Content-Type:application/json',
];
$params = [
"version": "1.0",
"app_id": "hxgmamt86qk",
"time": "1663741239",
"sign": "nR+UEj2oCup5bhcxrQlJ24+jeq3AMHdnC5BfOxaqCKwE6EcPc1020ogHHcZ0sLeqAg==",
"order_no": "JDYFJEEA7T",
];
$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 = "/h5_order/detail"
data := map[string]string{
"version": "1.0",
"app_id": "hxgmamt86qk",
"time": "1663741239",
"sign": "nR+UEj2oCup5bhcxrQlJ24+jeq3AMHdnC5BfOxaqCKwE6EcPc1020ogHHcZ0sLeqAg==",
"order_no": "JDYFJEEA7T",
}
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": "hxgmamt86qk",
"time": "1663741239",
"sign": "nR+UEj2oCup5bhcxrQlJ24+jeq3AMHdnC5BfOxaqCKwE6EcPc1020ogHHcZ0sLeqAg==",
"order_no": "JDYFJEEA7T",
};
let POST_OPTIONS = {
port: 80,
host: "api.xxxx.com",
path: "/shopapi/h5_order/detail",
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) {
// more detail functions, see "Signature Regulations"Java demo
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("order_no","JDYFJEEA7T");
try {
params.put("sign", signer.genSign(params, priKey));
Gson gson = new GsonBuilder().create();
System.out.println("params = " + gson.toJson(params));
String res = doPost(baseUrl + "/h5_order/detail", 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");
}
Example of return result:
{
"status":200,
"msg":"success",
"data":{
"order_no":"JDYFJEEA7T",
"merchant_order_id":"8MrxIV1lJd",
"amount":"0.0013",
"currency":"usd",
"status":1,
"created_at":1664360232,
"expires_at":1664362032,
"addresses":[
{
"coin":"usdt_erc20",
"address":"0x1708F6b16D5437730D410D983B8D0235c345433c",
"amount":"0.0013"
},
{
"coin":"usdt_trc20",
"address":"TKzqd9hTDgeeQcHf1RXiCuG6vPPFJK8BDP",
"amount":"0.0013"
}
],
"payments":[
{
"coin":"usdt_trc20",
"address":"TKzqd9hTDgeeQcHf1RXiCuG6vPPFJK8BDP",
"txid":"422a7eef6af75960efa3e204fee1e642caf0b7d25dccd2678d6ae4e086733096",
"amount":"0.0013",
"confirm_time":1664360357,
"status":1,
"check_status":0
}
],
"return_url":"https://xxx.com/pay"
},
"date_time":"2022-10-13 19:24:26",
"time_stamp":1665660266,
"sign":"ERROp+Kr46ZjjGlIVcNXT0iEpvh8KCyfJNGax3gA5qdfa4Gw+k8qdKoJl+FYBHQsarlsaush8b5uhjFbbJQc7BxvEi+CvbAVm1CkqBITPZHNNr4B3dDBWkn3Fk0m+OLGvW+JB7ueDKy+rzwaFsHw46CIcFBRAdasfieQRqu9TuO+Y4IpFaROxDoicXQLMN28PReVLxAqwAxkZW16ujnviSOHlHlbO+CIxCrKRqZISnUKY8q9Ej649BtE1s0mFwCd9HJ0Ti5oawHAGvwhcw++aEh2cCKMNJ1ICZVqcqf5B6Xt+K2a/M7ifqHORRKjO4GkEWyPVLY27aA/v9329tAeFw=="
}
HTTP Request
POST : /h5_order/detail
request parameters
| parameter name | required | type | description |
|---|---|---|---|
| common parameter | yes | string | common parameter refer to: signature (sign), version (version), merchant ID (app_id), time (time) |
| order_no | yes | string | platform order number |
Response parameter description
| parameter name | type | description |
|---|---|---|
| status | int | status code |
| msg | string | state description |
| data | jsonObject | |
| data.order_no | string | platform order number |
| data.merchant_order_id | string | merchant trade order number |
| data.amount | string | order amount |
| data.currency | string | fiat currency |
| data.status | int | 0 pending payment 1 completed 2 abnormal payment 10 cancelled |
| data.return_url | string | return address |
| data.expires_time | int | order expiration time |
| data.create_time | int | creation time |
| data.addresses | jsonObject | |
| data.addresses.coin | string | coin name |
| data.addresses.address | string | address |
| data.addresses.amount | string | amount payable in currency |
| data.payments | jsonObject | |
| data.payments.coin | string | payment currency |
| data.payments.address | string | payment address |
| data.payments.txid | string | on-chain txid |
| data.payments.amount | string | payment amount |
| data.payments.confirm_time | int | verify the time |
| data.payments.status | int | 0 pending payment 1 completed 2 abnormal payment |
| data.payments.check_status | int | Abnormal reason: 1001 The payment amount does not match 1002 Repeated payment for the completed order |
| date_time | string | Beijing time |
| time_stamp | int | response time in seconds |
| sign | string | signature - the signature for all participating parameters above |
H5 Deposit result callback notification
$url = "The specific callback address is provided by the merchant to the platform side";
$header = [
'Content-Type:application/json',
];
$params = [
"data":[
"order_no":"2020010211153423123456",
"merchant_order_id":"ESIOqIfhKnY",
"status":1,
"payments":[
[
"address":"0x038B8E7406dED2Be112B6c7E4681Df5316957cad",
"coin":"eth",
"txid":"0x038B8E7406dED2Be112B6c7E4681Df5316957cad",
"amount":"0.1"
"confirm_time":"15612312112"
"check_code":"0",
],
]
],
"sign": "ywZa6BAgDYBLRtkAPM+i+vwNzFBovqHUvI+4Ponaw==",
];
$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 = "The specific callback address is provided by the merchant to the platform side"
data := map[string]interface{}{
"data": map[string]interface{}{
"order_no": "IGQUNC2WHT",
"merchant_order_id": "ESIOqIfhKnY",
"status": 1,
"payments": []interface{}{
map[string]interface{}{
"address": "0x038B8E7406dED2Be112B6c7E4681Df5316957cad",
"coin": "eth",
"txid": "0x038B8E7406dED2Be112B6c7E4681Df5316957cad",
"amount": "1",
"confirm_time": 15612312112,
"check_code": 1001,
},
},
},
"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 = {
"data": {
"order_no": "IGQUNC2WHT",
"merchant_order_id": "ESIOqIfhKnY",
"status": 1,
"payments": [
{
"address": "0x038B8E7406dED2Be112B6c7E4681Df5316957cad",
"coin": "eth",
"txid": "0x038B8E7406dED2Be112B6c7E4681Df5316957cad",
"amount": "1",
"confirm_time": 15612312112,
"check_code": 1001,
},
],
},
"sign": "OTA8utI8y8G93p7RPCyb4qIilFQ0B4Aq4iUjhaXWK9m2kgektqlHOASDKXT2VE7NPNysrGycYlVfjDR2WGZn1G66phHo3qa9CcCNpG9klOBEuBEMjiVbb/d8AXcxEzvQr9OCwNsikyxonyzLiY/lsNHeGm9cC5eRvlNLdUSVBipH+ajPd0lDHCayZPs1eCMfbm/xnf8e2lfy6z0UPOpHGfyX/0+hz99Ir5Xnx+0sBBzyZZJxKm4ROid5aDv/9m9guILpURae+Yw/IrkYF4uAKGX+/44cBvtTRQSdX76CAOBSiywZa6BAgDYBLRtkAPM+i+vwNzFBovqHUvI+4Ponaw==",
};
let POST_OPTIONS = {
port: 80,
host: "The specific callback address is provided by the merchant to the platform side",
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("order_no", "IGQUNC2WHT");
data.put("merchant_order_id", "ESIOqIfhKnY");
data.put("status", 1);
List<Object> payments = new ArrayList<>();
payments.add(new HashMap<String, Object>() {{
put("address", "0x038B8E7406dED2Be112B6c7E4681Df5316957cad");
put("coin", "eth");
put("txid", "0xttt");
put("amount", "1");
put("confirm_time", 15612312112L);
put("check_code", 1001);
}});
data.put("payments", payments);
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/h5order/callback", gson.toJson(params));
// if (null == res) {
// throw new RuntimeException("http error");
// }
// mock response from shop callback API
{
res = """
{
"status":200,
"sign": "OTA8utI8y8G93p7RPCyb4qIilFQ0B4Aq4iUjhaXWK9m2kgektqlHOASDKXT2VE7NPNysrGycYlVfjDR2WGZn1G66phHo3qa9CcCNpG9klOBEuBEMjiVbb/d8AXcxEzvQr9OCwNsikyxonyzLiY/lsNHeGm9cC5eRvlNLdUSVBipH+ajPd0lDHCayZPs1eCMfbm/xnf8e2lfy6z0UPOpHGfyX/0+hz99Ir5Xnx+0sBBzyZZJxKm4ROid5aDv/9m9guILpURae+Yw/IrkYF4uAKGX+/44cBvtTRQSdX76CAOBSiywZa6BAgDYBLRtkAPM+i+vwNzFBovqHUvI+4Ponaw==",
"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");
}
Example of return result:
{
"status":200,
"sign": "OTA8utI8y8G93p7RPCyb4qIilFQ0B4Aq4iUjhaXWK9m2kgektqlHOASDKXT2VE7NPNysrGycYlVfjDR2WGZn1G66phHo3qa9CcCNpG9klOBEuBEMjiVbb/d8AXcxEzvQr9OCwNsikyxonyzLiY/lsNHeGm9cC5eRvlNLdUSVBipH+ajPd0lDHCayZPs1eCMfbm/xnf8e2lfy6z0UPOpHGfyX/0+hz99Ir5Xnx+0sBBzyZZJxKm4ROid5aDv/9m9guILpURae+Yw/IrkYF4uAKGX+/44cBvtTRQSdX76CAOBSiywZa6BAgDYBLRtkAPM+i+vwNzFBovqHUvI+4Ponaw==",
"data":{
"success_data":"success"
}
}
H5 Deposit result notification (success/failure), a platform initiates a request, and the merchant responds
HTTP Request
POST: The specific callback address is provided by the merchant to the platform side
request parameters
| parameter name | required | type | description |
|---|---|---|---|
| data | no | string | callback notification carries data structure |
| data.order_no | yes | string | platform order number |
| data.merchant_order_id | yes | string | merchant trade order number |
| data.status | yes | int | 0 pending payment 1 completed 2 abnormal payment 10 cancelled |
| data.payments | yes | jsonArray | payment information |
| data.payments.coin | yes | string | payment currency |
| data.payments.address | yes | string | payment address |
| data.payments.txid | yes | string | on-chain txid |
| data.payments.amount | yes | string | payment amount |
| data.payments.confirm_time | yes | int | verify the time |
| data.payments.check_code | yes | int | Abnormal reason: 1001 The payment amount does not match 1002 Repeated payment for the completed order |
| sign | yes | string | sign the data in data |
Response parameter description
| parameter name | required | type | description |
|---|---|---|---|
| status | yes | int | status code |
| data | yes | jsonObject | |
| data.success_data | yes | sring | success |
| sign | yes | string | signature - the signature for all participating parameters above |
Outer Address Monitoring
Add Outer Address
$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) {
// more detail functions, see "Signature Regulations"Java demo
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");
}
Example of return result:
{
"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=="
}
- merchant submit addresses for monitoring transaction
HTTP Request
POST : /outer_address/add
Request parameter description
| parameter name | required | type | description |
|---|---|---|---|
| common parameter | yes | string | common parameter refers to: signature (sign), version (version), merchant ID (app_id), time (time) |
| chain | yes | string | the chain name, 12 character limit |
| addresses | yes | string array | addresses,array length limit 100 |
Response parameter description
| parameter name | type | description |
|---|---|---|
| status | int | status code |
| msg | string | status description |
| data | jsonObject | response data。 |
| data.fail_addresses | string array | save fail addresses, empty when no fail |
| date_time | string | formated time |
| time_stamp | int | timestamp in seconds |
| sign | string | signature |
Delete Outer Address
$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) {
// more detail functions, see "Signature Regulations"Java demo
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");
}
Example of return result:
{
"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=="
}
- merchant remove addresses under monitoring
HTTP Request
POST : /outer_address/delete
Request parameter description
| parameter name | required | type | description |
|---|---|---|---|
| common parameter | yes | string | common parameter refers to: signature (sign), version (version), merchant ID (app_id), time (time) |
| chain | yes | string | the chain name, 12 character limit |
| addresses | yes | string array | addresses,array length limit 100 |
Response parameter description
| parameter name | type | description |
|---|---|---|
| status | int | status code |
| msg | string | status description |
| data | jsonObject | response data |
| date_time | string | formated time |
| time_stamp | int | timestamp in seconds |
| sign | string | signature |
Outer Address Transaction Notify
$url = "provided by the merchant";
$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 = "provided by the merchant"
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: "provided by the merchant",
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");
}
Example of return result:
{
"status": 200,
"msg":"success",
"sign": "Yyyyg==",
"data": {
"success_data": "success"
}
}
- when trasaction of monitoring address commited on chain, platform will request this API, and merchant response to it
- if merchant response is fail or incorrect, platform will retry, until got success or 1 hour timeout. Retry at, 30 second、1 minute、3 minute、7 minute、15 minute、25 minute、40 minute、60 minute, after the first fail.
HTTP Request
POST: The specific callback address is provided by the merchant to the platform side
Request parameter description
| parameter name | required | type | description |
|---|---|---|---|
| sign | yes | string | signature |
| data | yes | jsonObject | transaction object |
| data.address | yes | string | merchant monitoring address |
| data.amount | yes | string | amount |
| data.chain | yes | string | chain symbol |
| data.coin | yes | string | contract coin symbol, main coin same to chain |
| data.confirm_count | yes | int | confirmations count |
| data.gas_fee | yes | string | gas fee |
| data.status | yes | int | status:0=unconfirm,1=confirmed |
| data.time | yes | int | block time(second) |
| data.token_address | no | string | contract token address, main coin is empty |
| data.transaction_type | yes | int | transaction type:1=transfer in,2=transfer out |
| data.txid | yes | string | transaction hash |
Response parameter description
| parameter name | required | type | description |
|---|---|---|---|
| status | yes | int | status code, 200 is ok |
| msg | yes | string | status code description |
| data | yes | JSONObject | response data |
| data.success_data | yes | string | whether handle success, if not return 'success',platform will retry request |
| sign | yes | string | signature |
Other
Coin query
$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) {
// more detail functions, see "Signature Regulations"Java demo
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");
}
Example of return result:
{
"status": 200,
"msg": "Processing successful",
"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=="
}
Coin related api for the merchant
HTTP Request
POST: /coin/list
request parameters
| parameter name | required | type | description |
|---|---|---|---|
| common parameter | yes | string | common parameter refers to: signature (sign), version (version), merchant ID (app_id), time (time) |
| coin | no | varchar | coin name (eg: eth) |
| chain | No | varchar | Main chain name (query main chain and its tokens, such as: eth) |
| page | no | int, default is 1 | 1<= N <=Max, N>Max ? N=Max ; N<1 ? N=1 |
| page_size | no | int | number of pages per page (20 ~ 500), default 20 |
Response parameter description
| parameter name | type | description |
|---|---|---|
| status | int | status code |
| msg | string | state description |
| data | jsonObject | For details, see "data details" below. |
| data.page | int | page number |
| data.max_page | int | total number of pages |
| data.count | int | number of records on the current page |
| data.list | jsonArray | specific record |
| data.list.coin | string | currency |
| data.list.chain | string | main chain name |
| data.list.status | int | status: 1 on; 0 off |
| data.list.open_in | int | deposit status: 1 on; 0 off |
| data.list.open_out | int | Withdrawal status: 1 on; 0 off |
| data.list.open_address | int | Assign address status: 1 on; 0 off |
| data.list.confirm_count | int | deposit confirmation count (default 6, the actual credit is subject to the order status) |
| data.list.min_transfer_in_amount | string | Minimum transfer amount (0 means no limit) |
| data.list.min_transfer_out_amount | string | Minimum withdrawal amount (0 means no limit) |
| data.list.contract_address | string | The contract address of a contract coin. |
| date_time | string | response time |
| time_stamp | int | unix timestamp in second |
| sign | string | signature |
Coin exchange rate
$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) {
// more detail functions, see "Signature Regulations"Java demo
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");
}
Example of return result:
{
"status":200,
"msg":"Request succeeded",
"data":{
"rate":"19490.64944834"
},
"date_time":"2020-01-14 00:50:27",
"sign":"ib1gqr0E0gJ02yo3InXKcKGaPqIp+r1izMego+KMRvE0B4ZdkFGrLmOtxGStUBibGVMzJRGWppKyU4PzcK877AOEvQlSFiUI+hDL1z8WaZsWD3r3ykbPzU0uWo4U+6WQTpOEo1gJ/N2FlAgwgzJsd
}
The exchange rate of various coins corresponding to usdt (this is use for coin price calculation, please go to the coin exchange rate API for coin exchange). Currently supported (btc eth hc eos trx xrp)
HTTP Request
POST: /rate/index
request parameters
| parameter name | required | type | description |
|---|---|---|---|
| common parameter | yes | string | common parameter refers to: signature (sign), version (version), merchant ID (app_id), time (time) |
| source_coin | yes | string | exchange coin |
| target_coin | yes | string | target coin currently only supports usdt |
Response parameter description
| parameter name | type | description |
|---|---|---|
| status | int | status code |
| msg | string | state description |
| data | jsonObject | For details, see "data details" below. |
| data.rate | string | exchange rate such as 1btc= 19490.64944834 usdt |
| date_time | string | response time |
| time_stamp | int | unix timestamp in second |
| sign | string | signature |
Coin to fiat currency rate
$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) {
// more detail functions, see "Signature Regulations"Java demo
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");
}
Example of return result:
{
"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
request parameters
| parameter name | required | type | description |
|---|---|---|---|
| common parameter | yes | string | common parameter refers to: signature (sign), version (version), merchant ID (app_id), time (time) |
| source_coin | yes | string | source coin |
| target_currency | yes | string | target fiat currency,default value usd。support usd,cny,aed,sgd,jpy,krw. |
Response parameter description
| parameter name | type | description |
|---|---|---|
| status | int | status code |
| msg | string | state description |
| data | jsonObject | For details, see "data details" below. |
| data.rate | string | coin to fiat currency rate. eg: 1eth= 2166.81 usd |
| data.source_coin | string | source coin |
| data.target_currency | string | target fiat currency |
| date_time | string | response time |
| time_stamp | int | unix timestamp in second |
| sign | string | signature |
Collection fee calculation
$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) {
// more detail functions, see "Signature Regulations"Java demo
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");
}
Example of return result:
{
"status":200,
"msg":"Request successful",
"data":{
"fee":"0.01386",
"coin":"eth"
},
"date_time":"2020-10-20 15:58:53",
"time_stamp":1603180733,
}
- Function: Calculation of deposit order collection fee
- Currently only eth and usdt_erc20 are supported, and other currencies will continue to expand in the future.
HTTP Request
POST: /balance/transactionFee
request parameters
| Parameter Name | Required | Type | Description |
|---|---|---|---|
| common parameter | Yes | JSON | common parameter refer to: signature (sign), version (version), merchant ID (app_id), time (time) |
| coin | Yes | string | Coin name is provided by the platform |
Response parameter description
| parameter name | type | description |
|---|---|---|
| status | int | status code |
| msg | string | status description |
| data | jsonObject | |
| data.fee | string | Fee |
| data.coin | string | Coin name (unit of handling fee) |
| date_time | string | response time |
| time_stamp | int | unix timestamp in second |
| sign | string | signature |
Withdrawal gas fee estimate query
$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) {
// more detail functions, see "Signature Regulations"Java demo
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");
}
Example of return result:
{
"status": 200,
"msg": "Request succeeded",
"data": [
{
"coin": "fil", //coin name
"fee": "0.00379379", //Current coin (coin) transaction fee
"unit": "fil"//Unit of handling fee
}, {
"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,
}
Withdrawal fee estimate API, returns the fee for withdrawal of the supported currency. (Currently only supports eth and its contract, fil)
HTTP Request
POST: /transfer/transactionFee
request parameters
| Parameter Name | Required | Type | Description |
|---|---|---|---|
| common parameter | yes | string | common parameter refer to: signature (sign), version (version), merchant ID (app_id), time (time) |
| coin | No | string | The coin name is provided by the platform |
Response parameter description
| parameter name | type | description |
|---|---|---|
| status | int | status code |
| msg | string | status description |
| data | jsonObject | |
| data.coin | sring | coin name |
| data.fee | sring | handling fee |
| data.unit | sring | Handling fee unit |
| date_time | string | response time |
| time_stamp | int | unix timestamp in second |
| sign | string | signature |
Refund order list
$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");
}
Example of return result:
{
"status": 200,
"msg": "success",
"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
request parameters
| Parameter Name | Required | Type | Description |
|---|---|---|---|
| common parameter | yes | string | common parameter refer to: signature (sign), version (version), merchant ID (app_id), time (time) |
| page | no | int | default is 1, 1<= N <=Max, N>Max ? N=Max ; N<1 ? N=1 |
| page_size | no | int | number of pages per page (20 ~ 500), default 20 |
| sort_num | no | int | default list sorting is ascanding order of record creation time ( 1 positive order; 2 reverse order) |
| status | no | string | status of refund order, default return all statuses, 0 pending; 1 succeeded; 2 failed; 5 to be audit; 6 audit rejected; 10 wait platform audit; 11 platform rejected; 25 refunding; 26 lacking gas fee; |
| start_time | no | int | start time (creation time) format: timestamp |
| end_time | no | int | end time (creation time) format: timestamp |
| contract | no | string | main chain name |
| coin | no | string | coin name |
| receive_order_id | no | string | related recharge order_id |
| receive_txid | no | string | related recharge tx hash |
| txid | no | string | the refund order tx hash |
| from_address | no | string | transaction from address ,as well the recharge user address |
| to_address | no | string | transaction from address, as well the cold wallet address, or the recharge transaction from address |
Response parameter description
| parameter name | type | description |
|---|---|---|
| status | int | status code |
| msg | string | status description |
| data | jsonObject | |
| data.page | int | page number |
| data.count | int | record total count |
| data.list | jsonArray | |
| data.list.block_number | int | refund transaction block number |
| data.list.block_time | int | refund transaction block time |
| data.list.coin | string | refund coin name |
| data.list.contract | string | refund chain name |
| data.list.contract_address | string | refund coin token address |
| data.list.created_at | int | create time |
| data.list.creator | string | refund order creator |
| data.list.end_time | int | end time |
| data.list.from_address | string | transaction from address ,as well the recharge user address |
| data.list.gas_fee | string | transaction gas fee |
| data.list.method | int | refund method, 0: refund back to the recharge from address,1: cold wallet address |
| data.list.order_id | string | refund order_id |
| data.list.receive_amount | string | related recharge transaction amount |
| data.list.receive_order_id | string | related recharge order_id |
| data.list.receive_txid | string | related recharge transaction hash |
| data.list.refund_amount | string | actual refund amount |
| data.list.remark | string | remark |
| data.list.status | int | status of refund order, default return all statuses, 0 pending; 1 succeeded; 2 failed; 5 to be audit; 6 audit rejected; 10 wait platform audit; 11 platform rejected; 25 refunding; 26 lacking gas fee; |
| data.list.to_address | string | transaction from address, as well the cold wallet address, or the recharge transaction from address |
| data.list.txid | string | related recharge tx hash |
| data.list.type | int | refund type, 0: relate recharge 1:supported coin with out recharge 2: not support coin 3: not support chain |
| date_time | string | response time |
| time_stamp | int | unix timestamp in second |
| sign | string | signature |
Check whether the number of currencies recorded in its ledger is consistent with the data in its on-chain wallet
$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");
}
Example of return result:
{
"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
request parameters
| Parameter Name | Required | Type | Description |
|---|---|---|---|
| common parameter | yes | string | common parameter refer to: signature (sign), version (version), merchant ID (app_id), time (time) |
| list.chain | no | string | chain name |
| list.coin | yes | string | token coin name |
| list.ledger_balance | no | string | ledger balance |
Response parameter description
| parameter name | type | description |
|---|---|---|
| status | int | status |
| msg | string | message |
| data | jsonObject | data |
| data.list | jsonArray | list |
| data.list.chain | string | chain name |
| data.list.coin | string | coin name |
| data.list.ledger_balance | string | ledger balance |
| data.list.onchain_balance | string | onchain balance |
| data.list.difference | string | balance difference |
| data.list.matched | bool | is balance matched |
| data.list.note | string | note |
| date_time | string | response time |
| time_stamp | int | unix timestamp in second |
| sign | string | signature |
Check whether the number of coins in an account address is consistent with the number on the chain
$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");
}
Example of return result:
{
"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
request parameters
| Parameter Name | Required | Type | Description |
|---|---|---|---|
| common parameter | yes | string | common parameter refer to: signature (sign), version (version), merchant ID (app_id), time (time) |
| list.chain | no | string | chain name |
| list.coin | yes | string | token coin name |
| list.ledger_balance | no | string | ledger balance |
| list.address | yes | string | chain account address |
Response parameter description
| parameter name | type | description |
|---|---|---|
| status | int | status |
| msg | string | message |
| data | jsonObject | data |
| data.list | jsonArray | list |
| data.list.chain | string | chain name |
| data.list.coin | string | coin name |
| data.list.address | string | chain account address |
| data.list.ledger_balance | string | ledger balance |
| data.list.onchain_balance | string | onchain balance |
| data.list.difference | string | balance difference |
| data.list.matched | bool | is balance matched |
| data.list.note | string | note |
| date_time | string | response time |
| time_stamp | int | unix timestamp in second |
| sign | string | signature |
Check whether the withdrawal data recorded in the internal ledger is consistent with the data on its wallet chain
$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");
}
Example of return result:
{
"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
request parameters
| Parameter Name | Required | Type | Description |
|---|---|---|---|
| common parameter | yes | string | common parameter refer to: signature (sign), version (version), merchant ID (app_id), time (time) |
| list.trade_id | yes | string | merchant withdraw order no |
| list.chain | no | string | chain name |
| list.coin | no | string | coin name |
| list.ledger_amount | no | string | withdraw amount |
| list.from_address | no | string | withdraw from address |
| list.to_address | no | string | withdraw to address |
| list.txid | no | string | transaction hash |
Response parameter description
| parameter name | type | description |
|---|---|---|
| status | int | status |
| msg | string | message |
| data | jsonObject | data |
| data.list | jsonArray | list |
| data.list.trade_id | string | merchant withdraw order no |
| data.list.chain | string | chain name |
| data.list.coin | string | coin name |
| data.list.from_address | string | withdraw from address |
| data.list.to_address | string | withdraw to address |
| data.list.ledger_amount | string | withdraw ledger amount |
| data.list.onchain_amount | string | withdraw onchain amount |
| data.list.difference | string | amount difference |
| data.list.matched | bool | is amount matched |
| data.list.note | string | note |
| date_time | string | response time |
| time_stamp | int | unix timestamp in second |
| sign | string | signature |
Response status code
| Status Code | Meaning | Remarks |
|---|---|---|
| 200 | Request has succeeded | |
| 500 | Request failed | |
| 501 | Parameter error | |
| 502 | Common parameter error | |
| 503 | Invalid app_id | |
| 504 | Invalid Merchant | |
| 505 | Bad Signature | |
| 506 | Data does not exist | |
| 507 | System maintenance, service suspended | |
| — | — | — |
| 520 | Coin is required | |
| 521 | Address is required | |
| 522 | User ID is required | |
| 523 | Address does not exist | |
| 524 | This address has already been assigned to another user and cannot be reassigned | |
| 525 | The user id has already been assigned an address and cannot be reassigned | |
| 526 | Eos and its token memo parameters are required, the value can be empty | |
| 527 | The combination of coin and contract address does not exist | |
| 528 | User does not exist | |
| 529 | Coin does not exist | |
| 530 | Rate limit exceeded, please try again later | |
| — | — | — |
| 533 | Malformed main chain name | |
| 534 | Wrong order number | |
| 535 | Abnormal exchange rate | |
| 536 | The merchant has not configured coin exchange, please contact the platform administrator to activate | |
| 537 | Merchant review failed | |
| 538 | The name of the exchange target coin is required | |
| 539 | Exchange coin name is required | |
| 540 | Malformed exchange target coin name | |
| 541 | Malformed exchange target coin name | |
| 542 | malformed user_id | |
| 543 | Address format error | |
| 544 | Txid format error | |
| 545 | The format of the coin name is incorrect | |
| 546 | Amount exceeded maximum threshold value | |
| 547 | Amount up to 8 decimal places | |
| 548 | The transfer address is not a valid address | |
| 549 | The transfer amount should be greater than the minimum transfer amount %s | |
| 550 | Daily rate limit exceeded, please contact customer service to increase the limit | |
| 551 | Please use up allocated address before request a new address | |
| 552 | Insufficient address or failed to get address | |
| 553 | The transfer amount should be greater than 0 | |
| 554 | Insufficient account balance | |
| 555 | The transaction ID cannot be empty and cannot be larger than 32 bits | |
| 556 | Duplicate submissions | |
| 557 | The transaction was not found | |
| 558 | Under review | |
| 559 | Transferring | |
| — | — | — |
| 560 | Cancel | |
| 561 | Failed to transfer | |
| 562 | The coin is not supported or the coin is not the main chain coin | |
| 563 | The ip is wrong, please contact the administrator to deal with it | |
| 564 | Bad IP | |
| 565 | This coin is not supported | |
| 566 | IP rate limit exceeded | |
| 567 | Address creation is off | |
| 568 | The withdrawal status is closed and cannot be withdrawn | |
| 569 | Abnormal withdrawal data, transfer failed | |
| — | — | — |
| 570 | The merchant has not opened the key setting | |
| 571 | Wrong merchant key version number | |
| 572 | The refund_txid format is incorrect | |
| 573 | Refund_txid is required | |
| 574 | The refund_txid does not exist | |
| 575 | Refund for the refund_txid has not been received | |
| 576 | Exchange transaction does not exist | |
| 577 | Redemption is successful, no refunds | |
| 578 | During the exchange transaction, no refund is allowed | |
| 579 | The merchant has not configured a wallet address, please contact the administrator | |
| — | — | — |
| 580 | Cancel Order | Wallet Layer Cancel Order |
| 581 | Query for transaction fee for this coin is not supported | |
| 582 | Please configure hyperpay shared wallet | |
| 583 | Type Error | |
| 584 | The exchange coin is not supported | |
| 585 | The exchange trading pair is not supported | |
| 586 | The exchange rate for to coin currently only supports usdt |
- Remark: If there is a version upgrade or new modification of the status code in the later stage, this document shall prevail.