Ошибка "BasicNetwork.performRequest: неожиданный код ответа 403 для https://poloniex.com/tradingApi" - PullRequest
0 голосов
/ 04 июня 2018

При использовании android залпа для API-интерфейса Poloniex я получаю сообщение об ошибке

"BasicNetwork.performRequest: неожиданный код ответа 403 для https://poloniex.com/tradingApi"

IЯ искал в сети решения и ничего не помогло мне исправить эту ошибку. Я использовал правильный ключ API и секретный ключ, в этом нет ничего неправильного.

Ниже приведен мой код:

public class MainActivity extends AppCompatActivity {
    String nonce;
    String apiKey;
    String secretKey;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);   
        RequestQueue queue = SingletonRequestQueue.getInstance(getApplicationContext()).getRequestQueue();
        VolleyLog.DEBUG = true;
        String uri =  "https://poloniex.com/tradingApi";
        final String nonce=String.valueOf(System.currentTimeMillis());

        Map<String, String> jsonParams = new HashMap<String, String>();
        jsonParams.put("nonce",nonce);
        jsonParams.put("command", "returnBalances");

        final JsonObjectRequest myRequest = new JsonObjectRequest(
                Request.Method.POST,
                uri,
                new JSONObject(jsonParams),

                new Response.Listener<JSONObject>() {
                    @Override
                    public void onResponse(JSONObject response) {
                        VolleyLog.wtf(response.toString(), "utf-8");
                        Toast.makeText(getApplicationContext(), response.toString(), Toast.LENGTH_LONG).show();
                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        Log.e("Error from Response",error.toString());
                    }
                }) {

            @Override
            public Map<String, String> getHeaders()  {
                HashMap<String, String> headers=null;
                try {
                    String apiKey = "MY API KEY";

                    Mac mac = null;
                    String secretKey = "MY SECRET KEY";
                    SecretKeySpec keyspec = null;
                    keyspec = new SecretKeySpec(secretKey.getBytes("UTF-8"), "HmacSHA512");
                    mac = Mac.getInstance("HmacSHA512");
                    mac.init(keyspec);
                    Map<String, String> args = new HashMap<String, String>();
                    args.put("nonce", nonce);
                    args.put("command", "returnBalances");
                    String postData = "";
                    for (Iterator<String> iter = args.keySet().iterator(); iter.hasNext(); ) {
                        String arg = iter.next();
                        if (postData.length() > 0) {
                            postData += "&";
                        }
                        try {
                            postData += arg + "=" + URLEncoder.encode(args.get(arg), "UTF-8");
                        } catch (Exception e) {

                        }
                    }

                    headers = new HashMap<String, String>();
                    headers.put("Key", apiKey);
                    headers.put("Sign", toHex(mac.doFinal(postData.getBytes("UTF-8"))));
                    headers.put("Content-Type", "application/json; charset=utf-8");
                    headers.put("User-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36");
                }catch (Exception e) {

                }
                return headers;
            }
        };

        myRequest.setRetryPolicy(new DefaultRetryPolicy(0,-1,DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
        queue.add(myRequest);

    }

   private String toHex(byte[] b) throws UnsupportedEncodingException {
        return String.format("%040x", new BigInteger(1,b));
    }
}

Просьба помочья ...

1 Ответ

0 голосов
/ 25 июня 2018

Запросы на публикацию не как json, это публикация с данными, поэтому вам нужно сначала удалить:

"Content-Type", "application/json; charset=utf-8");
"User-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36");

Примечание: если вы добавите эти заголовки, API вернет «Недопустимая команда».


Если вы хотите, чтобы он работал, он должен выглядеть следующим образом:

  • URL-адрес записи: https://poloniex.com/tradingApi

  • данные: {'nonce': 1529928989092, 'command': 'returnBalances'} параметры необходимо отправлять как данные, а не как параметры

  • заголовки: {'Key': 'yourkeyhere', 'Sign': 'yoursignhere'}

Ничего более или менее.

...