Получение SSLException при интеграции с платежным шлюзом

Я просто интегрирую платежный шлюз Frimi. На первом этапе я пытаюсь сгенерировать токены доступа, и после создания токенов будет вызвана ссылка для оплаты. Но я получаю сообщение об ошибке: - SSLException: соединение закрыто одноранговым узлом.

 public  void TokenGenerationProcess() {
        class WaitingforResponse extends AsyncTask<Void, Void, String> {
            ProgressDialog progressDialog;

            @Override
            protected void onPreExecute() {
                super.onPreExecute();
                //  progressDialog = ProgressDialog.show(getActivity().getBaseContext(), "Waiting for Token Generation...", "Please Wait...", false, false);
            }

            @Override
            protected String doInBackground(Void... params) {
                OkHttpClient client = new OkHttpClient.Builder()
                        .connectTimeout(10, TimeUnit.SECONDS)
                        .writeTimeout(10, TimeUnit.SECONDS)
                        .readTimeout(60, TimeUnit.SECONDS)
                        .build();
                MediaType mediaType = MediaType.parse("application/x-www-form-urlencoded");

                String json = "";
                RequestBody body = RequestBody.create(mediaType, json);
               /* https://ideabiz?grant_type=password&username=99R_User&password=99R_User&scope=SANDBOX

                https://igrant_type=refresh_token&refresh_token = "+Message+"&scope=SANDBOX */
                // Message = "d6a5be5f5455c87c21442ba3d5201c8c";
                Request request = new Request.Builder()
                        .url("https://uatapi.nationstrust.com:8243/token?grant_type=client_credentials")

                        .addHeader("content-type", "application/x-www-form-urlencoded")
                        .addHeader("authorization", "Basic N000SDNmU3RtVERuZmZ1R0JNMlBGR1FXdmtFYTpEQUFJcEprVUhjdXBwcEx4dkRPSkFYZjNwMmth")
                        .post(body)
                        .build();
//Bearer aUFVMWFRd2Vpb2txQUI2VTFkajBFZWRkTTBZYTpEMzZfbU9GM2ZlYkFEaWRiMGp0ZUZCN2xGUUlh")


                try {
                    okhttp3.Response response = client.newCall(request).execute();
                    String test = response.body().string();
                    if (response.isSuccessful()) {
                       /* int  success = response.code();

                        Headers responseHeaders = response.headers();
                        for (int i = 0; i < responseHeaders.size(); i++) {

                            System.out.println(responseHeaders.name(i) + ": " + responseHeaders.value(i));
                        }

                        System.out.println(test);
                        ///   {"scope":"default","token_type":"bearer","expires_in":3600,"refresh_token":"2d23c431f25e10e5abcd16bea931d0a","access_token":"b0bffddb2be384c53135cadf0f565c2"}
                        try {
                            JSONObject jsonObject = new JSONObject(test);
                            Log.e(" scope", "" + jsonObject.get("scope"));
                            Log.e(" token_type", "" + jsonObject.get("token_type"));
                            Log.e(" expires_in", "" + jsonObject.get("expires_in"));
                            Log.e(" refresh_token", "" + jsonObject.get("refresh_token"));
                            Log.e(" access_token", "" + jsonObject.get("access_token"));
                            // Message = (String) jsonObject.get("refresh_token");

                            String  access_token = (String) jsonObject.get("access_token");
                            String  refresh_token = (String) jsonObject.get("refresh_token");
                            PersistenceManager.saveRefreshToken(getApplicationContext(), refresh_token);
                            PersistenceManager.saveSessionId(getApplicationContext(), access_token);
                            PersistenceManager.saveTime(getApplicationContext(), String.valueOf(System.currentTimeMillis()));
     */                       // reference= (String) jsonObject.get("Refno");

                    } else {
                        System.out.println(test);
                    }

                } catch (IOException e) {
                    e.printStackTrace();
                }
                return null;
            }

            @Override
            protected void onPostExecute(String s) {
                super.onPostExecute(s);
                // progressDialog.dismiss();
            }


        }
        WaitingforResponse WaitingforResponse = new WaitingforResponse();
        WaitingforResponse.execute();

    }

См. Stacktrace ниже:

Получение SSLException при интеграции с платежным шлюзом

// здесь я разместил полный код того, что пытаюсь создать токены доступа. / пожалуйста, помогите .. помощь будет очень признательна

не могли бы вы показать нам трассировку стека

Dracarys 26.06.2018 13:48

Я только что прикрепил один файл изображения ... независимо от значения, поступающего в logcat

Beginner 26.06.2018 14:06
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
2
80
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы не строите звонок правильно, вы должны это делать именно так.

    OkHttpClient client = new OkHttpClient.Builder()
            .connectTimeout(10, TimeUnit.SECONDS)
            .writeTimeout(10, TimeUnit.SECONDS)
            .readTimeout(60, TimeUnit.SECONDS)
            .build();

    MediaType mediaType = MediaType.parse("application/x-www-form-urlencoded");
    RequestBody body = RequestBody.create(mediaType, "grant_type=client_credentials");
    Request request = new Request.Builder()
            .url("https://uatapi.nationstrust.com:8243/token")
            .post(body)
            .addHeader("content-type", "application/x-www-form-urlencoded")
            .addHeader("authorization", "Basic N000SDNmU3RtVERuZmZ1R0JNMlBGR1FXdmtFYTpEQUFJcEprVUhjdXBwcEx4dkRPSkFYZjNwMmth")
            .build();

    try {
        Response response = client.newCall(request).execute();
        String test = response.body().string();
        if (response.isSuccessful()) {
            System.out.println(test);
        } else {
            System.out.println(response.code() +" : "+ response.message());
        }
    } catch (Exception e) {
        e.printStackTrace();
    }

Ваш ответ JSON будет выглядеть так:

{
"access_token": "7389a302-82f9-3fa9-b7a3-fefa45d2de32",
"scope": "am_application_scope default",
"token_type": "Bearer",
"expires_in": 500
}

Редактировать:

Однако это не объясняет, почему вы получаете исключение ssl. Мне нужно больше информации, чтобы понять это. Какая версия ОС Android - это устройство, на котором вы запускаете приложение. Если у вас Wi-Fi, подумайте об использовании мобильной сети.

Дальнейшее редактирование:

Я вижу, вы используете версию 4.4.2, попробуйте запустить устройство с версией ОС 5.1 и выше. Вы обнаружите, что проблема может исчезнуть. Если это не имеет значения, попробуйте добавить этот код в свой код, убедитесь, что он выполняется перед вызовом.

public static void initializeSSLContext(Context mContext) {
    try {
        SSLContext.getInstance("TLSv1.2");
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    }
    try {
        ProviderInstaller.installIfNeeded(mContext.getApplicationContext());
    } catch (GooglePlayServicesRepairableException e) {
        e.printStackTrace();
    } catch (GooglePlayServicesNotAvailableException e) {
        e.printStackTrace();
    }
}

Если это не помогает, у вас явно проблема с сертификатами ssl вашего сервера. Попробуйте попросить администратора вашего сервера помочь.

Ответ принят как подходящий
//Please use this it will work 
 OkHttpClient client = null;
                try {
                    client = new OkHttpClient.Builder()
                            .connectTimeout(120, TimeUnit.SECONDS)
                            .writeTimeout(120, TimeUnit.SECONDS)
                            .readTimeout(120, TimeUnit.SECONDS)
                            .sslSocketFactory(new Tls12SocketFactory(), provideX509TrustManager())
                            .build();
                } catch (KeyManagementException e) {
                    e.printStackTrace();
                } catch (NoSuchAlgorithmException e) {
                    e.printStackTrace();
                }

//add this method 
  public X509TrustManager provideX509TrustManager() {
        try {
            TrustManagerFactory factory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
            factory.init((KeyStore) null);
            TrustManager[] trustManagers = factory.getTrustManagers();
            return (X509TrustManager) trustManagers[0];
        } catch (NoSuchAlgorithmException | KeyStoreException exception) {
            Log.e(getClass().getSimpleName(), "not trust manager available", exception);
        }

        return null;
    }
//create another java class 

public class Tls12SocketFactory extends SSLSocketFactory {
    private SSLSocketFactory internalSSLSocketFactory;

    public Tls12SocketFactory() throws KeyManagementException, NoSuchAlgorithmException {
        SSLContext context = SSLContext.getInstance("TLS");
        context.init(null, null, null);
        internalSSLSocketFactory = context.getSocketFactory();
    }

    @Override
    public String[] getDefaultCipherSuites() {
        return internalSSLSocketFactory.getDefaultCipherSuites();
    }

    @Override
    public String[] getSupportedCipherSuites() {
        return internalSSLSocketFactory.getSupportedCipherSuites();
    }

    @Override
    public Socket createSocket() throws IOException {
        return enableTLSOnSocket(internalSSLSocketFactory.createSocket());
    }

    @Override
    public Socket createSocket(Socket s, String host, int port, boolean autoClose) throws IOException {
        return enableTLSOnSocket(internalSSLSocketFactory.createSocket(s, host, port, autoClose));
    }

    @Override
    public Socket createSocket(String host, int port) throws IOException, UnknownHostException {
        return enableTLSOnSocket(internalSSLSocketFactory.createSocket(host, port));
    }

    @Override
    public Socket createSocket(String host, int port, InetAddress localHost, int localPort) throws IOException, UnknownHostException {
        return enableTLSOnSocket(internalSSLSocketFactory.createSocket(host, port, localHost, localPort));
    }

    @Override
    public Socket createSocket(InetAddress host, int port) throws IOException {
        return enableTLSOnSocket(internalSSLSocketFactory.createSocket(host, port));
    }

    @Override
    public Socket createSocket(InetAddress address, int port, InetAddress localAddress, int localPort) throws IOException {
        return enableTLSOnSocket(internalSSLSocketFactory.createSocket(address, port, localAddress, localPort));
    }

    private Socket enableTLSOnSocket(Socket socket) {
        if (socket != null && (socket instanceof SSLSocket)) {
            ((SSLSocket)socket).setEnabledProtocols(new String[] {"TLSv1.1", "TLSv1.2"});
        }
        return socket;
    }
}

Другие вопросы по теме