Skip to content

技术问题


解决集成与系统故障的常见技术问题
  1. WebView 无法拉起第三方 App(ERR_UNKNOWN_URL_SCHEME 等)

现象:调用 GoPay / LinePay / AirPay 等跳转时出 ERR_UNKNOWN_URL_SCHEME 或无法打开对应 app。

原因:WebView 未拦截并处理 intent:// 或自定义 scheme。

解决(Android):复写 WebViewClientshouldOverrideUrlLoading,对 intent://、非 http/https scheme 做系统跳转或 fallback。简化示例:

java
@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
    String url = request.getUrl().toString();
    Uri uri = Uri.parse(url);
    if ("intent".equals(uri.getScheme())) {
        try {
            Intent intent = Intent.parseUri(url, Intent.URI_INTENT_SCHEME);
            if (intent.resolveActivity(context.getPackageManager()) != null) {
                context.startActivity(intent);
            } else {
                String fb = intent.getStringExtra("browser_fallback_url");
                if (!TextUtils.isEmpty(fb)) view.loadUrl(fb);
            }
            return true;
        } catch (Exception e) { /* ignore */ }
    }
    if (!"http".equals(uri.getScheme()) && !"https".equals(uri.getScheme())) {
        try { context.startActivity(new Intent(Intent.ACTION_VIEW, uri)); return true; }
        catch (Exception ignored) {}
    }
    return false;
}
  1. 支付成功后返回自己的 APP

要点:在 App 内用内嵌 WebView 打开收银台,确保 frontCallBackUrl 指向你可识别的 scheme 或 deep link;若用外部浏览器打开,需要用 scheme/Universal Link 做回跳。

  1. 异步回调注意事项

    • 回调地址必须可访问且响应 application/json
    • 回调需校验签名并实现幂等处理;
    • 若商户服务器有 IP 白名单,需把 Checus 回调 IP 加入白名单。
  2. 点击“确认支付”后不跳转后续页

原因:未设置或复写 WebViewClient。

修复:如果打开API的容器是Android的WebView,需要对WebView做如下处理

json
mWebView.setWebViewClient(new WebViewClient());
  1. 收银台提示“请求参数格式错误”(金额格式乱码)

原因:使用设备本地 Locale 格式化金额(会出现千分符或不同小数分隔符)。

修复:统一使用英语 locale:String amt = String.format(Locale.ENGLISH, "%.2f", price);

  1. 收银台展示不全或样式混乱(适配问题)

修复建议:确保 meta viewport 与页面响应式支持。

json
mWebView.getSettings().setTextZoom(100);
  1. 软键盘覆盖输入框

排查与修复:

  • 不要用全屏模式;
  • windowSoftInputMode 设为 adjustResize(避免 adjustPan);
  • 若沉浸式状态栏,布局加 fitSystemWindows=true。
  1. URI scheme 自动变小写(APP:// → app://)

原因:浏览器/WebView 规范将 scheme 视为不区分大小写并统一小写。

解决:在 AndroidManifest 中使用小写 scheme 与 host。

  1. 页面报 X-Frame-Options

原因:渠道页面不允许 iframe 嵌套。

解决:不要把该页面嵌入到 iframe,改为直接打开页面。

  1. 推荐的 Android WebView 配置(重要)
java
   WebSettings webSettings = mWebView.getSettings();
   webSettings.setJavaScriptEnabled(true);

   webSettings.setSupportMultipleWindows(true);
   webSettings.setJavaScriptCanOpenWindowsAutomatically(true);

   webSettings.setPluginState(WebSettings.PluginState.ON); //enable plugin. Ex: flash. deprecated on API 18
   //whether the zoom controls display on screen.
   webSettings.setBuiltInZoomControls(true);
   webSettings.setSupportZoom(true);
   webSettings.setDisplayZoomControls(false);

   //disable the webview font size changes according the phone font size.
   webSettings.setTextZoom(100);
   webSettings.setSaveFormData(true);
   webSettings.setUseWideViewPort(true);
   webSettings.setLoadWithOverviewMode(true);
   webSettings.setAllowFileAccess(true);

   if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
       webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
       CookieManager.getInstance().setAcceptThirdPartyCookies(this, true);
   }
   if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
       webSettings.setAllowUniversalAccessFromFileURLs(true);
   }

   webSettings.setAppCacheEnabled(true);
   String appCacheDir = getDir("cache", Context.MODE_PRIVATE).getPath();
   webSettings.setAppCachePath(appCacheDir);
   webSettings.setAppCacheMaxSize(1024*1024*20);
   webSettings.setDomStorageEnabled(true);
   webSettings.setDatabaseEnabled(true);
   webSettings.setCacheMode(WebSettings.LOAD_DEFAULT);

   try {
       mWebView.removeJavascriptInterface("searchBoxJavaBridge_");
       mWebView.removeJavascriptInterface("accessibility");
       mWebView.removeJavascriptInterface("accessibilityTraversal");
   } catch (Exception e) {}

   if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
       mWebView.enableSlowWholeDocumentDraw();
   }
  1. 报错 net::ERR_CACHE_MISS

原因:网络权限或请求流程被阻断。

排查:检查 AndroidManifest 权限与跨域/缓存策略;参见 社区帮助

  1. iOS WKWebView 跳转失败(# 被编码为 %23)

原因:WKWebView 默认对 URL 做编码,导致 # 被编码。

修复:自定义允许字符的编码函数,示例(Swift/ObjC)已给出,确保对 # 保持允许。

json
var charSet = CharacterSet.urlQueryAllowed
charSet.insert(charactersIn: "#")
let enc = urlStr.addingPercentEncoding(withAllowedCharacters: charSet)
  1. Android 9+ (P) 无法打开 http 页面

原因:Android P 默认禁止明文(http)流量。

解决(两种):

  • 优先把页面/接口迁移到 HTTPS;或
  • 使用 network_security_config.xml 打开 cleartext,或在 AndroidManifest 里加 usesCleartextTraffic="true"
  1. 报错:net::ERR_BLOCKED_BY_RESPONSE(被阻止)

原因:页面不允许在 iframe 中打开或响应头拦截。

解决:直接打开该页面,避免 iframe。

基于 MIT 许可发布