跳转至

认证授权

关于token、secret-key申请和修改,请在“个人中心 - 开放接口”页面进行相关操作。

接口权限验证

客户端请求交易接口,header均要带上Nonce,token,Signature参数。例如:

Python
$header[] = 'Nonce: 1534927978_ab43c';
$header[] = 'Token: 57ba172a6be125cca2f449826f9980ca';
$header[] = 'Signature: v490hupi0s0bckcp6ivb69p921';
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);

token:

用户令牌,请在“个人中心 - 开放接口”查看。

Nonce:

随机数,客户端每次请求随机生成字符。生成规则,时间戳_5位随机字母或数字。如:1534927978_ab43c 注意:时间误差不能超过60秒,相同随机数只能被使用一次。

Signature:

签名,使用$token,$secret_key,$nonce,$_POST,$_GET计算得出,服务端验证签名以确定请求是否来自用户。

生成Signature的Python示例代码:

Python
def sign(Nonce,data=dict()):

    tmp = list()
    tmp.append(TOKEN)
    tmp.append(SECRET)
    tmp.append(Nonce)
    for d,x in data.items():
        tmp.append(str(d) + "=" + str(x))

    return hashlib.sha1(''.join(sorted(tmp))).hexdigest()

生成Signature的PHP示例代码:

PHP
private function signature($nonce)
{
    $token = TOKEN;
    $secret_key = SECRET-KEY;
    $tmpArr = array($api_key,$secret_key,$nonce);
    foreach($_GET as $k=>$v){
        $tmpArr[] = $k."=".$v;
    }
    foreach($_POST as $k=>$v){
        $tmpArr[] = $k."=".$v;
    }
    sort($tmpArr, SORT_STRING);
    $tmpStr = implode( $tmpArr );
    $signature = sha1( $tmpStr );
    return $signature;
}

生成Signature的Java示例代码:

Java
import org.apache.commons.codec.digest.DigestUtils;

import java.security.SecureRandom;
import java.util.*;

public class SignatureUtil {
    private static final char[] CHAR_POOL = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".toCharArray();
    private static final SecureRandom RANDOM = new SecureRandom();

    /**
     * 生成签名 (SHA1)
     *
     * @param params    请求参数(Map)
     * @param token     Token
     * @param secretKey 密钥
     * @return 签名字符串(SHA1 Hex)
     */
    public static HashMap<String, String> getSignature(Map<String, Object> params, String token, String secretKey) {
        List<String> paramList = new ArrayList<>();
        String nonce = generateNonce(5, 10);
        // 固定参数
        paramList.add(token);
        paramList.add(secretKey);
        paramList.add(nonce);

        // 请求参数(key=value)
        if (params != null && !params.isEmpty()) {
            for (Map.Entry<String, Object> entry : params.entrySet()) {
                paramList.add(entry.getKey() + "=" + entry.getValue());
            }
        }
        // 按字典序不区分大小写排序
        paramList.sort(String::compareToIgnoreCase);
        // 拼接为单个字符串
        String joined = String.join("", paramList);
        HashMap<String, String> result = new HashMap<>();
        result.put("nonce", nonce);
        // 生成 SHA1 签名
        result.put("sign", DigestUtils.sha1Hex(joined));
        return result;
    }

    /**
     * nonce 生成:时间戳_随机字符串
     *
     * @param randomLength     随机字符长度(建议5)
     * @param timestampLength  时间戳长度(10=秒级, 13=毫秒级)
     * @return 例如 "1730084359772_A1bX9"
     */
    public static String generateNonce(int randomLength, int timestampLength) {
        //时间戳部分
        long currentMillis = System.currentTimeMillis();
        String timestamp = String.valueOf(currentMillis);
        if (timestampLength < timestamp.length()) {
            timestamp = timestamp.substring(0, timestampLength);
        } else if (timestampLength > timestamp.length()) {
            // 如果要求的长度比当前时间戳长,就在末尾补0
            StringBuilder tsBuilder = new StringBuilder(timestampLength);
            tsBuilder.append(timestamp);
            while (tsBuilder.length() < timestampLength) {
                tsBuilder.append('0');
            }
            timestamp = tsBuilder.toString();
        }
        //随机部分(避免 StringBuilder 每次重新分配)
        char[] buf = new char[randomLength];
        for (int i = 0; i < randomLength; i++) {
            buf[i] = CHAR_POOL[RANDOM.nextInt(CHAR_POOL.length)];
        }
        //拼接(StringBuilder 一次性分配)
        return timestamp + '_' + String.valueOf(buf);
    }
}

示例:

Text Only
#假设:
$token = "57ba172a6be125c";
$secret_key = "ca2f449826f9980ca";
$nonce = "1534927978_ab43c";

#请求接口地址
/openApi/entrust/currentList
#提交参数
symbol = "BTC-USDT";
type = "1"

#排序后的字符串
1534927978_ab43c57ba172a6be125cca2f449826f9980casymbol=BTC-USDTtype=1

#sha1计算后:
$signature 为 731faa3d170bb746a767cea58ae563830594e1fe