这是我第一次使用 PayPal API,我正在尝试使用沙盒帐户在 java Web 应用程序中测试快速结帐集成,并且我在第一步中遇到了问题。我正在调用 SetExpressCheckout 操作,并收到此错误:"
TIMESTAMP=2014%2d11%2d25T15%3a19%3a14Z&CORRELATIONID=523b6bcbe502f&ACK=Failure&L_ERRORCODE0=10001&L_SHORTMESSAGE0=Internal%20Error&L_LONGMESSAGE0=Timeout%20processing%20request"
正如您在L_LONGMESSAGE0中看到的描述是"超时处理请求",我不知道它是否相关,但时间戳提前 3 小时(我在 GMT-3,所以当我发送请求时它是 12:19:14 而不是 15:19:14)。除此之外,我正在根据PayPal的帮助构建我的 url,这里有一个示例(使用为沙盒帐户提供的默认测试用户、密码和签名):
https://api-3t.sandbox.paypal.com/nvp?USER=sdk-three_api1.sdk.com&PWD=QFZCWN5HZM8VBG7Q&SIGNATURE=A-IzJhZZjhg29XQ2qnhapuwxIDzyAZQ92FRP5dqBzVesOkzbdUONzmOU&METHOD=SetExpressCheckout&VERSION=99.0&RETURNURL=http%3A%2F%2Flocalhost%3A8080%2Fmysite%2Fsomepage&CANCELURL=http%3A%2F%2Flocalhost%3A8080%mysite%2Ferror&PAYMENTREQUEST_0_PAYMENTACTION=Sale&PAYMENTREQUEST_0_AMT=10.00
这是完整的代码:
String sUrl = "https://api-3t.sandbox.paypal.com/nvp?USER=sdk-three_api1.sdk.com&...."; //the full URL shown above
URL obj = new URL(sUrl);
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer sbResponse = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
sbResponse.append(inputLine);
}
in.close();
每次阅读响应时,我都会看到"超时处理请求"消息(我也尝试不对请求参数进行编码,结果相同)。有没有人知道这里发生了什么,或者至少有一个提示,以便我可以检查它?我发现的与此错误相关的大多数帖子都是针对 php 的,并且是由参数中的问题(编码错误、缺少参数等)引起的。
提前谢谢,问候。
好吧,似乎PayPal不喜欢我编写它的 url,所以我更改了 org.apache.http.client.methods.HttpPost
的HttpURLConnection
,所以这是我的代码(工作):
HttpClient client = new DefaultHttpClient();
HttpPost post = new HttpPost(SANBOX_URL);
post.setHeader("User-Agent", "Mozilla/5.0");
List<NameValuePair> urlParameters = new ArrayList<NameValuePair>();
urlParameters.add(new BasicNameValuePair(USER, "SANDBOX_USER"));
urlParameters.add(new BasicNameValuePair(PASSWORD, "SANDBOX_PWD"));
urlParameters.add(new BasicNameValuePair(SIGNATURE, "SANDBOX_SIGNATURE"));
urlParameters.add(new BasicNameValuePair(VERSION, "VERSION"));
urlParameters.add(new BasicNameValuePair(ACTION, "ACTION"));
urlParameters.add(new BasicNameValuePair(AMOUNT, "AMOUNT"));
urlParameters.add(new BasicNameValuePair(RETURN_URL, "RETURN_URL"));
urlParameters.add(new BasicNameValuePair(CANCEL_URL, "CANCEL_URL"));
urlParameters.add(new BasicNameValuePair(METHOD, "METHOD"));
post.setEntity(new UrlEncodedFormEntity(urlParameters));
HttpResponse response = client.execute(post);
我必须更改的另一件事是不对参数的值进行编码;一旦我完成了所有这些更改,最后我得到了"TOKEN=XXXX&TIMESTAMP=2014%2d11%2d27T00%3a08%3a29Z&CORRELATIONID=XXXX&ACK=Success&VERSION=119%2e0&BUILD=XXXX"。
希望它能帮助别人