直接上代码
注意微信拉起支付 需要传 extraHeaders["Referer"] = referer
referer 为微信支付的域名
private var copyBackForwardListsize = 0
private var wxpayIndex = 0
private var isGoBackOrForward = false
binding.bridgeWebView.webViewClient = object : WebViewClient() {
override fun shouldOverrideUrlLoading(view: WebView?, url: String?): Boolean {
//H5调起微信app支付方法二(可使用)
if (url == null) return false
try {
if (url.startsWith("weixin://wap/pay?") || url.startsWith("alipays://platformapi/startApp?")) {
val intent = Intent()
intent.action = Intent.ACTION_VIEW
intent.data = Uri.parse(url)
startActivity(intent)
return true
}
} catch (e: Exception) {
return false
}
if (url.contains("https://wx.tenpay.com")) {
//h5
var referer = ""
if (Const.DOCTOR_PACKAGE_NAME == DataManager.getInstance().getPackageName() || Const.PATIENT_PACKAGE_NAME == DataManager.getInstance().getPackageName()) {
//正式环境
referer = "https://member.manniuhealth.com"
} else {
//测试环境
referer = "https://member-test.manniuhealth.com"
}
val extraHeaders: MutableMap<String, String> = HashMap()
extraHeaders["Referer"] = referer
view?.loadUrl(url, extraHeaders)
return true
}
view?.loadUrl(url)
return true
}
override fun shouldInterceptRequest(view: WebView?, request: WebResourceRequest?): WebResourceResponse? {
//获取请求url
var url = request?.url.toString()
return super.shouldInterceptRequest(view, request)
}
override fun onReceivedSslError(view: WebView?, handler: SslErrorHandler?, error: SslError?) {
handler?.proceed()
}
override fun onPageFinished(view: WebView?, url: String?) {
super.onPageFinished(view, url)
val urlList = mutableListOf<String>()
urlList.clear()
copyBackForwardListsize = view?.copyBackForwardList()?.size ?: 0
for (i in 0 until copyBackForwardListsize) {
view?.copyBackForwardList()?.getItemAtIndex(i)?.url?.let {
urlList.add(it)
}
}
var isWxpay = false
var isAppointmentResult = false
urlList.forEachIndexed { index, s ->
if (s.contains("https://wx.tenpay.com")) {
isWxpay = true
wxpayIndex = index
}
if (s.contains("h5-appointment/appointmentResult")) {
isAppointmentResult = true
}
}
isGoBackOrForward = isWxpay && isAppointmentResult
}
}
}
微信支付成功或失败返回APP 也有坑 会重复拉起微信支付
详看以上onPageFinished 中获得webview历史路由栈
通过返回键处理 返回到微信支付的上一页 通过goBackOrForward方法处理
fun toFinishActivity() {
if (binding.bridgeWebView.canGoBack()) {
if (binding.bridgeWebView.getUrl().equals(webViewUrl)) {
super.onBackPressed()
} else {
if (isGoBackOrForward && binding.bridgeWebView.canGoBackOrForward(-(copyBackForwardListsize - (wxpayIndex - 1)))) {
binding.bridgeWebView.goBackOrForward(-(copyBackForwardListsize - (wxpayIndex - 1)))
} else {
binding.bridgeWebView.goBack()
}
}
} else {
super.onBackPressed()
}
}