2017-04-25 3 views
0

로 마감했다.Okhttp (자), javax.net.ssl.SSLException : 그것은 좋은 일, 나는 우체부 입어 <a href="https://test-api.pin.net.au/1/cards/" rel="nofollow noreferrer">https://test-api.pin.net.au/1/cards/</a></p> <p>: 연결 내가 핀 결제 API를 호출 피어

내가 okhttp와 코드를 안드로이드에 적용 2.7.5

내 코드 :

OkHttpClient 세션 객체 = 새 OkHttpClient();

RequestBody requestBody = new FormEncodingBuilder() 
      .add("publishable_api_key", BuildConfig.PIN_PAYMENT_PUBLISHABLE_KEY) 
      .add("number", scanResult.cardNumber) 
      .add("expiry_month", scanResult.expiryMonth+"") 
      .add("expiry_year", scanResult.expiryYear+"") 
      .add("cvc", scanResult.cvv) 
      .add("address_postcode", scanResult.postalCode) 
      .add("name", name).build(); 


    Request request = new Request.Builder() 
      .url(BuildConfig.BASE_URL_PIN_PAYMENT + Constants.API_CARD_PIN_PAYMENT) 
      .post(requestBody) 
      .build(); 

    httpClient.newCall(request).enqueue(new Callback() { 
     @Override 
     public void onFailure(Request request, IOException e) { 
      view.hideLoading(); 
      view.showError(e.getMessage()); 
     } 

     @Override 
     public void onResponse(Response response) throws IOException { 
      view.hideLoading(); 
      if (!response.isSuccessful()){ 
       String body = "Something went wrong.Please try again later."; 
       try { 
        JSONObject object = new JSONObject(response.body().string()); 
        body = object.getString("error_description"); 
       } catch (JSONException e) { 
        e.printStackTrace(); 
       } 
       view.showError(body); 
      }else { 
       view.hideLoading(); 
       Gson gson = new Gson(); 
       CardPinPaymentResponse paymentResponse = gson.fromJson(response.body().string() , CardPinPaymentResponse.class); 
       view.getTokenCardSuccess(paymentResponse); 
      } 
     } 

    }); 

그러나이 작동하지 문제 : (자), javax.net.ssl.SSLException : 당신이 OKhttp가 버전 및 제공하는 암호 그룹을 TLS를 알 필요가 서버 HTTPS에 연결할 때 피어

답변

0

에 의해 폐쇄 연결. 다음은 https에 연결하는 코드 예입니다.

ConnectionSpec spec = new ConnectionSpec.Builder(ConnectionSpec.MODERN_TLS) 
    .tlsVersions(TlsVersion.TLS_1_2) 
    .cipherSuites(
      CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, 
      CipherSuite.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, 
      CipherSuite.TLS_DHE_RSA_WITH_AES_128_GCM_SHA256) 
    .build(); 

OkHttpClient client = new OkHttpClient.Builder() 
    .connectionSpecs(Collections.singletonList(spec)) 
    .build(); 

행운을 빌어 요 !!!

+0

감사합니다. 작동하지만 문제가 없습니다. 허용되는 프로토콜을 찾을 수 없습니다. isFallback = 거짓, 모드 = 연 a (암호화 방식의 = TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, TLS_DHE_RSA_WITH_AES_128_GCM_SHA256] tlsVersions = TLS_1_1] supportsTlsExtensions = TRUE)], 프로토콜 지원 = SSLv3에, TLSv1의] –

+0

이는 단지 예시 코드이다. 귀하의 서버에서 사용중인 TLS 버전을 알고 클라이언트 코드에 –

+0

을 설정하면 동일한 문제가 발생합니다. 또한 TLS 버전의 서버를 사용해 볼 수도 있지만 kitkat에 대한 모든 솔루션을 찾을 수 없습니다. 모든 버전에서 잘 작동합니다. 더 큰 kitkat, 만약 당신이 어떤 해결책을 찾았 으면 알려주세요. –