我正在开发一个应用程序,为了进行一些付款,我需要将用户从我的应用程序重定向到采用表单的Web视图,然后提交该表单,然后在WebView中提示输入密码,然后密码被提交后,我拦截了响应,然后使用响应进行付款。
我已经在配备Android 6及更高版本的设备上进行了此操作,但是在android 5上却遇到了问题。
这是我的代码的一部分。
private static String baseHTML = "<!DOCTYPE html>" +
"<html>" +
"<body onload=\"document.form1.submit()\">"+
"<form name=\"form1\" method=\"post\" action=\"%0\">" +
" <input type=\"hidden\" name=\"PaReq\" value=\"%1\" ><br>" +
" <input type=\"hidden\" name=\"TermUrl\" value=\"%2\" ><br>" +
" <input type=\"hidden\" name=\"MD\" value=\"%3\"><br>" +
" <input type=\"hidden\" value=\"Authenticate\">" +
"</form>" +
"</body>" +
"</html>";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_card3_dsecure);
authWebView = findViewById(R.id.authWebView);
authWebView.getSettings().setJavaScriptEnabled(true);
authWebView.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
authWebView.setWebChromeClient(new WebChromeClient() {
public boolean onConsoleMessage(ConsoleMessage cmsg)
{
// check secret prefix
if (cmsg.message().startsWith("3DSecure"))
{
String msg = cmsg.message().substring(5); // strip off prefix
String jsonResponse = getJsonFromHTMLString(msg);
if (jsonResponse != null) {
Intent intent = getIntent();
intent.putExtra("responseJson", jsonResponse);
setResult(RESULT_OK, intent);
finish();
} else {
setResult(RESULT_CANCELED);
finish();
}
return true;
} else {
String msg = cmsg.message();
Log.d("msg", cmsg.message());
}
return false;
}
});
authWebView.setWebViewClient(new WebViewClient() {
@Override
public void onPageFinished (final WebView view, String url) {
if (url.equals(termURL)) {
view.loadUrl("javascript:console.log('3DSecure'+document.documentElement.outerHTML.toString());");
}
}
@Override
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
Log.e("WebView", "Error: " + description);
}
});
Intent intent = getIntent();
Bundle extras = intent.getExtras();
String jsonString = extras.getString("jsonString");
try {
JSONObject jsonObject = new JSONObject(jsonString);
acsURL = jsonObject.getString("acsURL");
termURL = jsonObject.getString("termURL");
paReq = jsonObject.getString("paReq");
md = jsonObject.getString("md");
} catch (JSONException e) {
e.printStackTrace();
}
String bHtml = baseHTML
htmlString = bHtml.replace("%0", acsURL).replace("%1", paReq)
.replace("%2", termURL).replace("%3", md);
}
public void onStart() {
super.onStart();
authWebView.loadData(htmlString, "text/html", "UTF-8");
}
String getJsonFromHTMLString(String html) {
if (html != null && html.length() != 0) {
int startIndex = html.indexOf("{");
int endIndex = html.lastIndexOf("}");
if (startIndex >= 0) {
String json = html.substring(startIndex, endIndex + 1);
return json;
}
}
return null;
}
public class AndroidInterface {
Context mContext;
/** Instantiate the interface and set the context */
AndroidInterface(Context c) {
mContext = c;
}
@JavascriptInterface // must be added for API 17 or higher
public void processHTML(String html) {
Log.w("", html);
String jsonResponse = getJsonFromHTMLString(html);
if (jsonResponse != null) {
Intent intent = getIntent();
intent.putExtra("responseJson", jsonResponse);
setResult(RESULT_OK, intent);
finish();
} else {
setResult(RESULT_CANCELED);
finish();
}
}
}
如代码中所示,我注入到Web视图中的HTML包含隐藏的字段和在执行form1
时加载的正文中名为document.form1.submit()
的表单。
这在Android 6及更高版本中可以使用,但是在android 5上却无法使用,它会提交表单,但不会显示用户输入密码的页面。
知道为什么会这样吗?