Protected Overrides Function getJsonPrivate(method As String, otherParameters() As Tuple(Of String, String)) As String
Dim base = "https://www.coinmex.com"
Dim premethod = "/api/v1/spot/ccex/"
Dim longmethod = premethod + method
Dim timestampstring = getEstimatedTimeStamp().ToString
Dim stringtosign = timestampstring + "GET" + longmethod + "{}" '1553784499976GET/api/v1/spot/ccex/account/assets{}
Dim hasher = New System.Security.Cryptography.HMACSHA256(System.Text.Encoding.UTF8.GetBytes(_secret1))
Dim sighashbyte = hasher.ComputeHash(System.Text.Encoding.UTF8.GetBytes(stringtosign))
Dim signature = System.Convert.ToBase64String(sighashbyte) '"FIgrJFDOQctqnkOTyuv6+uTy6xw3OZiP4waC1u6P5LU="=
Dim url = base + longmethod 'https://www.coinmex.com/api/v1/spot/ccex/account/assets
'_apiKey1="cmx-1027e54e4723b09810576f8e7a5413**"
'_passphrase1= 1Us6&f%*K@Qsqr**
'
Dim response = CookieAwareWebClient.downloadString1(url, "", {Tuple.Create("ACCESS-KEY", _apiKey1), Tuple.Create("ACCESS-SIGN", signature), Tuple.Create("ACCESS-TIMESTAMP", timestampstring), Tuple.Create("ACCESS-PASSPHRASE", _passphrase1)})
Return response
End Function
Public Overrides Sub readbalances()
typicalReadBalances("account/assets", "data", "currencyCode", "available", "frozen", "", {})
End Sub
Я думаю, что сделал это так, как указано здесь
https://github.com/coinmex/coinmex-official-api-docs/blob/master/README_EN.md#1-access-account-information
# Request
GET /api/v1/spot/ccex/account/assets
# Response
[
{
"available":"0.1",
"balance":"0.1",
"currencyCode":"ETH",
"frozen":"0",
"id":1
},
{
"available":"1",
"balance":"1",
"currencyCode":"USDT",
"frozen":"0",
"id":1
}
]
А для подписи
Это руководство говорит
Заголовок ACCESS-SIGN - это вывод, сгенерированный с помощью HMAC SHA256 для
создать HMAC SHA256, используя секретный ключ декодирования BASE64 в
строка предварительного хэша для генерации метки времени + метод + requestPath + "?" +
queryString + body (где ‘+’ представляет конкатенацию строк) и
BASE64 кодированный выход. Значение метки времени совпадает с
ACCESS-TIMESTAMP заголовок. Это тело является строкой тела запроса или
опускается, если тела запроса нет (обычно это запрос GET). это
метод должен быть написан заглавными буквами.
Помните, что перед использованием его в качестве ключа для HMAC, декодирование base64 (
результат составляет 64 байта) сначала выполняется на 64-разрядном алфавитно-цифровом
строка пароля. Кроме того, дайджест-выход кодируется в base64
перед отправкой заголовка.
Пользовательские параметры должны быть подписаны, кроме знака. Во-первых,
Строка для подписи упорядочена в соответствии с именем параметра (первым
сравнить первую букву всех имен параметров в алфавитном порядке,
если вы встретите ту же первую букву, то вы переходите ко второй
письмо и т. д.).
Например, если мы подпишем следующие параметры
curl "https://www.coinmex.com/api/v1/spot/ccex/orders?limit=100"
Timestamp = 1590000000.281
Method = "POST"
requestPath = "/api/v1/spot/ccex/orders"
queryString= "?limit=100"
body = {
'code': 'ct_usdt',
'side': 'buy',
'type': 'limit',
'size': '1',
'price': '1',
'funds': '',
}
Создать строку для подписи
Message = '1590000000.281GET/api/v1/spot/ccex/orders?limit=100{"code": "ct_usdt", "side": "buy", "type": "limit", "size": "1", "price": "0.1", "funds": ""}'
Затем подписываемый символ добавляется с помощью закрытого ключа.
параметры для генерации последней строки символов для подписи.
Например:
hmac = hmac(secretkey, Message, SHA256)
Signature = base64.encode(hmac.digest())
Я подумал, что _secret1 - это строка base64, а не utf8, поэтому я изменил на
Dim base = "https://www.coinmex.com"
Dim premethod = "/api/v1/spot/ccex/"
Dim longmethod = premethod + method
Dim timestampstring = getEstimatedTimeStamp().ToString
'Dim stringtosign = timestampstring + "GET" + longmethod + "{}" '1553784499976GET/api/v1/spot/ccex/account/assets{} also doesn't work
Dim stringtosign = timestampstring + "GET" + longmethod '1553784499976GET/api/v1/spot/ccex/account/assets
Dim hasher = New System.Security.Cryptography.HMACSHA256(Convert.FromBase64String(_secret1)) 'secret looks like 43a90185f5b7ab25af045e9e64bac5dc745934f359f1806fcdd2a4af80ac2
Dim sighashbyte = hasher.ComputeHash(System.Text.Encoding.UTF8.GetBytes(stringtosign))
Dim signature = Convert.ToBase64String(sighashbyte) '"FIgrJFDOQctqnkOTyuv6+uTy6xw3OZiP4waC1u6P5LU="=
Dim url = base + longmethod 'https://www.coinmex.com/api/v1/spot/ccex/account/assets
'_apiKey1="cmx-1027e54e4723b09810576f8e7a5413**"
'_passphrase1= 1Us6&f%*K@Qsq***
'
Dim response = CookieAwareWebClient.downloadString1(url, "", {Tuple.Create("ACCESS-KEY", _apiKey1), Tuple.Create("ACCESS-SIGN", signature), Tuple.Create("ACCESS-TIMESTAMP", timestampstring), Tuple.Create("ACCESS-PASSPHRASE", _passphrase1)})
Return response
Также не работает.
Секретный ключ (я усек несколько букв) выглядит как
43a90185f5b7ab25af045e9e64bac5dc745934f359f1806fcdd2a4af80ac2
Это то, что должно быть декодировано как base 64 или utf8 или как?
Спецификация говорит, что это 64. Однако, это не похоже на 64-кодированную строку. Похоже, буквы из 0-f
Лучшие ответы будут:
1. Скажите мне, что пошло не так в коде. Я сделал изменения. Пытаться. Запустить. Работает. Потрясающе.
Хороший ответ будет
2. Пример моделирования с фальшивыми / реальными подписями / одноразовыми / парольными фразами и реальными фактическими заголовками и сигнатурами. Так что я вижу, где именно у меня неправильный результат.
Обновление: я снова изменил код. Я изменяю метку времени на секунды вместо миллисекунд. Я удаляю {}. Я использую оба пути.
Dim base = "https://www.coinmex.com"
Dim premethod = "/api/v1/spot/ccex/"
Dim longmethod = premethod + method
Dim timestampstring = (getEstimatedTimeStamp() / 1000).ToString
Dim stringtosign = timestampstring + "GET" + longmethod '1555154812.857GET/api/v1/spot/ccex/account/assets
Dim hasher = New System.Security.Cryptography.HMACSHA256(System.Text.Encoding.UTF8.GetBytes(_secret1)) '"43a90185f5b7ab25af045e9e64bac5dc745934f359f1806fcdd2a4af80ac2******
Dim sighashbyte = hasher.ComputeHash(System.Text.Encoding.UTF8.GetBytes(stringtosign))
Dim signature = Convert.ToBase64String(sighashbyte) '"FIgrJFDOQctqnkOTyuv6+uTy6xw3OZiP4waC1u6P5LU="=
Dim url = base + longmethod 'https://www.coinmex.com/api/v1/spot/ccex/account/assets
'_apiKey1="cmx-1027e54e4723b09810576f8e7a5413**"
'_passphrase1= 1Us6&f%*K@QsqrYZ
'
Dim response = CookieAwareWebClient.downloadString1(url, "", {Tuple.Create("ACCESS-KEY", _apiKey1), Tuple.Create("ACCESS-SIGN", signature), Tuple.Create("ACCESS-TIMESTAMP", timestampstring), Tuple.Create("ACCESS-PASSPHRASE", _passphrase1)})
Return response
Все еще не работает.
Текущая ошибка
Message = "Удаленный сервер возвратил ошибку: (401) Unauthorized."
Я бы хотел дать какой-нибудь API-ключ только для чтения. Подожди. Или создайте пустую учетную запись и получите ключ API только для чтения