Java 尝试从Dwolla restful api获取访问令牌
我在获取沙盒环境的访问令牌时遇到问题。 Im遵循此指南进行身份验证: 因此,当我按照本指南创建请求时,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
{“错误”:“访问被拒绝”,“错误描述”:“无效的应用程序凭据”。}
根据说明,我使用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端点进行测试。如果我能获得沙盒访问权限为我工作,我会发回。