【问题标题】:Unknown Host Exception with PayPalPayPal 的未知主机异常
【发布时间】:2012-07-21 23:36:05
【问题描述】:

我正在尝试使用 PayPal 按钮管理器 API。每次运行文件时,无论调用类型如何,都会得到以下错误输出:

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

【问题讨论】:

    标签: java api paypal unknown-host


    【解决方案1】:

    sandbox.paypal.com/cgi-bin/webscr 不是主机名。你的主机名应该只是sandbox.paypal.com。另外,你的路径应该是/cgi-bin/webscr,而不是/

    另见:

    【讨论】:

    • 更改我声明的主机名修复了我的错误,但现在我的输出是一堆 Set-Cookie 错误。不幸的是,由于长度,我无法发布输出。 =/
    • 不确定你的意思。是否存在您未通过的沙盒所需的 cookie?还是Java产生的错误?例如,您可以编辑任何机密信息并发布pastie 吗?还是只发布错误消息的一部分?
    • 沙盒应该不需要 cookie。任何其他调用都不需要它们,API 用户指南中也没有记录。但是我的 Java 输出可以在 pastie.org/4307499 找到
    • 那些不是错误。这是沙盒服务器的回复,使用 HTTP Header Set-Cookie 请求客户端(在本例中为您的 Java 代码),为未来的请求设置指定的 cookie。这对于像 HTTP 这样的无状态协议非常常见,它将第一个请求与未来的相关请求联系在一起。通常这一切都被您的浏览器或其他高级 HTTP 浏览技术隐藏起来。
    • 您为什么不使用更高级的 Java Web 客户端类,例如 HttpUnit's WebClient,它会自动处理这些低级 HTTP 细节?您不必使用 Java 之类的语言来处理 HTTP 标头。
    猜你喜欢
    • 1970-01-01
    • 2013-04-06
    • 2011-05-24
    • 2013-05-29
    • 1970-01-01
    • 1970-01-01
    • 2018-09-21
    • 1970-01-01
    相关资源
    最近更新 更多