コンテンツにスキップ

認証・認可

Token、Secret Keyの申請および変更については、「個人センター - 開発者設定」ページで操作を行ってください。

インターフェース権限検証

クライアントが取引インターフェースをリクエストする際、ヘッダーには必ず 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秒以内である必要があり、同じNonceは一度しか使用できません。

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();
        }
        // ランダム部分
        char[] buf = new char[randomLength];
        for (int i = 0; i < randomLength; i++) {
            buf[i] = CHAR_POOL[RANDOM.nextInt(CHAR_POOL.length)];
        }
        // 結合
        return timestamp + '_' + String.valueOf(buf);
    }
}

例:

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

# リクエストAPIエンドポイント
/openApi/entrust/currentList
# 送信パラメータ
symbol = "BTC-USDT";
type = "1"

# ソート後の文字列
1534927978_ab43c57ba172a6be125cca2f449826f9980casymbol=BTC-USDTtype=1

# sha1計算後:
$signature は 731faa3d170bb746a767cea58ae563830594e1fe となります

Token

ユーザーアクセストークン。「個人センター - オープン API」で確認できます。

Nonce

ランダムな文字列。クライアントはリクエストごとにランダムな文字列を生成します。生成規則:タイムスタンプ_5桁のランダムな英数字。例:1534927978_ab43c 注意:時間の誤差は60秒を超えてはならず、同じ Nonce は一度しか使用できません。

Signature

署名。tokensecret_keynonce$_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();
        }
        // ランダム部分
        char[] buf = new char[randomLength];
        for (int i = 0; i < randomLength; i++) {
            buf[i] = CHAR_POOL[RANDOM.nextInt(CHAR_POOL.length)];
        }
        // 結合
        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