Android的HTML5的微信与支付宝的支付

Android的HTML5的微信与支付宝的支付,第1张

Android的H5微信支付 1.演示代码

​ 废话没有好吧 我们直接上代码以下是 .xml 与 .kt文件

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".ui.main.board.MatchBoardFragment">

    <WebView
        android:id="@+id/textMatchBoard"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginStart="8dp"
        android:layout_marginTop="50dp"
        android:layout_marginEnd="8dp"
        android:textAlignment="center">

    </WebView>
    <WebView
        android:id="@+id/web_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginStart="8dp"
        android:layout_marginTop="50dp"
        android:layout_marginEnd="8dp"
        android:textAlignment="center">

    </WebView>

    <com.hjq.bar.TitleBar
        android:id="@+id/title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        />
</FrameLayout>


class UrlActivity : MyActivity<ActivityUrlBinding>() {
    private val profileViewModel: ProfileViewModel by viewModels()
    private var token : String? = null
    var _value : Int = 0
    var _valueName: String? = null

    override fun onKeyDown(keyCode: Int, event: KeyEvent): Boolean {
        if (keyCode == KeyEvent.KEYCODE_BACK  && binding.textMatchBoard.canGoBack()) {
            binding.textMatchBoard.goBack()
            binding.textMatchBoard.removeAllViews()
            return true
        }
        return super.onKeyDown(keyCode, event)
    }

    override fun onBackPressed() {

        if (binding.textMatchBoard.canGoBack()){
            binding.textMatchBoard.goBack()
            binding.textMatchBoard.removeAllViews()
        }else {
            super.onBackPressed()
        }
    }    

    override fun initBind() {
        binding = ActivityUrlBinding.inflate(inflater)

    }
    private  var webview : WebView? = null
    @SuppressLint("SetJavaScriptEnabled", "LogNotTimber")
    override fun initView() {
    	/**
    	*
    	* Intent传值与if判断可以直接忽略
    	* */
        val _intent = intent;
        //从Intent当中根据key取得value
        if (_intent != null) {
            _value = _intent.getIntExtra("赛事Id",0);
            _valueName = _intent.getStringExtra("赛事Name")
        }
        if (_value == 0){
            return
        }
        webview = binding.webView
        webview?.settings?.javaScriptEnabled = true
        webview?.settings?.domStorageEnabled = true
        webview?.webChromeClient = WebChromeClient()
        //该方法支持支付宝和微信支付
        webview?.setWebViewClient(object : WebViewClient() {
            override fun shouldOverrideUrlLoading(view: WebView?, url: String?): Boolean 			{
             
                if (url?.startsWith("http:") == true || url?.startsWith("https:") == true) {
                    return false;
                }
                val intent =  Intent(Intent.ACTION_VIEW, Uri.parse(url));
                startActivity(intent);

                return true;
            }
        });

  
        val mWebView: WebView = binding.textMatchBoard
        binding.title.title = "$_valueName"
        //Token的观察者
        profileViewModel.authTokenLiveData.observe(this) {
            token = it
            mWebView.webChromeClient = WebChromeClient()
            mWebView.settings.javaScriptEnabled = true
            mWebView.settings.domStorageEnabled = true
            mWebView.webViewClient = object : WebViewClient() {
                override fun shouldOverrideUrlLoading(view: WebView, url: String): Boolean {
                    if (url.startsWith("alipays:") || url.startsWith("alipay")) {
                        val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url));
                        startActivity(intent);
                        return true;
                    }

                    // 如下方案可在非微信内部WebView的H5页面中调出微信支付
                    if (url.startsWith("weixin://wap/pay?")) {
                        val intent = Intent()
                        intent.action = Intent.ACTION_VIEW
                        intent.data = Uri.parse(url)
                        startActivity(intent)
                        return true
                    } else {
                        val extraHeaders: MutableMap<String, String> = HashMap()
                        extraHeaders["Referer"] = "https://xxxx.xxxxxx.com"
                        webview?.loadUrl(url, extraHeaders)

                    }
                    return true
                }


                override fun onReceivedSslError(
                    view: WebView,
                    handler: SslErrorHandler,
                    error: SslError
                ) { // 重写此方法可以让webview处理https请求
                    handler.proceed()
                }
            }


            if (token != null) {
				//测试版本链接
                if (CustomApp.sInstance.DEBUG_MODE) {
                    mWebView.loadUrl(
                        "https://xxxx.xxxxxx.com/" +
                                "xxxxxxxxxx" +
                                "&id=$_value" +
                                "&token=$token")
                }else{
                //正式版本链接    
                    mWebView.loadUrl(
                        "https://xxxx.xxxxxx.com/" +
                                "xxxxxxxxxx" +
                                "&id=$_value" +
                                "&token=$token")
                }
            }
        }
    }
}
2.加载H5

​ 第一次搞安卓html5加载,然后我们开始调用微信支付, 那我们就开始分析下我的代码

​ 首先 我们要加载一个网络的H5页面 我认为这是通用也是必用的方法如下:

 webView.loadUrl("http://www.xxx.com/")
 webView = WebChromeClient()
 webView.settings.javaScriptEnabled = true
 webView.settings.domStorageEnabled = true
 webView.webViewClient =WebViewClient()

一个简单的H5页面页面显示就加载好了
下面这个是页面js加载出错的方法

[(84条消息) Android webview解决JS报错chromium: INFO:CONSOLE(1)] "Uncaught
TypeError: Cannot read property
‘getItem’_codekxx的博客-CSDN博客

3.调起微信支付与错误解决

接下来就是微信支付了 推荐先看微信开发平台的开发官网
微信的调起与报错的方法如下 😗
我搜了相关的文章一下参考的以下几个

(84条消息)
android中WebView调用H5页面的支付宝、微信支付失败错误返回ERR_UNKNOWN_URL_SCHEME_吕氏春秋i的博客-CSDN博客

(84条消息) Android支付SDK开发在App中调起H5支付的实现_淡淡的香烟的博客-CSDN博客_android
调用h5支付

(84条消息)
Android的Webview中H5支付调起微信支付_2015从头再来的博客-CSDN博客_app内嵌h5微信支付

(84条消息)
APP如何调用微信支付H5支付?_paymm的博客-CSDN博客_app唤起微信支付

Android 应用内微信 H5 支付 - 简书
(jianshu.com)

(84条消息)
安卓笔记:微信H5支付出现的问题_宇文濠的博客-CSDN博客

然后微信就是以下代码来调起的

​ shouldOverrideUrlLoading来截取url 来跳转页面 不懂的话百度与看源码

 mWebView.webViewClient = object : WebViewClient() {
                override fun shouldOverrideUrlLoading(view: WebView, url: String): Boolean {
                    if (url.startsWith("alipays:") || url.startsWith("alipay")) {
                        val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url));
                        startActivity(intent);
                        return true;
                    }

                    // 如下方案可在非微信内部WebView的H5页面中调出微信支付
                    if (url.startsWith("weixin://wap/pay?")) {
                        val intent = Intent()
                        intent.action = Intent.ACTION_VIEW
                        intent.data = Uri.parse(url)
                        startActivity(intent)
                        return true
                    } else {
                        val extraHeaders: MutableMap<String, String> = HashMap()
                        extraHeaders["Referer"] = "https://xxxx.xxxxxx.com"
                        mWebView?.loadUrl(url, extraHeaders)

                    }
                    return true
                }


                override fun onReceivedSslError(
                    view: WebView,
                    handler: SslErrorHandler,
                    error: SslError
                ) { // 重写此方法可以让webview处理https请求
                    handler.proceed()
                }
           }

以下是支付后 返回webview会有白屏的情况

我参考的一下链接:

(84条消息) Webview加载界面白屏解决方法总结_mikey未雨绸缪的博客-CSDN博客_webview白屏加载不出来

(84条消息) 关于安卓webview中的H5微信支付返回白屏的问题解决方案_sinat_bond的博客-CSDN博客

​ 思路是用一个webview覆盖之前的空白页

 webview = binding.webView
        webview?.settings?.javaScriptEnabled = true
        webview?.settings?.domStorageEnabled = true
        webview?.webChromeClient = WebChromeClient()
        //该方法支持支付宝和微信支付
        webview?.setWebViewClient(object : WebViewClient() {
            override fun shouldOverrideUrlLoading(view: WebView?, url: String?): Boolean 			{
                        
			if (url?.startsWith("http:") == true || url?.startsWith("https:") == true) {
                return false;
            }
            val intent =  Intent(Intent.ACTION_VIEW, Uri.parse(url));
            startActivity(intent);

            return true;
        }
    });

最后代码就写完了 然后总结一下 我百度了webview的基本使用方法 我还是觉得webview动态加载要好 需要及时销毁

5.基本的webview使用

Android中WebView的使用,加载H5 - 简书 (jianshu.com)

​ 一个最基本的webview微信支付就写好了 如果哪里不对 望读者指出 谢谢

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/langs/736410.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-28
下一篇 2022-04-28

发表评论

登录后才能评论

评论列表(0条)

保存