简体   繁体   English

在Java中将PayPal curl请求转换为http请求

[英]Transforming a PayPal curl request to an http request in Java

On the PayPal website, all the example calls are done using curl. 在PayPal网站上,所有示例调用均使用curl完成。 Easy to repeat using CURL under Linux, but I would like to use Java to make these calls. 在Linux下使用CURL很容易重复,但是我想使用Java进行这些调用。

Eg, suppose to have the call: 例如,假设有电话:

curl -v https://api.sandbox.paypal.com/v1/payments/payment \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer <Access-Token>' \
-d '{
  "intent":"sale",
  "redirect_urls":{
    "return_url":"http://example.com/your_redirect_url.html",
    "cancel_url":"http://example.com/your_cancel_url.html"
  },
  "payer":{
    "payment_method":"paypal"
  },
  "transactions":[
    {
      "amount":{
        "total":"7.47",
        "currency":"USD"
      }
    }
  ]
}'

Suppose that I have the value for <Access-Token> that has to be set, how can I convert the previous string into an http request to get an answer from PayPal using Java and no CURL? 假设我具有必须设置的<Access-Token>的值, 如何将前一个字符串转换为http请求以使用Java而不使用CURL从PayPal获得答案?

Right now I did something like the following to the an HttpURLConnection to the URL: 现在,我对URL的HttpURLConnection进行了如下操作:

private HttpURLConnection createPOSTHttpURLConnection(final URL url) throws IOException {
        final HttpURLConnection connection = (HttpURLConnection) url.openConnection();

        connection.setRequestMethod("POST");
        connection.setUseCaches(false);
        connection.setDoInput(true);
        connection.setDoOutput(true);

        connection.setRequestProperty("User-Agent", "Mozilla/4.0");
        return connection;
    }

In my main I do as follows: 我的主要工作如下:

final HttpURLConnection connection = createPOSTHttpURLConnection(url);

connection.setRequestProperty("Authorization", "Bearer <Access-Token>");//replaced with a real value
connection.setRequestProperty("Content-Type", "application/json");
        final String jsonData = "{ \"intent\":\"sale\",  \"redirect_urls\":{    \"return_url\":\"http://example.com/your_redirect_url.html\",    \"cancel_url\":\"http://example.com/your_cancel_url.html\" }, \"payer\":{    \"payment_method\":\"paypal\"  },  \"transactions\":[    {      \"amount\":{        \"total\":\"7.47\",        \"currency\":\"USD\"}}]}";

connection.setFixedLengthStreamingMode(jsonData.length());

// get the output stream to POST to.
try(final DataOutputStream output = new DataOutputStream(connection.getOutputStream())) {
        output.writeBytes(jsonData);
        output.flush();
}

final InputStream isToBeRead =  connection.getInputStream();

However, I get the following error: 但是,出现以下错误:

Cannot read from the given URL https://api.sandbox.paypal.com/v1/payments/payment with given params and data

Tha occcurs when I try to use the InputStream : 当我尝试使用InputStream时发生Tha:

java.net.HttpRetryException: cannot retry due to server authentication, in streaming mode
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1636)
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1439)
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:254)
    at com.sudengut.de.utils.url.HttpClient.readFromHttpURL(HttpClient.java:65)

UPDATE 更新

Implementing Kevin Hoffman 'solution I get the following result: 实施Kevin Hoffman '解决方案,我得到以下结果:

Server returned HTTP response code: 400 for URL: https://api.sandbox.paypal.com/v1/payments/payment
Response code:400
Response message:Bad Request

Implementing Garry 's answer I obtain the following log: 实现Garry的答案,我得到以下日志:

 21:30:06.070 [main] DEBUG o.a.h.c.protocol.RequestAddCookies - CookieSpec selected: default
21:30:06.109 [main] DEBUG o.a.h.c.protocol.RequestAuthCache - Auth cache not set in the context
21:30:06.111 [main] DEBUG o.a.h.i.c.PoolingHttpClientConnectionManager - Connection request: [route: {s}->https://api.sandbox.paypal.com:443][total kept alive: 0; route allocated: 0 of 2; total allocated: 0 of 20]
21:30:06.143 [main] DEBUG o.a.h.i.c.PoolingHttpClientConnectionManager - Connection leased: [id: 0][route: {s}->https://api.sandbox.paypal.com:443][total kept alive: 0; route allocated: 1 of 2; total allocated: 1 of 20]
21:30:06.147 [main] DEBUG o.a.h.impl.execchain.MainClientExec - Opening connection {s}->https://api.sandbox.paypal.com:443
21:30:06.202 [main] DEBUG o.a.h.i.c.DefaultHttpClientConnectionOperator - Connecting to api.sandbox.paypal.com/173.0.82.78:443
21:30:06.202 [main] DEBUG o.a.h.c.s.SSLConnectionSocketFactory - Connecting socket to api.sandbox.paypal.com/173.0.82.78:443 with timeout 0
21:30:06.668 [main] DEBUG o.a.h.c.s.SSLConnectionSocketFactory - Enabled protocols: [TLSv1, TLSv1.1, TLSv1.2]
21:30:06.668 [main] DEBUG o.a.h.c.s.SSLConnectionSocketFactory - Enabled cipher suites:[TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, TLS_RSA_WITH_AES_128_CBC_SHA256, TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256, TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256, TLS_DHE_RSA_WITH_AES_128_CBC_SHA256, TLS_DHE_DSS_WITH_AES_128_CBC_SHA256, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, TLS_RSA_WITH_AES_128_CBC_SHA, TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA, TLS_ECDH_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_DSS_WITH_AES_128_CBC_SHA, TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, TLS_RSA_WITH_AES_128_GCM_SHA256, TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256, TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256, TLS_DHE_RSA_WITH_AES_128_GCM_SHA256, TLS_DHE_DSS_WITH_AES_128_GCM_SHA256, TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA, TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA, SSL_RSA_WITH_3DES_EDE_CBC_SHA, TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA, TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA, SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA, SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA, TLS_ECDHE_ECDSA_WITH_RC4_128_SHA, TLS_ECDHE_RSA_WITH_RC4_128_SHA, SSL_RSA_WITH_RC4_128_SHA, TLS_ECDH_ECDSA_WITH_RC4_128_SHA, TLS_ECDH_RSA_WITH_RC4_128_SHA, SSL_RSA_WITH_RC4_128_MD5, TLS_EMPTY_RENEGOTIATION_INFO_SCSV]
21:30:06.669 [main] DEBUG o.a.h.c.s.SSLConnectionSocketFactory - Starting handshake
21:30:07.291 [main] DEBUG o.a.h.c.s.SSLConnectionSocketFactory - Secure session established
21:30:07.291 [main] DEBUG o.a.h.c.s.SSLConnectionSocketFactory -  negotiated protocol: TLSv1.2
21:30:07.292 [main] DEBUG o.a.h.c.s.SSLConnectionSocketFactory -  negotiated cipher suite: TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA
21:30:07.292 [main] DEBUG o.a.h.c.s.SSLConnectionSocketFactory -  peer principal: CN=api.sandbox.paypal.com, OU=PayPal Production, O="PayPal, Inc.", L=San Jose, ST=California, C=US
21:30:07.292 [main] DEBUG o.a.h.c.s.SSLConnectionSocketFactory -  peer alternative names: [api.sandbox.paypal.com]
21:30:07.293 [main] DEBUG o.a.h.c.s.SSLConnectionSocketFactory -  issuer principal: CN=VeriSign Class 3 Secure Server CA - G3, OU=Terms of use at https://www.verisign.com/rpa (c)10, OU=VeriSign Trust Network, O="VeriSign, Inc.", C=US
21:30:07.306 [main] DEBUG o.a.h.i.c.DefaultHttpClientConnectionOperator - Connection established 192.168.178.22:45213<->173.0.82.78:443
21:30:07.306 [main] DEBUG o.a.h.impl.execchain.MainClientExec - Executing request POST /v1/payments/payment HTTP/1.1
21:30:07.306 [main] DEBUG o.a.h.impl.execchain.MainClientExec - Proxy auth state: UNCHALLENGED
21:30:07.310 [main] DEBUG org.apache.http.headers - http-outgoing-0 >> POST /v1/payments/payment HTTP/1.1
21:30:07.310 [main] DEBUG org.apache.http.headers - http-outgoing-0 >> Content-Type: application/json
21:30:07.310 [main] DEBUG org.apache.http.headers - http-outgoing-0 >> Authorization: Bearer A015TlBaYzfyFSUt9rVin-Lnltn6JuQLA968RyGGC8h.Zds
21:30:07.310 [main] DEBUG org.apache.http.headers - http-outgoing-0 >> Content-Length: 254
21:30:07.311 [main] DEBUG org.apache.http.headers - http-outgoing-0 >> Host: api.sandbox.paypal.com
21:30:07.311 [main] DEBUG org.apache.http.headers - http-outgoing-0 >> Connection: Keep-Alive
21:30:07.311 [main] DEBUG org.apache.http.headers - http-outgoing-0 >> User-Agent: Apache-HttpClient/4.5 (Java/1.8.0_25)
21:30:07.311 [main] DEBUG org.apache.http.headers - http-outgoing-0 >> Accept-Encoding: gzip,deflate
21:30:07.311 [main] DEBUG org.apache.http.wire - http-outgoing-0 >> "POST /v1/payments/payment HTTP/1.1[\r][\n]"
21:30:07.311 [main] DEBUG org.apache.http.wire - http-outgoing-0 >> "Content-Type: application/json[\r][\n]"
21:30:07.311 [main] DEBUG org.apache.http.wire - http-outgoing-0 >> "Authorization: Bearer A015TlBaYzfyFSUt9rVin-Lnltn6JuQLA968RyGGC8h.Zds[\r][\n]"
21:30:07.311 [main] DEBUG org.apache.http.wire - http-outgoing-0 >> "Content-Length: 254[\r][\n]"
21:30:07.311 [main] DEBUG org.apache.http.wire - http-outgoing-0 >> "Host: api.sandbox.paypal.com[\r][\n]"
21:30:07.311 [main] DEBUG org.apache.http.wire - http-outgoing-0 >> "Connection: Keep-Alive[\r][\n]"
21:30:07.311 [main] DEBUG org.apache.http.wire - http-outgoing-0 >> "User-Agent: Apache-HttpClient/4.5 (Java/1.8.0_25)[\r][\n]"
21:30:07.311 [main] DEBUG org.apache.http.wire - http-outgoing-0 >> "Accept-Encoding: gzip,deflate[\r][\n]"
21:30:07.311 [main] DEBUG org.apache.http.wire - http-outgoing-0 >> "[\r][\n]"
21:30:07.312 [main] DEBUG org.apache.http.wire - http-outgoing-0 >> "{ "intent":"sale","redirect_urls":{ "return_url":"http://example.com/your_redirect_url.html", "cancel_url ":"http://example.com/your_cancel_url.html" }, "payer":{"payment_method":"paypal"},"transactions":[{ "amount":{ "total":"7.47", "currency":"USD"}}]}"
21:30:07.663 [main] DEBUG org.apache.http.wire - http-outgoing-0 << "HTTP/1.1 400 Bad Request[\r][\n]"
21:30:07.664 [main] DEBUG org.apache.http.wire - http-outgoing-0 << "Date: Wed, 29 Jul 2015 19:30:07 GMT[\r][\n]"
21:30:07.664 [main] DEBUG org.apache.http.wire - http-outgoing-0 << "Server: Apache[\r][\n]"
21:30:07.664 [main] DEBUG org.apache.http.wire - http-outgoing-0 << "PROXY_SERVER_INFO: host=slcsbplatformapiserv3001.slc.paypal.com;threadId=205[\r][\n]"
21:30:07.664 [main] DEBUG org.apache.http.wire - http-outgoing-0 << "Paypal-Debug-Id: 3780624b824ed[\r][\n]"
21:30:07.664 [main] DEBUG org.apache.http.wire - http-outgoing-0 << "CORRELATION-ID: 3780624b824ed[\r][\n]"
21:30:07.664 [main] DEBUG org.apache.http.wire - http-outgoing-0 << "Content-Language: *[\r][\n]"
21:30:07.664 [main] DEBUG org.apache.http.wire - http-outgoing-0 << "Connection: close[\r][\n]"
21:30:07.664 [main] DEBUG org.apache.http.wire - http-outgoing-0 << "Connection: close[\r][\n]"
21:30:07.664 [main] DEBUG org.apache.http.wire - http-outgoing-0 << "Content-Length: 404[\r][\n]"
21:30:07.664 [main] DEBUG org.apache.http.wire - http-outgoing-0 << "Set-Cookie: X-PP-SILOVER=name%3DSANDBOX3.API.1%26silo_version%3D880%26app%3Dplatformapiserv%26TIME%3D3207182677; domain=.paypal.com; path=/; Secure; HttpOnly[\r][\n]"
21:30:07.664 [main] DEBUG org.apache.http.wire - http-outgoing-0 << "Set-Cookie: X-PP-SILOVER=; Expires=Thu, 01 Jan 1970 00:00:01 GMT[\r][\n]"
21:30:07.664 [main] DEBUG org.apache.http.wire - http-outgoing-0 << "Vary: Authorization[\r][\n]"
21:30:07.664 [main] DEBUG org.apache.http.wire - http-outgoing-0 << "Content-Type: application/json[\r][\n]"
21:30:07.664 [main] DEBUG org.apache.http.wire - http-outgoing-0 << "[\r][\n]"
21:30:07.664 [main] DEBUG org.apache.http.wire - http-outgoing-0 << "{"name":"VALIDATION_ERROR","details":[{"field":"redirect_urls.cancel_url ","issue":"This field name is not defined for this resource type"},{"field":"redirect_urls.cancel_url","issue":"This field required when payment_method is 'paypal'"}],"message":"Invalid request - see details","information_link":"https://developer.paypal.com/webapps/developer/docs/api/#VALIDATION_ERROR","debug_id":"3780624b824ed"}"
21:30:07.669 [main] DEBUG org.apache.http.headers - http-outgoing-0 << HTTP/1.1 400 Bad Request
21:30:07.669 [main] DEBUG org.apache.http.headers - http-outgoing-0 << Date: Wed, 29 Jul 2015 19:30:07 GMT
21:30:07.669 [main] DEBUG org.apache.http.headers - http-outgoing-0 << Server: Apache
21:30:07.669 [main] DEBUG org.apache.http.headers - http-outgoing-0 << PROXY_SERVER_INFO: host=slcsbplatformapiserv3001.slc.paypal.com;threadId=205
21:30:07.669 [main] DEBUG org.apache.http.headers - http-outgoing-0 << Paypal-Debug-Id: 3780624b824ed
21:30:07.669 [main] DEBUG org.apache.http.headers - http-outgoing-0 << CORRELATION-ID: 3780624b824ed
21:30:07.669 [main] DEBUG org.apache.http.headers - http-outgoing-0 << Content-Language: *
21:30:07.669 [main] DEBUG org.apache.http.headers - http-outgoing-0 << Connection: close
21:30:07.669 [main] DEBUG org.apache.http.headers - http-outgoing-0 << Connection: close
21:30:07.669 [main] DEBUG org.apache.http.headers - http-outgoing-0 << Content-Length: 404
21:30:07.669 [main] DEBUG org.apache.http.headers - http-outgoing-0 << Set-Cookie: X-PP-SILOVER=name%3DSANDBOX3.API.1%26silo_version%3D880%26app%3Dplatformapiserv%26TIME%3D3207182677; domain=.paypal.com; path=/; Secure; HttpOnly
21:30:07.669 [main] DEBUG org.apache.http.headers - http-outgoing-0 << Set-Cookie: X-PP-SILOVER=; Expires=Thu, 01 Jan 1970 00:00:01 GMT
21:30:07.669 [main] DEBUG org.apache.http.headers - http-outgoing-0 << Vary: Authorization
21:30:07.669 [main] DEBUG org.apache.http.headers - http-outgoing-0 << Content-Type: application/json
21:30:07.681 [main] DEBUG o.a.h.c.p.ResponseProcessCookies - Cookie accepted [X-PP-SILOVER="name%3DSANDBOX3.API.1%26silo_version%3D880%26app%3Dplatformapiserv%26TIME%3D3207182677", version:0, domain:paypal.com, path:/, expiry:null]
21:30:07.684 [main] WARN  o.a.h.c.p.ResponseProcessCookies - Invalid cookie header: "Set-Cookie: X-PP-SILOVER=; Expires=Thu, 01 Jan 1970 00:00:01 GMT". Invalid 'expires' attribute: Thu, 01 Jan 1970 00:00:01 GMT

If I implement this question with some more info, I see that the given cookie is appended and doesn't replace the one with a missing expiration date. 如果我用更多信息来实现此问题,我会看到给定的cookie会被追加,并且不会用过期日期替换掉该cookie。 Just run: 赶紧跑:

import java.time.Instant;
import java.time.LocalDate;
import java.time.ZoneId;
import java.time.temporal.ChronoUnit;

import java.util.Date;

import org.apache.http.HttpResponse;
import org.apache.http.client.CookieStore;
import org.apache.http.client.HttpClient;
import org.apache.http.client.config.CookieSpecs;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.protocol.HttpClientContext;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.BasicCookieStore;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.cookie.BasicClientCookie;
import org.apache.http.protocol.HTTP;

public class GarrysSolution {

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

        String accessToken = "A-valid-token";
        String jsonString =
            "{ \"intent\":\"sale\",\"redirect_urls\":{ \"return_url\":\"http://example.com/your_redirect_url.html\", \"cancel_url \":\"http://example.com/your_cancel_url.html\" }, \"payer\":{\"payment_method\":\"paypal\"},\"transactions\":[{ \"amount\":{ \"total\":\"7.47\", \"currency\":\"USD\"}}]}";

        BasicCookieStore cookieStore = new BasicCookieStore();
        BasicClientCookie cookie = new BasicClientCookie("JSESSIONID", "1234");
        cookie.setDomain(".paypal.com");
        cookie.setPath("/");

        LocalDate expirationDate = LocalDate.now().plus(100L, ChronoUnit.DAYS);
        Instant instant = Instant.from(expirationDate.atStartOfDay(ZoneId.of("GMT")));
        cookie.setExpiryDate(Date.from(instant));
        cookie.setCreationDate(Date.from(Instant.now()));
        cookieStore.addCookie(cookie);

        RequestConfig globalConfig = RequestConfig.custom().setCookieSpec(CookieSpecs.NETSCAPE).build();        HttpClientContext context = HttpClientContext.create();
        context.setCookieStore(cookieStore);

        HttpClient httpClient = HttpClients.custom().setDefaultRequestConfig(globalConfig)
                                           .setDefaultCookieStore(cookieStore).build();

        HttpPost httpPost = new HttpPost("https://api.sandbox.paypal.com/v1/payments/payment");
        httpPost.setHeader("Content-Type", "application/json");
        httpPost.setHeader("Authorization", "Bearer " + accessToken);

        StringEntity entity = new StringEntity(jsonString, HTTP.UTF_8);
        entity.setContentType("application/json");
        httpPost.setEntity(entity);
        try {
            HttpResponse httpResponse = httpClient.execute(httpPost, context);

            System.out.println("\n\n" + context.getCookieStore().getCookies());

            System.out.println("\n\n" + httpResponse.getStatusLine().getStatusCode() + "/"
                    + httpResponse.getStatusLine().getReasonPhrase());
        } catch (Exception e) {
            System.err.println(e.getMessage());
        }

    }

}

and we see the following cookies from the context: 我们从上下文中看到以下cookie:

[[version: 0][name: JSESSIONID][value: 1234][domain: .paypal.com][path: /][expiry: Fri Nov 06 01:00:00 CET 2015], [version: 0][name: X-PP-SILOVER][value: name%3DSANDBOX3.API.1%26silo_version%3D880%26app%3Dplatformapiserv%26TIME%3D2370156885][domain: .paypal.com][path: /][expiry: null]]

So I guess that the problem can be solved by setting the expiration date to the proper cookie 所以我想可以通过将有效期设置为适当的cookie来解决问题

The code is swallowing the exception (in the try block with no catch) that is being thrown to indicate an HTTP error 401 (unauthorized) is occurring. 该代码吞没了异常(在try块中没有捕获),该异常被抛出以指示正在发生HTTP错误401(未经授权)。 This is probably due to an invalid access token. 这可能是由于无效的访问令牌造成的。 The code then tries to read the HTTP response, and that fails (since there is no response due to the 401 error) and throws the exception which is being printed to the screen. 然后,代码尝试读取HTTP响应,但失败了(由于401错误导致没有响应),并抛出了正在打印到屏幕上的异常。

Is it possible the access token had expired by the time you got your code set up? 在您设置代码时,访问令牌是否可能已过期?

I got the following code (below) to work successfully with PayPal with a valid access token. 我获得了以下代码(如下),可以使用有效的访问令牌成功使用PayPal。 There are some slight differences from your code (no separate methods; using HttpsURLConnection rather than HttpUrlConnection; removed some un-needed headers; etc.), but none of these changes made it work alone - they just tightened it up a bit and ensured it printed a proper error message when something went wrong. 与您的代码有一些细微的区别(没有单独的方法;使用HttpsURLConnection而不是HttpUrlConnection;删除了一些不需要的标头;等等),但是这些更改都没有使它单独工作-他们只是将其收紧并确保了它出现问题时会打印正确的错误消息。 Then once I supplied a valid access token it worked successfully. 然后,一旦我提供了有效的访问令牌,它便可以成功运行。 I imagine you are aware that the angle brackets < > around the access token must be removed, or you would never have gotten the curl approach to work. 我想您已经知道必须删除访问令牌周围的尖括号< > ,否则您将永远无法使用curl方法。

Also, keep in mind this is just example code - production code should move the close statements into finally blocks, or go back to the try-with-resources approach you had initially. 另外,请记住,这只是示例代码-生产代码应将close语句移到finally块中,或者返回到最初使用的try-with-resources方法。

import java.io.BufferedReader; 
import java.io.InputStreamReader;
import java.io.DataOutputStream; 
import java.net.URL;             
import javax.net.ssl.HttpsURLConnection;

public class TestHttpsPost {

    public static void main(String[] args) throws Exception {

        // Uncomment one of these next two lines:
        URL url = new URL("https://api.sandbox.paypal.com/v1/payments/payment");
        //URL url = new URL("https://httpbin.org/post"); // good for testing

        HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
        connection.setRequestMethod("POST");
        connection.setDoInput(true);
        connection.setDoOutput(true);

        // Change this to a valid token:
        connection.setRequestProperty("Authorization", "Bearer <Access-Token>");
        connection.setRequestProperty("Content-Type", "application/json");
        String jsonData = "{ \"intent\":\"sale\",  \"redirect_urls\":{        \"return_url\":\"http://example.com/your_redirect_url.html\",    \"cancel_url    \":\"http://example.com/your_cancel_url.html\" }, \"payer\":{    \"payment_method\":\"paypal\"  },  \"transactions\":[    {          \"amount\":{        \"total\":\"7.47\",        \"currency\":\"USD\"}}]}";

        try {
            // Post the data:
            DataOutputStream output = new DataOutputStream(connection.getOutputStream());
            output.writeBytes(jsonData);
            output.close();

            // Read the response:
            BufferedReader reader = new BufferedReader(new InputStreamReader(
              connection.getInputStream()));
            String line;
            while ((line = reader.readLine()) != null) {
                System.out.println(line);
            }
            reader.close();
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }

        System.out.println("Response code:" + connection.getResponseCode());
        System.out.println("Response message:" + connection.getResponseMessage());
    }
}

You might want to try Apache HTTPClient like below: 您可能想要尝试使用Apache HTTPClient,如下所示:

BasicCookieStore cookieStore = new BasicCookieStore();
BasicClientCookie cookie = new BasicClientCookie("JSESSIONID", "1234");
cookie.setDomain(".paypal.com");
cookie.setPath("/");
cookieStore.addCookie(cookie);

String accessToken = "your_access_token";
String jsonString = "{ \"intent\":\"sale\",\"redirect_urls\":{ \"return_url\":\"http://example.com/your_redirect_url.html\", \"cancel_url \":\"http://example.com/your_cancel_url.html\" }, \"payer\":{\"payment_method\":\"paypal\"},\"transactions\":[{ \"amount\":{ \"total\":\"7.47\", \"currency\":\"USD\"}}]}";
HttpClient httpClient = HttpClientBuilder.create().setDefaultCookieStore(cookieStore).build();
HttpPost httpPost = new HttpPost("https://api.sandbox.paypal.com/v1/payments/payment");
httpPost.setHeader("Content-Type", "application/json");
httpPost.setHeader("Authorization", "Bearer " + accessToken);
StringEntity entity = new StringEntity(jsonString, HTTP.UTF_8);
entity.setContentType("application/json");
httpPost.setEntity(entity);
try {
    HttpResponse httpResponse = httpClient.execute(httpPost);
    System.out.println(httpResponse.getStatusLine().getStatusCode() + "/" + httpResponse.getStatusLine().getReasonPhrase());
} catch (Exception e) {
    System.err.println(e.getMessage());
}

I just repaste the Kevin's code after removing all the spaces under the "JsonData" variable and replacing the real token and it works fine . 在删除“ JsonData”变量下的所有空格并替换了实际令牌之后,我只是重新修改了Kevin的代码,它可以正常工作。

import java.io.BufferedReader; 
import java.io.InputStreamReader;
import java.io.DataOutputStream; 
import java.net.URL;             
import javax.net.ssl.HttpsURLConnection;

public class TestHttpsPost {

    public static void main(String[] args) throws Exception {

        // Uncomment one of these next two lines:
        URL url = new URL("https://api.sandbox.paypal.com/v1/payments/payment");
        //URL url = new URL("https://httpbin.org/post"); // good for testing

        HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
        connection.setRequestMethod("POST");
        connection.setDoInput(true);
        connection.setDoOutput(true);

        // Change this to a valid token:
        connection.setRequestProperty("Authorization", "Bearer A015mK--1cz4kfmrLwEuxE9VgHIh9IwEqNvUvdlqMAByvjI");
        connection.setRequestProperty("Content-Type", "application/json");
        String jsonData = "{ \"intent\":\"sale\",\"redirect_urls\":{\"return_url\":\"http://example.com/your_redirect_url.html\",\"cancel_url\":\"http://example.com/your_cancel_url.html\"},\"payer\":{\"payment_method\":\"paypal\"},\"transactions\":[{\"amount\":{\"total\":\"7.47\",\"currency\":\"USD\"}}]}";

        try {
            // Post the data:
            DataOutputStream output = new DataOutputStream(connection.getOutputStream());
            output.writeBytes(jsonData);
            output.close();

            // Read the response:
            BufferedReader reader = new BufferedReader(new InputStreamReader(
              connection.getInputStream()));
            String line;
            while ((line = reader.readLine()) != null) {
                System.out.println(line);
            }
            reader.close();
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }

        System.out.println("Response code:" + connection.getResponseCode());
        System.out.println("Response message:" + connection.getResponseMessage());
    }
}

OUTPUT 输出值

C:\Users\Desktop\Java>java TestHttpsPost
{"id":"PAY-0SM99950896487827KW4ZAZA","create_time":"2015-07-30T02:48:04Z","updat
e_time":"2015-07-30T02:48:04Z","state":"created","intent":"sale","payer":{"payme
nt_method":"paypal","payer_info":{"shipping_address":{}}},"transactions":[{"amou
nt":{"total":"7.47","currency":"USD","details":{"subtotal":"7.47"}},"related_res
ources":[]}],"links":[{"href":"https://api.sandbox.paypal.com/v1/payments/paymen
t/PAY-0SM99950896487827KW4ZAZA","rel":"self","method":"GET"},{"href":"https://ww
w.sandbox.paypal.com/cgi-bin/webscr?cmd=_express-checkout&token=EC-8F164253W5887
9412","rel":"approval_url","method":"REDIRECT"},{"href":"https://api.sandbox.pay
pal.com/v1/payments/payment/PAY-0SM99950896487827KW4ZAZA/execute","rel":"execute
","method":"POST"}]}
Response code:201
Response message:Created

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM