一次接口签名引发的笑话
接口签名规则如下:
- 1.timestamp+method(请求方式大写)+path用base64编码,sha256加密
- 2.每次请求之前须签名下,
- 3.api-expiry设置过期时间

Sample 签名方式:
Java
import org.apache.commons.codec.binary.Hex;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;
public class ApiSignGenerator {
public static String generateApiSign(long timestamp, String method, String path, String apiSecret) throws NoSuchAlgorithmException, InvalidKeyException {
String algorithm = "HmacSHA256";
String message = timestamp + (method == null ? "" : method.toUpperCase()) + (path == null ? "" : path);
byte[] encodedSecret = Base64.getEncoder().encode(apiSecret.getBytes());
SecretKeySpec secretKeySpec = new SecretKeySpec(encodedSecret, algorithm);
Mac mac = Mac.getInstance(algorithm);
mac.init(secretKeySpec);
byte[] bytes = mac.doFinal(message.getBytes());
return new String(Hex.encodeHex(bytes));
}
// If you want sent request to "https://api.xxxx.com/api/accounts", you can generate sign by doing this:
public static void getAccounts() throws InvalidKeyException, NoSuchAlgorithmException {
long timestamp = 1553596255786L; // System.currentTimeMillis();
String method = "GET";
String path = "/api/accounts";
String apiSecret = "NCtRU0JwZWZnVFVDZmlMRFduMk1hTFZDM05vS3g1Z3E1c1h6blB0RmxXRT0=";
String apiSign = generateApiSign(timestamp, method, path, apiSecret);
System.out.println("apiSign:" + apiSign);
// The console will print:"apiSign:e4c8f42e18b551dcebd5801bfa254498e98d20e0a5322b30c78a7004aa5a2669"
}
}
javascript:
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.9-1/crypto-js.js"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/Base64/1.0.1/base64.js"></script>
<script type="text/javascript">
function generateApiSign(timestamp, method, path, apiSecret) {
var message = timestamp + method + path;
var encodedSecret = window.btoa(apiSecret);
return CryptoJS.HmacSHA256(message, encodedSecret).toString();
};
// If you want sent request to "https://api.xxxx.com/api/accounts", you can generate sign by doing this:
function getAccounts() {
var timestamp = 1553596255786;//new Data().getMilliseconds();
var method = "GET";
var path = "/api/accounts";
var apiSecret = "NCtRU0JwZWZnVFVDZmlMRFduMk1hTFZDM05vS3g1Z3E1c1h6blB0RmxXRT0=";
var apiSign = generateApiSign(timestamp, method, path, apiSecret);
console.info("apiSign:" + apiSign);
// The console will print:"apiSign:e4c8f42e18b551dcebd5801bfa254498e98d20e0a5322b30c78a7004aa5a2669"
};
</script>
python:
def sign_request(method,path,apiSecret):
r_time = str(time.time()*1000)[0:13]
method = method.upper()
enbase64key = base64.b64encode(apiSecret.encode("utf-8")).decode("utf-8") //关键一步,将str用base64编码
message = r_time+method+path
# print(enbase64key,message)
api_sign = hmac.new(bytes(enbase64key, encoding='utf-8'), bytes(message, encoding='utf-8'),
digestmod=hashlib.sha256).digest()
HEX = api_sign.hex()
return (HEX,r_time)
def balances():
api_sign = sign_request("get", "/api/balances", "/UM0EDr+QhnAMR9yhsynXW1bAa1MxpOt8U+yvPJuHUk=")
header = {
"API-KEY": "77f485d5039455b9e7b48657dec357df",
"API-SIGN": api_sign[0],
"API-TIMESTAMP": api_sign[1],
"API-PASSCODE": "qwerdf886."
}
res = requests.get("http://116.6.110.50:8007/api/balances", headers=header)
print(res.text)
return ""
def batch_place_order(price,increasing,account):
#批量下订单,price 初始价格 increasing 每次递增价格 account 下多少单
index = 0
while(index<account):
# time.sleep(2)
index+= 1
price = float(price)
price+=increasing
print(index,price,type(price))
api_sign = sign_request("post", "/api/orders", "/UM0EDr+QhnAMR9yhsynXW1bAa1MxpOt8U+yvPJuHUk=")
header = {
"API-KEY": "77f485d5039455b9e7b48657dec357df",
"API-SIGN": api_sign[0],
"API-TIMESTAMP": api_sign[1],
"API-PASSCODE": "qwerdf886."
}
date = {
"instrumentId": "BXBT-ETH",
"orderType": "LIMIT",
"postOnly": False,
"price": str(price)[0:8],
"selfTradePrevention": "CN",
"side": "BUY",
"size": "1134",
"timeInForce": "GTC"
}
res = requests.post("http://116.6.110.50:8007/api/orders",headers = header,data=json.dumps(date))
print(res.text)
return ""
postman请求方式:
预执行脚本签名,通过大括号取值


浙公网安备 33010602011771号