终端研发部androidAndroid开发

Android集成支付宝,H5支付页面点击无反应

2018-04-21  本文已影响246人  junjunxx

前段时间项目需求,集成了支付宝手机支付功能,集成过程中一切顺利,禁不住感叹大厂提供的东西就是给力。然而今天测试拿手机过来,跟我说手机未安装支付宝的时候,使用H5支付某些按钮点击无效。然后我去看了一下,还真是,但是奇怪的是部分手机没有问题,小部分手机出现了这个情况,同样一套代码,怎么会有两种区别这么大的结果。第一反应是想是不是支付宝的包出问题了,然后就去支付宝论坛查阅,并没用招到解决的方案。

配图.png

操作如上图所示,

情况1:当点击返回按钮时,会有个确认退出的提示框,测试点击"否"是有效的,但是点击"是",则没用一点相应。

情况2:当输入手机号结束后,点击下一步,也是任何相应都没有。

最后,我联系上了支付宝的技术支持工程师,加了钉钉来一起解决问题,当时,他给我抛了这样一个链接https://tech.open.alipay.com/support/knowledge/index.htm?knowledgeId=201602156692&categoryId=24120#/?_k=p616ot,链接中给出了两个方案,如下

方案.png

问题描述与我当前碰到的情况相当吻合,我立即尝试了第一种方案,但是并没有效果。比较失望的否定了方案一,然后看了下方案二,要调用一个webview的方法,当时第一反应是比较懵逼的,明明调用的是支付宝的H5Activity,WebView对象再那页面里,我如何去拿到这个WebView的实例呢?难道要集成支付宝提供的H5Activity去做相关的操作嘛?但是这样操作的话,AndroidManifest.xml文件中的Activity配置就会对应不上啊。就在万分纠结的时候,我重新阅读了方案二,一句话敲醒了我,

pauseTimers是一个全局方法

全局方法说明是任何WebView实例去调用都能生效的,那等于说我随便创建一个WebView对象调用一下resumeTimers方法即可?没错,就是这么简单,

WebView mWebview = new WebView(getApplicationContext());
mWebview.resumeTimers();    // 重点代码
mWebview.onResume();

// 启动支付宝支付
Runnable payRunnable = new Runnable() {
    @Override
    public void run() {
    PayTask alipay = new PayTask(PayActivity.this);
    Map<String, String> result = alipay.payV2(orderInfo,true);

    Message msg = new Message();
    msg.what = SDK_PAY_FLAG;
    msg.obj = result;
    mHandler.sendMessage(msg);
    }
};
// 必须异步调用
Thread payThread = new Thread(payRunnable);
payThread.start();

出现这个问题的原因是因为我的项目中用到了Activity中使用WebView 的情况,然后我对这样的用法进行了封装,当Activity中有WebView的时候,我会在Activity生命周期的onResume/onPause中对webview对象做相应的启动/暂停操作,提高app执行性能。代码如下

@Override
protected void onResume() {
    super.onResume();
    if(mWebView != null){
        mWebView.resumeTimers();
        mWebView.onResume();
    }
}

@Override
protected void onPause() {
    super.onPause();
    if(mWebView != null){
        mWebView.onPause();
        mWebView.pauseTimers();
    }
}

离开这样的Activity的时候会调用WebView的pauseTimers方法,导致全局生效,因此使得支付宝H5支付页面的js无法正常加载运行。

上一篇 下一篇

猜你喜欢

热点阅读