Java 尝试从Dwolla restful api获取访问令牌

Java 尝试从Dwolla restful api获取访问令牌,java,json,http,http-headers,dwolla,Java,Json,Http,Http Headers,Dwolla,我在获取沙盒环境的访问令牌时遇到问题。 Im遵循此指南进行身份验证: 因此,当我按照本指南创建请求时,api会给出以下响应: {“错误”:“访问被拒绝”,“错误描述”:“无效的应用程序凭据”。} 根据说明,我使用mf客户ID的密钥和密码作为我的客户密码 以下是我使用的代码: public static void main(String[] args) { try { URL url = new URL("https://www.dwolla.com/oauth/v2/t

我在获取沙盒环境的访问令牌时遇到问题。 Im遵循此指南进行身份验证:

因此,当我按照本指南创建请求时,api会给出以下响应:
{“错误”:“访问被拒绝”,“错误描述”:“无效的应用程序凭据”。}

根据说明,我使用mf客户ID的密钥和密码作为我的客户密码

以下是我使用的代码:

public static void main(String[] args) {
    try {

        URL url = new URL("https://www.dwolla.com/oauth/v2/token");
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setRequestMethod("POST");

            conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
    conn.setRequestProperty("client_id", "<Key>");
            conn.setRequestProperty("client_secret", "<Secret>");
            conn.setRequestProperty("grant_type", "client_credentials"); 


            conn.setDoInput(true);
            conn.setDoOutput(true);



            System.out.println("Message:" + conn.getResponseMessage());

            BufferedReader br = new BufferedReader(new InputStreamReader(
            (conn.getInputStream())));

    String output;
    System.out.println("Output from Server .... \n");
    while ((output = br.readLine()) != null) {
        System.out.println(output);
    }

    conn.disconnect();
    } catch (MalformedURLException ex) {
        Logger.getLogger(PaymentTest.class.getName()).log(Level.SEVERE, null, ex);
    } catch (IOException ex) {
        Logger.getLogger(PaymentTest.class.getName()).log(Level.SEVERE, null, ex);
    }

}
publicstaticvoidmain(字符串[]args){
试一试{
URL=新URL(“https://www.dwolla.com/oauth/v2/token");
HttpURLConnection conn=(HttpURLConnection)url.openConnection();
conn.setRequestMethod(“POST”);
conn.setRequestProperty(“内容类型”、“应用程序/x-www-form-urlencoded”);
conn.setRequestProperty(“客户机id”和“”);
conn.setRequestProperty(“客户机机密”和“”);
conn.setRequestProperty(“授权类型”、“客户端凭据”);
conn.setDoInput(真);
连接设置输出(真);
System.out.println(“消息:+conn.getResponseMessage());
BufferedReader br=新的BufferedReader(新的InputStreamReader(
(conn.getInputStream());
字符串输出;
System.out.println(“从服务器输出…”\n);
而((output=br.readLine())!=null){
系统输出打印项次(输出);
}
连接断开();
}捕获(格式错误){
Logger.getLogger(PaymentTest.class.getName()).log(Level.SEVERE,null,ex);
}捕获(IOEX异常){
Logger.getLogger(PaymentTest.class.getName()).log(Level.SEVERE,null,ex);
}
}

我终于获得了一个访问令牌。我的问题是,上面的代码首先使用client_id和client_secret作为头参数。这些需要放在请求的主体中

我的第二个问题是,我发送的消息使用了错误的内容类型

以下是对我有用的代码:

URL url = new URL("https://sandbox.dwolla.com/oauth/v2/token");
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setRequestMethod("POST");

        conn.setRequestProperty("Content-Type", "application/json");


        conn.setDoInput(true);
        conn.setDoOutput(true);

        String data = "";


    JSONObject jsonObj = new JSONObject();
    jsonObj.put("client_id", "<Your Client ID>");
    jsonObj.put("client_secret", "<Your Client Secret>");
    jsonObj.put("grant_type", "client_credentials");

    data = jsonObj.toString();

    System.out.println("data = " + data);



    byte[] outputInBytes = data.getBytes("UTF-8");
    OutputStream os = conn.getOutputStream();
    os.write( outputInBytes );    
    os.close();


    System.out.println("Message:" + conn.getResponseMessage());


    BufferedReader br = new BufferedReader(new InputStreamReader((conn.getInputStream())));

    String output;
    System.out.println("Output from Server .... \n");
    while ((output = br.readLine()) != null) {
        System.out.println(output);
    }

    conn.disconnect();
URL=新URL(“https://sandbox.dwolla.com/oauth/v2/token");
HttpURLConnection conn=(HttpURLConnection)url.openConnection();
conn.setRequestMethod(“POST”);
conn.setRequestProperty(“内容类型”、“应用程序/json”);
conn.setDoInput(真);
连接设置输出(真);
字符串数据=”;
JSONObject jsonObj=新的JSONObject();
jsonObj.put(“客户机id”);
jsonObj.put(“客户的秘密”);
put(“授予类型”、“客户凭证”);
data=jsonObj.toString();
System.out.println(“数据=”+数据);
byte[]outputInBytes=data.getBytes(“UTF-8”);
OutputStream os=conn.getOutputStream();
写入(输出字节);
os.close();
System.out.println(“消息:+conn.getResponseMessage());
BufferedReader br=新的BufferedReader(新的InputStreamReader((conn.getInputStream()));
字符串输出;
System.out.println(“从服务器输出…”\n);
而((output=br.readLine())!=null){
系统输出打印项次(输出);
}
连接断开();

您是否在测试代码的最后一个小时内生成了令牌?声明说,短期访问令牌在生成一小时后过期。另外,请注意不要在公开帖子上发布API私钥/机密。这些密钥来自沙箱,但以防我删除它们。好吧,我现在很困惑,当你进入dwolla仪表板时生成的令牌是我的客户机机密?在仪表板上,我得到了一把“钥匙”和一个“秘密”。还有一个按钮,可以让我生成令牌。我一直使用“密钥”作为我的客户id,“机密”作为我的客户机密是的,听起来不错,
“请求应用程序授权”
“请求参数”
下的文档提到了相同的
客户id
客户机密
。我没有使用Dwolla API,但授权流与任何其他API相同,如下所示。如果您使用的凭据来自沙盒,则可能需要指向“沙盒API主机”:
https://api-sandbox.dwolla.com
。我使用您包含的相同凭据运行了您的代码,得到了与您相同的
“error”
,这表明我们应该使用共享的Sandox API端点进行测试。如果我能获得沙盒访问权限为我工作,我会发回。