Вопрос или проблема
Я использую C# и Unity для получения баланса аккаунта пользователя USDT, но получаю код ошибки 602. Пожалуйста, помогите. Мой код приведен ниже. Я использовал конечную точку из документации по API для фьючерсов.
`public class InteractWithAccount : MonoBehaviour
{
private string baseUrl = "https://contract.mexc.com";
private string apiKey = "мой ключ";
private string apiSecret = "мой секретный ключ";
private HttpClient httpClient;
private async void Start() // код начинается здесь-------------------
{
httpClient = new HttpClient();
string response = await SendSignedAsync(baseUrl + "/api/v1/private/account/asset/USDT", HttpMethod.Get, new Dictionary<string, string> {
{"currency", "USDT"}
});
Debug.Log(response);
}
public async Task<string> SendSignedAsync(string requestUri, HttpMethod httpMethod, Dictionary<string, string> query = null, object content = null)
{
string querryString = "";
try
{
querryString = ApiUtility.GetRequestParamString(query);
long now = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
Debug.Log($"{querryString}");
SignVo sv = new SignVo();
sv.ReqTime = now.ToString();
sv.SecretKey = apiSecret;
sv.AccessKey = apiKey;
sv.RequestParam = querryString;
string signature = ApiUtility.Sign(sv);
return await SendAsync(requestUri, httpMethod, now.ToString(), signature);
}
catch (Exception ex)
{
Debug.LogException(ex);
return null;
}
}
private async Task<string> SendAsync(string requestUri, HttpMethod httpMethod, string timeS, string sign)
{
try
{
using (var request = new HttpRequestMessage(httpMethod, requestUri))
{
request.Headers.Add("ApiKey", apiKey);
request.Headers.Add("Signature", sign);
request.Headers.Add("Request-Time", timeS);
HttpResponseMessage response = await httpClient.SendAsync(request);
Debug.Log(response.Content);
Debug.Log(response.RequestMessage);
Debug.Log(response.StatusCode);
using (HttpContent responseContent = response.Content)
{
string jsonString = await responseContent.ReadAsStringAsync();
return jsonString;
}
}
}
catch (Exception ex)
{
Debug.LogError("Ошибка в SendAsync: " + ex.Message);
return null;
}
}
}
public static class ApiUtility
{
public static string GetRequestParamString(Dictionary<string, string> param)
{
if (param == null || param.Count == 0)
return "";
StringBuilder sb = new StringBuilder(1024);
SortedDictionary<string, string> sortedMap = new SortedDictionary<string, string>(param);
foreach (var entry in sortedMap)
{
string key = entry.Key;
string value = string.IsNullOrEmpty(entry.Value) ? "" : entry.Value;
sb.Append(key).Append('=').Append(UrlEncode(value)).Append('&');
}
if (sb.Length > 0)
sb.Remove(sb.Length - 1, 1);
return sb.ToString();
}
public static string UrlEncode(string s)
{
if (string.IsNullOrEmpty(s))
return "";
return WebUtility.UrlEncode(s).Replace("+", "%20");
}
public static string Sign(SignVo signVo)
{
if (string.IsNullOrEmpty(signVo.RequestParam))
signVo.RequestParam = "";
string str = signVo.AccessKey + signVo.ReqTime + signVo.RequestParam;
return ActualSignature(str, signVo.SecretKey);
}
public static string ActualSignature(string inputStr, string key)
{
using (var hmac = new HMACSHA256(Encoding.UTF8.GetBytes(key)))
{
byte[] inputBytes = Encoding.UTF8.GetBytes(inputStr);
byte[] hash = hmac.ComputeHash(inputBytes);
return BitConverter.ToString(hash).Replace("-", "").ToLowerInvariant();
}
}
}
public class SignVo
{
public string ReqTime { get; set; }
public string AccessKey { get; set; }
public string SecretKey { get; set; }
public string RequestParam { get; set; }
}`
Я пробовал все методы из разных тем и документации, но ничего не сработало. Возможно, проблема в методе подписи или заголовках.
Ответ или решение
Ошибка 602 при аутентификации API Mexc обычно возникает из-за неправильной подписи запроса или неверных данных, передаваемых в заголовках. Давайте разберемся, как решить эту проблему, тщательно проверив ваш код.
Проверка параметров запроса
-
Параметры запроса: Убедитесь, что все параметры, которые вы передаете в запросе, правильно формируют строку запроса. В вашем коде метод
GetRequestParamString
создает строку параметров. Необходимо убедиться, что строка соответствует требованиям API. Одна из распространенных ошибок — это неверный порядок или отсутствие ожидания символа&
в конце строки.Пример простого исправления:
if (sb.Length > 0) sb.Remove(sb.Length - 1, 1); // Удаление последнего символа '&'
-
Подпись: Проверьте, корректно ли производите подпись запроса. Метод
Sign
должен принимать доступный параметрRequestParam
, который является строкой запроса. Если она пустая, подпись может быть неверной. Убедитесь, чтоRequestParam
передается с правильными значениями.
Проверка заголовков
-
Заголовки: Ваша строка заголовков для API должна содержать правильные ключи. Это особенно важно для заголовка
Request-Time
. Значение времени запроса должно быть записано в миллисекундах. Убедитесь, что оно актуально на момент отправки запроса:long now = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
Так как ошибка 602 может указывать на проблемы с аутентификацией, убедитесь, что не было никаких задержек при создании подписи.
Полный пример
Может помочь приведенный ниже пример, который упрощает вашу структуру и гарантирует корректное заполнение всех частей:
private async Task<string> SendSignedAsync(string requestUri, HttpMethod httpMethod, Dictionary<string, string> query = null)
{
try
{
string queryString = ApiUtility.GetRequestParamString(query);
long requestTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
SignVo signVo = new SignVo
{
ReqTime = requestTime.ToString(),
AccessKey = apiKey,
SecretKey = apiSecret,
RequestParam = queryString
};
string signature = ApiUtility.Sign(signVo);
return await SendAsync(requestUri, httpMethod, requestTime.ToString(), signature);
}
catch (Exception ex)
{
Debug.LogError($"Ошибка: {ex.Message}");
return null;
}
}
Заключение
Если вы проверили все вышеуказанные моменты и ошибка все еще появляется, попробуйте следующие шаги:
- Проверьте документацию Mexc API на наличие изменений или новых требований по аутентификации.
- Попробуйте протестировать API с помощью других инструментов (например, Postman), чтобы исключить проблемы в самом коде.
- Убедитесь, что ваши учетные данные (API ключ и секретный ключ) правильно сконфигурированы и имеют доступ.
Если после выполнения всех шагов проблема все еще не решается, может быть полезно обратиться в поддержку Mexc с конкретным описанием вашего запроса и полученной ошибкой. Это поможет вам получить более детальную информацию о вашей проблеме.