2017-09-18 2 views
0

Ich benutze Payfort sdk für Online-Zahlungen mit meiner Anwendung, alles ist voll integriert und funktioniert gut, wenn Sie zur Zahlung kommen, kann ich die Zahlung mit normalen Karten ohne irgendwelche Bedenken tun, aber mit 3-D Secure Cards Ich muss ein Passwort für die Verifikation eingeben, daher öffnet sich ein (verifiziert von Visa) Webview mit dem Passwort-Feld automatisch mit den erforderlichen Details.Payfort mit 3-D Secure Kreditkarten

Das Problem hier ist, wenn das Passwort Feld tippen es den Fokus bekommen, aber die Tastatur öffnet sich nicht, um das Passwort zu schreiben, die Webansicht, die geöffnet ist, ist keine Ansicht von meiner Anwendung und ich habe keine Kontrolle über sie aber schließend.

Ich weiß nicht einmal, wie ich herausfinden kann, dass es jetzt geöffnet ist, da ich keine entsprechenden Rückrufe erhalte.

enter image description here

Durch Code Payfort Navigation, entdeckte ich sie mit einem Layout ein AlertDialog Ausgabe eines webView enthält, die die Bestätigungsseite Link führt angezeigt werden:

private Dialog showVerificationDialog(Context context, String url, VerificationDialogDismissListener onDialogListener) { 
    LayoutInflater layoutInflater = LayoutInflater.from(context); // context here is MyActivity context 
    View view = layoutInflater.inflate(R.layout.web_dialog, null); 
    DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics(); 

    // just to display the Dialog at 80% of the screen 
    view.setMinimumHeight((int) (displayMetrics.heightPixels * 0.8f)); 
    view.setMinimumWidth((int) (displayMetrics.widthPixels * 0.8f)); 

    // setting the webView 
    WebView webView = (WebView) view.findViewById(R.id.webView); 
    webView.setWebViewClient(new WebViewClient()); 
    webView.getSettings().setJavaScriptEnabled(true); 
    webView.loadUrl(url); 

    // setting the Dialog 
    AlertDialog.Builder builder = new AlertDialog.Builder(context) 
      .setView(view) 
      .setOnCancelListener(onDialogListener); 
    if (Build.VERSION.SDK_INT >= 17) { 
     builder.setOnDismissListener(onDialogListener); 
    } 
    Dialog dialog = builder.create(); 
    dialog.show(); 

    return dialog; 
} 

für das Dieser Dialog enthält die webView Überprüfungsprozess, daher ist das Problem dort, aber ich kann keine Probleme mit diesem Code finden, alles ist Link direkt.

Antwort

0

entdeckte schließlich das Problem, es ist ein Bug in einem Payfort-Layout genannt R.layout.web_dialog, die eine Webansicht durch das Verfahren zugegriffen werden muss showVerificationDialog() innerhalb payfort Start Klasse.

Das Problem ist, dass das Layout R.layout.web_dialog kann den Fokus nicht nehmen, wie das Layout nur die webView enthält und es gibt nichts anderes, das den Fokus auf das Layout geben kann, so dass es in der Lage sein würde, das KB (have a look here) zu initiieren und wie in der vorherigen Frage Link angegeben ist es ein bekannter Android Bug.

Also, um dieses Problem zu lösen, musste ich kopieren & fügen Sie die gesamte Start-Klasse und Zugriff Payfort von der neuen kopierten Version direkt nach dem Anwenden von Änderungen an showVerificationDialog() Methode. Und bezüglich der Änderungen, die helfen würden, dieses Problem zu überwinden, schauen Sie sich this answer an (was in meinem Fall nicht funktioniert), oder Sie können einfach ein neues webView Layout bereitstellen, das einen Dummy & versteckt EditText wie in my answer gleichzeitig angezeigt enthält Frage Link, aufblasen Dann wird Ihr neues Layout anstelle des Standard eines initiiert von Payfort bei showVerificationDialog() Methode:

private Dialog showVerificationDialog(Context context, String url, PayfortStarter.VerificationDialogDismissListener onDialogListener) { 
    isVerifying = true; 
    isOTP = true; 
    LayoutInflater layoutInflater = LayoutInflater.from(context); 
    View view = layoutInflater.inflate(R.layout.webview_dialog, null); 
    DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics(); 
    view.setMinimumHeight((int) (displayMetrics.heightPixels * WEB_VIEW_SCREEN_PERCENTS)); 
    view.setMinimumWidth((int) (displayMetrics.widthPixels * WEB_VIEW_SCREEN_PERCENTS)); 

    WebView webView = (WebView) view.findViewById(R.id.webView); 
    webView.setWebViewClient(new WebViewClient()); 
    webView.getSettings().setJavaScriptEnabled(true); 
    webView.loadUrl(url); 

    AlertDialog.Builder builder = new AlertDialog.Builder(context) 
      .setView(view) 
      .setOnCancelListener(onDialogListener); 
    if (Build.VERSION.SDK_INT >= 17) { 
     builder.setOnDismissListener(onDialogListener); 
    } 
    Dialog dialog = builder.create(); 
    dialog.show(); 

    return dialog; 
} 

webview_dialog.xml:

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <EditText 
     android:id="@+id/kb_holder" 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     android:inputType="text" 
     android:maxLines="1" 
     android:visibility="gone" /> 

    <WebView 
     android:id="@+id/webView" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 

</FrameLayout>