2012-07-23 141 views
1

我正在嘗試使用PayPal按鈕管理器API。每次我跑我的文件,無論呼叫類型的,我碰到下面的錯誤輸出:PayPal發生未知主機異常

run: 
Request sent to PayPal: USER=xxxxxxxxxxxxxxx&PWD=xxxxxxxxx&SIGNATURE=xxxxxxxxxxxx&METHOD=BMButtonSearch&VERSION=59.0&STARTDATE=2012-10-11T00:00:00Z&ENDDATE=2012-10-11T00:00:00Zjava.net.UnknownHostException: sandbox.paypal.com/cgi-bin/webscr 
    at java.net.Inet6AddressImpl.lookupAllHostAddr(Native Method) 
    at java.net.InetAddress$1.lookupAllHostAddr(InetAddress.java:866) 
    at java.net.InetAddress.getAddressesFromNameService(InetAddress.java:1258) 
    at java.net.InetAddress.getAllByName0(InetAddress.java:1211) 
    at java.net.InetAddress.getAllByName(InetAddress.java:1127) 
    at java.net.InetAddress.getAllByName(InetAddress.java:1063) 
    at java.net.InetAddress.getByName(InetAddress.java:1013) 
    at BM_ButtonSearch.main(BM_ButtonSearch.java:48) 
BUILD SUCCESSFUL (total time: 0 seconds) 

我的類代碼如下:

import java.net.*; 
import javax.net.ssl.*; 
import java.io.*; 
import java.security.MessageDigest; 
import java.util.Date; 

public class BM_ButtonSearch { 

    public static void main(String[] args) { 
     try { 
     //String hostname = "paypal.com/cgi-bin/webscr"; //Set as host if live 
     String hostname = "sandbox.paypal.com/cgi-bin/webscr"; //Set as host if testing 
     // Set variables for PayPal transaction 
     String user = "xxxxxxxxxxxxxxxxxxxx"; //Set PayPal API username 
     String password = "xxxxxxxxxxx"; //API password, not acct password 
     String signature = "xxxxxxxxxxxxxxxxxxx"; //Set unique user signature 
     String method = "BMButtonSearch"; //Set Button Manager button type 
     String version = "59.0"; //Set Button Manager Version as ##.# 
     String startdate = "2012-10-11T00:00:00Z"; //Set start date using YYYY-MM-DDTHH:MM:SSZ 
     String enddate = "2012-10-11T00:00:00Z"; //Set end date using YYYY-MM-DDTHH:MM:SSZ 

     String requestID = ""; 
     MessageDigest md5 = MessageDigest.getInstance("MD5"); 
     byte[] md5summe = md5.digest(new Date().toString().getBytes()); 

     for (int it = 0; it < md5summe.length; it++) { 
      String temp = Integer.toHexString(md5summe[it] & 0xFF); 
      /* 
      * toHexString has the side effect of making stuff like 0x0F 
      * only one char F(when it should be '0F') so I check the length 
      * of string 
      */ 
      if (temp.length() < 2) { 
       temp = "0" + temp; 
      } 
      requestID += temp.toUpperCase(); 
     } 

     // Build NVP String (currency string added, declare in variables) 
     String paramNVP = "USER=" + user + "&PWD=" + password + "&SIGNATURE=" 
       + signature + "&METHOD=" + method + "&VERSION=" + version 
       + "&STARTDATE=" + startdate + "&ENDDATE=" + enddate; 

     System.out.print("Request sent to PayPal: " + paramNVP); 

     // Create the SSL Socket 
     int port = 443; 
     InetAddress addr = InetAddress.getByName(hostname); 
     SSLSocketFactory factory = (SSLSocketFactory) SSLSocketFactory.getDefault(); 
     SSLSocket sslsock = (SSLSocket) factory.createSocket(addr, port); 

     // Open Socket Output Stream 
     String path = "/"; 
     BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(sslsock.getOutputStream(), "UTF8")); 

     // Send data as a POST 
     bw.write("POST " + path + " HTTP/1.0\r\n"); 

     // Write header info to the socket 
     bw.write("Connection: close\r\n"); 
     bw.write("Content-Type: text/namevalue\r\n"); 
     bw.write("Content-Length: " + paramNVP.length() + "\r\n"); 
     bw.write("Host: " + hostname + "\r\n"); 
     bw.write("X-VPS-REQUEST-ID: " + requestID + "\r\n"); 
     bw.write("X-VPS-CLIENT-TIMEOUT: 240\r\n"); 
     // Sets the Payflow client IP variable 
     // bw.write("PP_REMOTE_ADDR: 192.168.0.123\r\n"); 
     bw.write("\r\n"); 

     // Write the NVP String to the Socket 
     bw.write(paramNVP); 
     // Flush the stream 
     bw.flush(); 

     // Read the Socket response 
     BufferedReader br = new BufferedReader(new InputStreamReader(
       sslsock.getInputStream())); 
     String line; 
     while ((line = br.readLine()) != null) { 
      System.out.println(line); 
     } 

     // Close the writer, reader, and the socket 
     bw.close(); 
     br.close(); 
     sslsock.close(); 
     } 

     catch (Exception e) { 
     e.printStackTrace(System.out); 
     } 
    } // end main() 
}// end class SocketTest 

任何幫助,將不勝感激。我發現大多數人建議嘗試通過瀏覽器訪問URL,在我的情況下工作,而不是在使用我的Java類時。

在此先感謝! :D

回答

2

sandbox.paypal.com/cgi-bin/webscr不是主機名。您的主機名應該只是sandbox.paypal.com。此外,您的路徑應該是/cgi-bin/webscr,而不是/

參見:

+0

更改我的聲明主機固定我的錯誤,但現在我的輸出是一堆的Set-Cookie錯誤。不幸的是,我無法發佈輸出。 =/ – Fairplay89 2012-07-23 17:45:36

+0

不確定你的意思。您沒有經過的沙盒所需的餅乾?或者它是由Java產生的錯誤?你能否編輯任何機密信息併發布[** pastie **](http://pastie.org/)例如?或者只發布錯誤消息的一部分? – mellamokb 2012-07-23 17:47:01

+0

沙盒應該不需要cookie。它們不需要用於任何其他呼叫,並且沒有在API用戶指南中記錄。但是,我的Java輸出可以在http://pastie.org/4307499 – Fairplay89 2012-07-23 17:48:27