无法正确发送带有 Volley POST 请求的市价单 [响应:此请求的签名无效]

如何解决无法正确发送带有 Volley POST 请求的市价单 [响应:此请求的签名无效]

StringRequest 看起来工作正常,除了我尝试发送的签名。

我已经知道,如果其中任何一项不正确,Signature 就会失败:

  • 如果您没有将签名放在 params Map 中的最后一个键处。
  • 如果 API_SECRET 不正确,即使是一个空格。

我已经放置了所有必需的密钥,如果缺少一个,API 会返回适当的警告。

我使用 Python 获得了完全相同的签名,具有相同的时间戳,并且该顺序在 Python 中完美运行,但不适用于 Volley (Java)。

我担心 Volley 在发送订单时会更改相同值的格式,这就是签名与 Binance API 不匹配的原因。

我做错了什么?

package com.example.volleypost;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

import com.android.volley.toolBox.StringRequest;
import com.android.volley.AuthFailureError;
import com.android.volley.toolBox.Volley;
import com.android.volley.RequestQueue;
import com.android.volley.VolleyError;
import com.android.volley.Response;
import com.android.volley.Request;
import java.util.LinkedHashMap;
import android.text.TextUtils;
import org.json.JSONObject;
import java.util.Calendar;
import java.util.HashMap;
import android.util.Log;
import java.util.Map;

public class MainActivity extends AppCompatActivity
{
    private final String TAG = "TAG";

    private final String API_KEY = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
    private final String API_SECRET = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";

    private RequestQueue requestQueue;
    private StringRequest jsonObjectRequest;
    public String requestBody;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        requestQueue = Volley.newRequestQueue(this);

        JSONObject obj = new JSONObject();
        try{
            obj.put("symbol","BNBBUSD");
            requestBody = obj.toString();
        }catch (Exception e){}


        jsonObjectRequest = getStringRequest();
        requestQueue.add(jsonObjectRequest);
    }

    private StringRequest getStringRequest()
    {
        return new StringRequest(
                Request.Method.POST,"https://api.binance.com/api/v3/order",new Response.Listener<String>()
                {
                    @Override
                    public void onResponse(String response)
                    {
                        Log.d(TAG,"Response : " + response );
                    }
                },new Response.ErrorListener()
        {
            @Override
            public void onErrorResponse(VolleyError error)
            {
                try
                {
                    String responseBody = new String(error.networkResponse.data,"utf-8");
                    JSONObject data = new JSONObject(responseBody);
                    String message = data.optString("msg");
                    Log.d(TAG,"Response Error = " + message);
                }
                catch (Exception e){}
            }
        })
        {

               @Override
               protected Map<String,String> getParams()
               {
                   Map<String,String> data = new LinkedHashMap<>();

                   String timeStamp,signature,formatedData;

                   try
                   {
                       data.put("symbol","BNBBUSD");
                       data.put("side","SELL");
                       data.put("type","MARKET");
                       data.put("quantity","1.12");

                       timeStamp = String.format("%d",Calendar.getInstance().getTimeInMillis());
                       data.put("timestamp",timeStamp);

                       formatedData = formatData(data);

                       Log.d(TAG,formatedData + "\n");

                       signature = SignatureGenerator.getHmacSignature(formatedData,API_SECRET);
                       data.put("signature",signature);

                       Log.d(TAG,data.toString() + "\n");

                       return data;
                   }
                   catch (Exception e)
                   {
                       return null;
                   }
               }

            @Override
            public Map<String,String> getHeaders() throws AuthFailureError
            {
                Map<String,String> headers = new HashMap<>();
                headers.put("X-MBX-APIKEY",API_KEY);
                return headers;
            }
        };
    }

    public String formatData(Map<String,String> data)
    {
        String[] valuesArray = new String[data.size()];

        int i = 0;
        for (String key : data.keySet())
        {
            valuesArray[i] =  key + "=" + data.get(key);
            i++;
        }
        return TextUtils.join("&",valuesArray);
    }
}

我收到了这样的回复

symbol=BNBBUSD&side=SELL&type=MARKET&quantity=1.12&timestamp=1610625131172

{symbol=BNBBUSD,side=SELL,type=MARKET,quantity=1.12,timestamp=1610625131172,signature=959725ca183e8dd024961c57b9be9e371fe59f81c98693820421b3df0314acbd}

Response Error = Signature for this request is not valid.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?