后端写好h5页面之后 需要Android段使用webview调用然后转native调起微信和支付宝进行支付
h5的就不说了,Android端只要设置WebViewClient重写shouldOverrideUrlLoading()就可以了,拦截方法里面处理微信或者支付宝的代码相信各位都能从网上搜到,网上同时处理支付宝和微信的代码大多数都是错的,主要原因就是判断是支付宝支付还是微信支付的方法不对,我总结了一下,亲测可用。
wvPay.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(final WebView view, String url) { if (url.startsWith("https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb")) { Map<String, String> extraHeaders = new HashMap<>(); extraHeaders.put("Referer", "这里填写后台提交的微信支付回调的网址"); view.loadUrl(url, extraHeaders); return true; } else if (url.startsWith("weixin://wap/pay?")) { Intent intent = new Intent(); intent.setAction(Intent.ACTION_VIEW); intent.setData(Uri.parse(url)); startActivity(intent); return true; } else { if (!(url.startsWith("http") || url.startsWith("https"))) { return true; } /** * 推荐采用的新的二合一接口(payInterceptorWithUrl),只需调用一次 */ final PayTask task = new PayTask(PayActivity.this); boolean isIntercepted = task.payInterceptorWithUrl(url, true, new H5PayCallback() { @Override public void onPayResult(final H5PayResultModel result) { // 支付结果返回 final String url = result.getReturnUrl(); if (!TextUtils.isEmpty(url)) { PayActivity.this.runOnUiThread(new Runnable() { @Override public void run() { view.loadUrl(url); } }); } } }); if (!isIntercepted) { view.loadUrl(url); } return true; } } });
这样处理就可以了 然后记得设置websetting
WebSettings settings = wvPay.getSettings(); settings.setUseWideViewPort(true); settings.setLoadWithOverviewMode(true); settings.setJavaScriptEnabled(true);
在最后在说一个问题,遇到过低版本android系统无法调起支付的问题,shouldOverrideUrlLoading()这个方法都不进来,不要慌,是h5的问题,日志可以看到
[INFO:CONSOLE(98)] "Uncaught ReferenceError: $SERVERURL is not defined", source: e: e: http://d11.cto.shovesoft.com/res/js/youkedaPay.js (98 (98 (98)
然后在网上搜是js调用顺序的问题,具体的大家去搜吧