Android端 支付宝&微信H5支付调用

一、支付宝H5支付调用

支付宝H5支付官方开发文档

代码示例:

step1:
//传入支付宝支付所需url,跳转到webview页面
ali_pay.setOnClickListener {
            val aliUrl = "https://secure.xxxx.xxxxxxx.net/pay/pay/prepayAlipay"
            startActivity(Intent(this, TestPayActivity::class.java)
                    .putExtra("url", aliUrl))
        }
step2:【Webview页面】
@SuppressLint("SetJavaScriptEnabled")
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_test_pay)
        btn_back.setOnClickListener { finish() }

        webview.settings.apply {
            javaScriptEnabled = true
            layoutAlgorithm = WebSettings.LayoutAlgorithm.SINGLE_COLUMN
            allowFileAccess = true
            domStorageEnabled = true
            loadsImagesAutomatically = true
        }
        webview.webChromeClient = WebChromeClient()
        var platformapiUrl = "" //记录支付宝startApp的url信息,用以点击“继续支付”时再次唤起
        //在webview的webViewClient中做如下配置
        webview.webViewClient = object : WebViewClient() {
            override fun shouldOverrideUrlLoading(view: WebView?, reloadUrl: String?): Boolean {
                Log.e(TAG, "reloadUrl======$reloadUrl")
//*******************test ali pay************************************************************
                /*此处应添加支付宝是否安装的验证,不然跳转会引发崩溃*/
                //唤起支付宝app
                if (reloadUrl.startsWith("alipays://platformapi/startApp")) {
                    platformapiUrl = reloadUrl
                    val intent = Intent(Intent.ACTION_VIEW, Uri.parse(reloadUrl))
                    startActivity(intent)
                }
                //网页上点击了"继续支付"
                if (reloadUrl.startsWith("https://mclient.alipay.com/h5Continue.htm?")) {
                    val intent = Intent(Intent.ACTION_VIEW, Uri.parse(platformapiUrl))
                    startActivity(intent)
                }
//*******************test ali pay************************************************************
                return false
            }

            override fun onReceivedSslError(view: WebView?, handler: SslErrorHandler?, error: SslError?) {
                //处理数字证书,为方便调试设置为全部允许
                handler!!.proceed()
            }
        }
        //first load
        val url = intent.getStringExtra("url")
        Log.e(TAG, "url======$url")
        webview.loadUrl(url)
    }

二、微信H5支付调用

微信H5支付官方开发文档

代码示例:

step1:
//传入微信支付所需url,跳转到webview页面
wx_pay.setOnClickListener {
            val wxUrl = "https://secure.xxxx.xxxxxxx.net/pay/pay/prepayWx"
            startActivity(Intent(this, TestPayActivity::class.java)
                    .putExtra("url", wxUrl))
        }
step2:【Webview页面】
@SuppressLint("SetJavaScriptEnabled")
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_test_pay)
        btn_back.setOnClickListener { finish() }

        webview.settings.apply {
            javaScriptEnabled = true
            layoutAlgorithm = WebSettings.LayoutAlgorithm.SINGLE_COLUMN
            allowFileAccess = true
            domStorageEnabled = true
            loadsImagesAutomatically = true
        }
        webview.webChromeClient = WebChromeClient()
        var num = 0 //控制wxUrl加载的次数
        webview.webViewClient = object : WebViewClient() {
            override fun shouldOverrideUrlLoading(view: WebView?, reloadUrl: String?): Boolean {
                Log.e(TAG, "reloadUrl======$reloadUrl")
//*******************test wx pay*************************************************************
                 /*此处应添加微信是否安装的验证*/
                //唤起微信app
                if (reloadUrl!!.startsWith("weixin://wap/pay")) {
                    val intent = Intent(Intent.ACTION_VIEW, Uri.parse(reloadUrl))
                    startActivity(intent)
                }
                //微信支付信息url加上Referer并重新加载获取唤起url
                if (reloadUrl.startsWith("https://wx.tenpay.com")) {
                    if (("4.4.3" == android.os.Build.VERSION.RELEASE) ||
                            ("4.4.4" == android.os.Build.VERSION.RELEASE)) {
                        //兼容这两个版本设置referer无效的问题
                        if (num < 1) {
                            view!!.loadDataWithBaseURL("http://winsion.net",
                                    "<script>window.location.href=\"$reloadUrl\";</script>",
                                    "text/html", "utf-8", null)
                            num++
                        }
                    } else {
                        val extraHeaders = HashMap<String, String>()
                        extraHeaders["Referer"] = "http://winsion.net"
                        if (num < 1) {
                            //second reload
                            view!!.loadUrl(reloadUrl, extraHeaders)
                            Log.e(TAG, "extraHeaders======${extraHeaders.size}")
                            num++
                        }
                    }
                }
//*******************test wx pay*************************************************************
                return false
            }

            override fun onReceivedSslError(view: WebView?, handler: SslErrorHandler?, error: SslError?) {
                handler!!.proceed()
            }
        }
        //first load
        val url = intent.getStringExtra("url")
        Log.e(TAG, "url======$url")
        webview.loadUrl(url)
    }

猜你喜欢

转载自blog.csdn.net/qq_32138419/article/details/90205287