考虑到IOS支付功能会受到苹果审核的原因,公司的产品支付使用的是H5支付,记录一下H5调起微信支付和支付宝支付的代码
此外,支付宝提供了H5调用SDK拉起支付的功能,速度相对于H5支付快很多,但是微信暂时未提供H5调原生的功能
Webview使用的是腾讯TBS
微信H5支付
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import com.fsxq.createcamp.BaseActivity;
import com.fsxq.createcamp.R;
import com.fsxq.createcamp.retrofit.RetrofitFactory;
import com.fsxq.createcamp.utils.LogUtils;
import com.fsxq.createcamp.widget.custom_view.MyToolbar;
import com.qmuiteam.qmui.util.QMUIStatusBarHelper;
import com.tencent.smtt.export.external.interfaces.JsResult;
import com.tencent.smtt.export.external.interfaces.SslError;
import com.tencent.smtt.export.external.interfaces.SslErrorHandler;
import com.tencent.smtt.export.external.interfaces.WebResourceRequest;
import com.tencent.smtt.export.external.interfaces.WebResourceResponse;
import com.tencent.smtt.sdk.WebChromeClient;
import com.tencent.smtt.sdk.WebSettings;
import com.tencent.smtt.sdk.WebView;
import com.tencent.smtt.sdk.WebViewClient;
import java.util.HashMap;
import java.util.Map;
import butterknife.BindView;
import butterknife.ButterKnife;
/**
* 微信支付H5
*/
public class WeChatPayActivity extends BaseActivity {
@BindView(R.id.toolbar)
MyToolbar toolbar;
@BindView(R.id.webview)
WebView webView;
private String payUrl;//支付订单地址
private String redirect_url;//微信支付成功跳转的activity路由
private boolean isWeiXinPay = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
QMUIStatusBarHelper.setStatusBarLightMode(this);
setContentView(R.layout.activity_web_pay);
ButterKnife.bind(this);
payUrl = getIntent().getExtras().getString("PAY_URL");
init();
}
private void init() {
toolbar.setToolbarTitle("微信支付");
toolbar.setToolbarBack(v -> {
Intent intent = new Intent(WeChatPayActivity.this, MainActivity.class);
startActivity(intent);
finish();
});
toolbar.setToolbarBgRecource(R.drawable.toolbar_bg_green);
WebSettings settings = webView.getSettings(); //和系统webview一样
settings.setJavaScriptEnabled(true); //支持Javascript 与js交互
settings.setJavaScriptCanOpenWindowsAutomatically(true);//支持通过JS打开新窗口
settings.setAllowFileAccess(true); //设置可以访问文件
settings.setSupportZoom(true); //支持缩放
settings.setBuiltInZoomControls(true); //设置内置的缩放控件
settings.setUseWideViewPort(true); //自适应屏幕
settings.setSupportMultipleWindows(true); //多窗口
settings.setDefaultTextEncodingName("utf-8"); //设置编码格式
settings.setAppCacheEnabled(true);
settings.setDomStorageEnabled(true);
settings.setAppCacheMaxSize(Long.MAX_VALUE);
settings.setCacheMode(WebSettings.LOAD_NO_CACHE); //缓存模式
webView.setWebViewClient(new WebViewClient() {
@Override
public WebResourceResponse shouldInterceptRequest(WebView webView,
WebResourceRequest request,
Bundle bundle) {
Uri uri = request.getUrl();
String url = uri.toString();
if (url.startsWith("https://wx.tenpay.com/cgi-bin")) {
String backUrl = uri.getQueryParameter("redirect_url");
Log.i("test", "拦截到了这个回调" + backUrl);
redirect_url = backUrl;
}
return super.shouldInterceptRequest(webView, request, bundle);
}
@Override
public void onPageStarted(WebView webView, String s, Bitmap bitmap) {
super.onPageStarted(webView, s, bitmap);
}
@Override
public void onPageFinished(WebView webView, String s) {
super.onPageFinished(webView, s);
}
@Override
public boolean shouldOverrideUrlLoading(WebView webView, String url) {
LogUtils.Logi("支付Url跳转处理:" + url);
if (url.startsWith("weixin://wap/pay?")) {
Log.i("test", "跳转微信的:" + url);
isWeiXinPay = true;
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setData(Uri.parse(url));
startActivity(intent);
} else {
webView.loadUrl(url);
}
return true;//不调用系统的浏览器打开网页
}
@Override
public void onReceivedSslError(WebView webView, SslErrorHandler sslErrorHandler,
SslError sslError) {
sslErrorHandler.proceed();//忽略SSL证书错误
}
@Override
public WebResourceResponse shouldInterceptRequest(WebView webView,
WebResourceRequest webResourceRequest) {
return super.shouldInterceptRequest(webView, webResourceRequest);
}
});
webView.setWebChromeClient(new WebChromeClient() {
@Override
public boolean onJsAlert(WebView webView, String s,
String s1, JsResult jsResult) {
return super.onJsAlert(webView, s, s1, jsResult);
}
@Override
public void onReceivedTitle(WebView webView, String s) {
super.onReceivedTitle(webView, s);
}
@Override
public void onProgressChanged(WebView webView,
int progress) {
super.onProgressChanged(webView, progress);
}
}
);
String referer = RetrofitFactory.getBaseUrl();
String targetUrl = payUrl;
if (("4.4.3".equals(android.os.Build.VERSION.RELEASE))
|| ("4.4.4".equals(android.os.Build.VERSION.RELEASE))) {
//兼容这两个版本设置referer无效的问题
webView.loadDataWithBaseURL(referer,
"<script>window.location.href=\"" + targetUrl + "\";</script>",
"text/html", "utf-8", null);
} else {
Map<String, String> extraHeaders = new HashMap<>();
extraHeaders.put("Referer", referer);
webView.loadUrl(targetUrl, extraHeaders);
}
}
@Override
protected void onPause() {
super.onPause();
webView.onPause();
webView.pauseTimers();
}
@Override
protected void onResume() {
super.onResume();
webView.resumeTimers();
webView.onResume();
if (isWeiXinPay && !TextUtils.isEmpty(redirect_url)) {
Log.i("test", "onResume...");
//TODO 重新加载
webView.loadUrl(redirect_url);
}
}
@Override
protected void onDestroy() {
super.onDestroy();
destroyWebView();
}
public void destroyWebView() {
try {
if (webView != null) {
webView.clearHistory();
webView.clearCache(true);
webView.loadUrl("about:blank");
webView.freeMemory();
webView.pauseTimers();
webView = null;
}
} catch (Exception e) {
}
}
}
支付宝H5支付
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import com.fsxq.createcamp.BaseActivity;
import com.fsxq.createcamp.R;
import com.fsxq.createcamp.widget.custom_view.MyToolbar;
import com.qmuiteam.qmui.util.QMUIStatusBarHelper;
import com.tencent.smtt.export.external.interfaces.WebResourceRequest;
import com.tencent.smtt.export.external.interfaces.WebResourceResponse;
import com.tencent.smtt.sdk.WebChromeClient;
import com.tencent.smtt.sdk.WebSettings;
import com.tencent.smtt.sdk.WebView;
import com.tencent.smtt.sdk.WebViewClient;
import butterknife.BindView;
import butterknife.ButterKnife;
/**
* 支付包支付H5
*/
public class AlipayActivity extends BaseActivity {
@BindView(R.id.webview)
WebView webView;
@BindView(R.id.toolbar)
MyToolbar toolbar;
private String payUrl;//调起支付的连接
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
QMUIStatusBarHelper.setStatusBarLightMode(this);
setContentView(R.layout.activity_alipay);
ButterKnife.bind(this);
payUrl = getIntent().getExtras().getString("PAY_URL");
init();
}
private void init() {
toolbar.setToolbarTitle("支付宝支付");
toolbar.setToolbarBack(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(AlipayActivity.this, MainActivity.class);
startActivity(intent);
finish();
}
});
WebSettings settings = webView.getSettings(); //和系统webview一样
settings.setJavaScriptEnabled(true); //支持Javascript 与js交互
settings.setJavaScriptCanOpenWindowsAutomatically(true);//支持通过JS打开新窗口
settings.setAllowFileAccess(true); //设置可以访问文件
settings.setSupportZoom(true); //支持缩放
settings.setBuiltInZoomControls(true); //设置内置的缩放控件
settings.setUseWideViewPort(true); //自适应屏幕
settings.setSupportMultipleWindows(true); //多窗口
settings.setDefaultTextEncodingName("utf-8"); //设置编码格式
settings.setAppCacheEnabled(true);
settings.setDomStorageEnabled(true);
settings.setAppCacheMaxSize(Long.MAX_VALUE);
settings.setCacheMode(WebSettings.LOAD_NO_CACHE); //缓存模式
webView.setWebViewClient(new WebViewClient() {
@Override
public void onPageStarted(WebView webView, String s, Bitmap bitmap) {
super.onPageStarted(webView, s, bitmap);
}
@Override
public void onPageFinished(WebView webView, String s) {
super.onPageFinished(webView, s);
}
@Override
public boolean shouldOverrideUrlLoading(WebView webView, String url) {
Log.i("test", "test" + "支付Url跳转处理:" + url);
if (url.contains("platformapi/startApp")) {
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
startActivity(intent);
} else if ((Build.VERSION.SDK_INT > Build.VERSION_CODES.M)
&& (url.contains("platformapi") && url.contains("startApp"))) {
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
startActivity(intent);
} else if (url.startsWith("weixin://wap/pay?")) {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setData(Uri.parse(url));
startActivity(intent);
} else if (url.equals("yianapp://activity/OpenVIPSuccessActivity")) {
setResult(201);
finish();
} else if (url.startsWith("yianapp://close")) {
finish();
} else {
webView.loadUrl(url);
}
return true;
}
@Override
public WebResourceResponse shouldInterceptRequest(WebView webView,
WebResourceRequest webResourceRequest) {
return super.shouldInterceptRequest(webView, webResourceRequest);
}
});
webView.setWebChromeClient(new WebChromeClient());
webView.loadUrl(payUrl);
}
@Override
protected void onPause() {
super.onPause();
webView.onPause();
webView.pauseTimers();
}
@Override
protected void onResume() {
super.onResume();
webView.resumeTimers();
webView.onResume();
}
@Override
protected void onDestroy() {
super.onDestroy();
}
}
网友评论