2016-02-18 4 views
0

Песочница Paypal была обновлена ​​для использования TLS 1.2 (https://devblog.paypal.com/upcoming-security-changes-notice/#tls). Без каких-либо изменений в моем конце, я видел ошибку «handshake_failure».Paypal Sandbox Обновление TLS (400) Неверный запрос

Я обновил библиотеку JAVA, которую мы используем, как предложено в https://github.com/paypal/TLS-update#paypal-java-sdk-support. Я использую устаревшую версию 1.x.

Однако PayPal выбрасывает PayPalException.

[com.paypal.sdk.exceptions.TransactionException] (http-localhost/127.0.0.1:8082-7) (400)Bad Request: 

В дополнение к обновлению paypal_base.jar (мыло), я также использовать параметр VM "-Dhttps.protocols = TLSv1.1, TLSv1.2", но это не имеет никакого значения.

PayPal конечных точек я использую

https://www.sandbox.paypal.com/cgi-bin/webscr?cmd=_express-checkout&useraction=commit&token= 

Я попытался с помощью конечной точки API Подпись -> SOAP -> Песочница, как это предусмотрено в https://developer.paypal.com/docs/classic/api/endpoints/, но без успеха.

Любые предложения о том, что еще должно произойти?

UPDATE

Я побежал тестовое приложение, предоставленные им (TlsCheck.java/банка) и ниже результат

java "-Dhttps.protocols=TLSv1.1,TLSv1.2" -jar TlsCheck.jar 
this client supports TLS 1.2 
Failed to connect to TLS 1.2 endpoint 

Доступ к конечной точке tlstest.paypal.com в браузере возвращает «400 Bad Request». Изменение конечной точки на https://tlstest.paypal.com возвращает «PayPal_Connection_OK», как ожидалось.

Я также сделал копию TlsCheck.java (используя его по умолчанию конечной точки tlstest.paypal.com) и побежал через мой IDE который возвратил следующее (хотя он был не в состоянии соединить первоначально)

this client supports TLS 1.2 
Successfully connected to TLS 1.2 endpoint 

Пробовал то же самое с другими конечными точками, как «api-3t.sandbox.paypal.com/2.0/», но он не может подключиться к нему с указанием

Failed to connect to TLS 1.2 endpoint 

Обновление

Выключает мой тест с использованием функции TslCheck.jar, потому что конечная точка, используемая в JAR, была «tlscheck.chargify.com» (недействительна ??), но исходный код (из того же места https://github.com/paypal/TLS-update/tree/master/java) использовал другую конечную точку «tlstest». paypal.com "(действительный).

Update

Несмотря на обновление paypal_base.jar я в настоящее время, видя "Нет службы имени PayPalAPIAA не доступен", который в конечном итоге приводит к 404 Bad Request. Также подтверждено, что я использую HTTP/1.0 в качестве HTTPSender в библиотеке осей, которые мы используем по умолчанию для HTTP/1.1. Я не нашел подходящего способа обойти это. Я попробовал следовать за https://www-10.lotus.com/ldd/pfwiki.nsf/dx/10022008035400PMWEBRCB.htm, чтобы переключиться на HTTP/1.1. Это не сработало в моем случае !!!!

+0

Не Java-разработчик, так что это может показаться глупым - вы _explicitly_ заставляете соединение использовать TLS 1.2 (только)? Это было изменение, которое я должен был сделать в .Net (клиент может поддерживать больше протоколов, 1.1 и 1.2, но должен использовать _only_ 1.2 при совершении звонков в Paypal). Hth .... – EdSF

+0

Я все равно получаю тот же результат с их тестовым приложением, когда явным образом устанавливаю протокол на TLSv1.2 (java -Dhttps.protocols = TLSv1.2 -jar TlsCheck.jar). – Andy

ответ

0

Это работает для получения сертификата TLS 1.2 нового SHA 256.

*) Скачайте paypal_cert.pem из учетной записи sandbox paypal -> продавцы, продающие инструменты-> apiaccess. *) Запустите openssl pkcs12 -export -in cert_key_pem.TXT -inkey cert_key_pem.txt -out paypal_cert.p12

общественного HashMap HTTPCall (String имяМетода, String nvpRequestStr) {

String version = "2.3"; 
    String agent = "Mozilla/4.0"; 
    String respText = ""; 
    HashMap nvp = null; 

    String encodedData = "METHOD=" + methodName + "&VERSION=" + gv_Version + "&PWD=" + gv_APIPassword + "&USER=" + gv_APIUserName + nvpRequestStr; 

    try 
    { 

      KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType()); 
      KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance("SunX509"); 
      KeyStore keyStore = KeyStore.getInstance("PKCS12"); 

      InputStream keyInput = new FileInputStream("/Users/Downloads/paypal_cert.p12"); 
      keyStore.load(keyInput, "changeit".toCharArray()); 
      keyInput.close(); 
      keyManagerFactory.init(keyStore, "changeit".toCharArray()); 

      SSLContext context = SSLContext.getInstance("TLSV1.2"); 
      context.init(keyManagerFactory.getKeyManagers(), null, new SecureRandom()); 

      URL url = new URL(gv_APIEndpoint); 
      HttpsURLConnection conn=(HttpsURLConnection)url.openConnection(); 
      conn.setSSLSocketFactory(context.getSocketFactory()); 
      conn.setDoInput(true); 
      conn.setDoOutput(true); 
      conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); 
      conn.setRequestProperty("Content-Length", String.valueOf(encodedData.length())); 
      conn.setRequestMethod("POST"); 

      DataOutputStream output = new DataOutputStream(conn.getOutputStream()); 
      output.writeBytes(encodedData); 
      output.flush(); 
      output.close(); 

      // Read input from the input stream. 
      DataInputStream in = new DataInputStream (conn.getInputStream()); 
      int rc = conn.getResponseCode(); 
      if (rc != -1) 
      { 
       BufferedReader is = new BufferedReader(new InputStreamReader(conn.getInputStream())); 
       String _line = null; 
       while(((_line = is.readLine()) !=null)) 
       { 
        respText = respText + _line; 
       } 
       nvp = deformatNVP(respText); 
      } 
      return nvp; 
    } catch (NoSuchAlgorithmException e) {e.printStackTrace(); return null; 
    } catch (UnknownHostException e) {e.printStackTrace(); return null; 
    } catch (IOException e) {e.printStackTrace(); return null; 
    } catch (KeyManagementException e) {e.printStackTrace(); return null; 
    } catch (UnrecoverableKeyException e) {e.printStackTrace(); return null; 
    } catch (CertificateException e) {e.printStackTrace(); return null; 
    } catch (KeyStoreException e) {e.printStackTrace(); return null;} 
} 


public HashMap deformatNVP(String pPayload) 
{ 
    HashMap nvp = new HashMap(); 
    StringTokenizer stTok = new StringTokenizer(pPayload, "&"); 
    while (stTok.hasMoreTokens()) 
    { 
     StringTokenizer stInternalTokenizer = new StringTokenizer(stTok.nextToken(), "="); 
     if (stInternalTokenizer.countTokens() == 2) 
     { 
      String key = URLDecoder.decode(stInternalTokenizer.nextToken()); 
      String value = URLDecoder.decode(stInternalTokenizer.nextToken()); 
      nvp.put(key.toUpperCase(), value); 
     } 
    } 
    return nvp; 
} 
+0

Спасибо. Мы используем CallerServices из paypal_base.jar для связи с PayPal. Я надеюсь, что мне не нужно идти на эту длину, чтобы решить эту проблему :) – Andy

0

Я решить это путем простого обновления библиотеки использовать merchantsdk-2.14. 117.jar, paypal-core-1.7.0.jar & permissionsskd-2.4.109.jar. Библиотека, которую мы использовали, была довольно старой, и вызовы API были обновлены с использованием новой библиотеки, но изменения были довольно очевидными, несмотря на изменения имени пакета (com.paypal.soap.api до urn.ebay.api) , Поскольку HTTP-запросы выполнялись библиотекой, нам больше не нужно было беспокоиться о HTTP/1.1.

Я был в состоянии проверить & проверить это в среде песочницы PayPal.

Смежные вопросы