Android H5微信支付宝支付笔记

2019-04-27  本文已影响0人  Chenyangqi

考虑到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();
    }
}

上一篇 下一篇

猜你喜欢

热点阅读