認証・認可
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
署名。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";
# リクエストインターフェースアドレス
/openApi/entrust/currentList
# 送信パラメータ
symbol = "BTC-USDT";
type = "1"
# ソート後の文字列
1534927978_ab43c57ba172a6be125cca2f449826f9980casymbol=BTC-USDTtype=1
# sha1 計算後:
$signature は 731faa3d170bb746a767cea58ae563830594e1fe