Ошибка аутентификации API Mexc при получении баланса счёта, код ошибки 602

Вопрос или проблема

Я использую 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 обычно возникает из-за неправильной подписи запроса или неверных данных, передаваемых в заголовках. Давайте разберемся, как решить эту проблему, тщательно проверив ваш код.

Проверка параметров запроса

  1. Параметры запроса: Убедитесь, что все параметры, которые вы передаете в запросе, правильно формируют строку запроса. В вашем коде метод GetRequestParamString создает строку параметров. Необходимо убедиться, что строка соответствует требованиям API. Одна из распространенных ошибок — это неверный порядок или отсутствие ожидания символа & в конце строки.

    Пример простого исправления:

    if (sb.Length > 0)
        sb.Remove(sb.Length - 1, 1); // Удаление последнего символа '&'
  2. Подпись: Проверьте, корректно ли производите подпись запроса. Метод Sign должен принимать доступный параметр RequestParam, который является строкой запроса. Если она пустая, подпись может быть неверной. Убедитесь, что RequestParam передается с правильными значениями.

Проверка заголовков

  1. Заголовки: Ваша строка заголовков для 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 с конкретным описанием вашего запроса и полученной ошибкой. Это поможет вам получить более детальную информацию о вашей проблеме.

Оцените материал
Добавить комментарий

Капча загружается...