网页里支付,如果嵌在webview内,支付是会出现问题的。
1、支付宝支付
现在很多解决方案的文章,都比较老旧,并不能完善解决问题。
需要参考:
https://opendocs.alipay.com/open/203/106493
但是,该文档里面,对应的aar是16年的版本,需要自己去这个链接里找对应的最新版本的:https://opendocs.alipay.com/open/54/104509
注意匹配sdk版本,修改manifest文件
2、微信支付
微信支付的话,需要自行去匹配一下url
if (url.startsWith("https://wx.tenpay.com")) {
//H5微信支付要用,不然说"商家参数格式有误"
HashMap<String, String> lStringStringHashMap = new HashMap<>();
if (!TextUtils.isEmpty(mReffer)) {
lStringStringHashMap.put("referer", mReffer);
view.loadUrl(url, lStringStringHashMap);
} else {
view.loadUrl(url, lStringStringHashMap);
}
return true;
}
if (url.startsWith("weixin://")) {//微信schema直接跳转
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
startActivity(intent);
return true;
}
最终,给一下全部的代码吧:
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
String url = request.getUrl().toString();
Log.i(“ZHIFU-”, url);
Log.i(“ZHIFU-mReffer”, mReffer);
if (url.startsWith("https://wx.tenpay.com")) {
//H5微信支付要用,不然说"商家参数格式有误"
HashMap<String, String> lStringStringHashMap = new HashMap<>();
if (!TextUtils.isEmpty(mReffer)) {
lStringStringHashMap.put("referer", mReffer);
view.loadUrl(url, lStringStringHashMap);
Log.i("ZHIFU-mReffer", "load");
} else {
view.loadUrl(url, lStringStringHashMap);
}
return true;
}
if (url.startsWith("weixin://")) {//微信schema直接跳转
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
startActivity(intent);
return true;
}
/**
* 推荐采用的新的二合一接口(payInterceptorWithUrl),只需调用一次
*/
final PayTask task = new PayTask(WebViewActivity.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)) {
WebViewActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
view.post(() -> view.loadUrl(url));
}
});
} else {
view.post(() -> view.loadUrl(mainUrl));
}
}
});
/**
* 判断是否成功拦截
* 若成功拦截,则无需继续加载该URL;否则继续加载
*/
if (!isIntercepted) {
view.loadUrl(url);
}
return true;
}