Android H5调起原生微信或支付宝支付

Android H5调起原生微信或支付宝支付

WebView调用原生微信或支付宝回调:其原理就是在shouldOverrideUrlLoading(final WebView view, String url)方法中进行拦截处理。

由于支付宝的取消支付之后跳转的页面显示不太友好,所以集成支付宝SDK-手机网站支付转APP支付,说明文档参照https://docs.open.alipay.com/204/105695/。按照说明集成aliPaySdk。

初始化WebView:

private void initWebView(){    WebViewUtil.webSettingsApply(mWebView.getSettings());    mWebView.setWebViewClient(new MyWebViewClient());    mWebView.setWebChromeClient(new WebChromeClient(){        @Override        public void onReceivedTitle(WebView view, String title) {            super.onReceivedTitle(view, title);            if(!TextUtils.isEmpty(title) && mTitle != null) {                mTitle.setText(title);            }        }    });    mWebView.loadUrl(mUrl);}

覆写url加载:

 private class MyWebViewClient extends WebViewClient {

    @Override    public boolean shouldOverrideUrlLoading(final WebView view, String url) {        // 微信支付处理        if (url.startsWith("weixin://wap/pay?")){            try {                Intent intent = new Intent();                intent.setAction(Intent.ACTION_VIEW);                intent.setData(Uri.parse(url));                H5PayActivity.this.startActivity(intent);                return true;            }catch (Exception e){ //异常处理                view.goBack(); // 因为会出现有一个weixin空白页面;根据需求自己处理                UIUtil.showToastShort("系统检测未安装微信,请先安装微信或者用支付宝支付");                return true;            }        }

        // 支付宝支付处理        final PayTask task = new PayTask(H5PayActivity.this); //支持原生APP调用        //webView处理必须在同一个线程上        boolean isIntercepted = task.payInterceptorWithUrl(url, true, new H5PayCallback() {            @Override            public void onPayResult(final H5PayResultModel result) {                // 支付结果返回                final String url = result.getReturnUrl();                if (!TextUtils.isEmpty(url)) {                    H5PayActivity.this.runOnUiThread(new Runnable() {                        @Override                        public void run() {                            view.loadUrl(url);                        }                    });                }                // 5000支付失败 6001重复请求 6002中途取消                if ("5000".equals(result.getResultCode()) || "6001".equals(result.getResultCode()) ||                        "6002".equals(result.getResultCode())){                    Logg.e("errorCode", result.getResultCode());                    H5PayActivity.this.runOnUiThread(new Runnable() {                        @Override                        public void run() {                            view.goBack();                        }                    });                }            }        });

        /**         * 判断是否成功拦截         * 若成功拦截,则无需继续加载该URL;否则继续加载         */        if (!isIntercepted) {            if (!(url.startsWith("http") || url.startsWith("https")) || StringUtil.isEmpty(url)) {                return true;            }            view.loadUrl(url);        }        return true;    }}

通用的WebView设置

public final class WebViewUtil {

    /**     * 应用WebView的设置     * <ul>     * <li>webSettings.setDomStorageEnabled(true);//设置DOM Storage缓存</li>     * <li>webSettings.setDatabaseEnabled(true);//设置可使用数据库</li>     * <li>webSettings.setJavaScriptEnabled(true);//支持js脚本</li>     * <li>webSettings.setUseWideViewPort(true);//将图片调整到适合webview的大小</li>     * <li>webSettings.setSupportZoom(false);//支持缩放</li>     * <li>webSettings.setBuiltInZoomControls(false);//支持缩放</li>     * <li>webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NORMAL);//支持内容从新布局</li>     * <li>webSettings.setSupportMultipleWindows(false);//多窗口</li>     * <li>webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE);//关闭webview中缓存</li>     * <li>webSettings.setAllowFileAccess(true);//设置可以访问文件</li>     * <li>webSettings.setNeedInitialFocus(true);//当webview调用requestFocus时为webview设置节点</li>     * <li>webSettings.setJavaScriptCanOpenWindowsAutomatically(true);//支持通过JS打开新窗口</li>     * <li>webSettings.setLoadsImagesAutomatically(true);//支持自动加载图片</li>     * <li>webSettings.setGeolocationEnabled(true);//启用地理定位</li>     * <li>webSettings.setAllowFileAccessFromFileURLs(true);//使用允许访问文件的urls</li>     * <li>webSettings.setAllowUniversalAccessFromFileURLs(true);//使用允许访问文件的urls</li>     * </ul>     */    @SuppressLint("SetJavaScriptEnabled")    public static void webSettingsApply(WebSettings webSettings) {        webSettings.setDomStorageEnabled(true);//设置DOM Storage缓存        webSettings.setDatabaseEnabled(true);//设置可使用数据库        webSettings.setJavaScriptEnabled(true);//支持js脚本        webSettings.setUseWideViewPort(true);//将图片调整到适合webview的大小        webSettings.setSupportZoom(false);//支持缩放        webSettings.setBuiltInZoomControls(false);//支持缩放        webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NORMAL);//支持内容从新布局        webSettings.setSupportMultipleWindows(false);//多窗口        webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE);//关闭webview中缓存        webSettings.setAllowFileAccess(true);//设置可以访问文件        webSettings.setNeedInitialFocus(true);//当webview调用requestFocus时为webview设置节点        webSettings.setJavaScriptCanOpenWindowsAutomatically(true);//支持通过JS打开新窗口        webSettings.setLoadsImagesAutomatically(true);//支持自动加载图片N        webSettings.setGeolocationEnabled(true);//启用地理定位

        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {            webSettings.setAllowFileAccessFromFileURLs(true);//使用允许访问文件的urls            webSettings.setAllowUniversalAccessFromFileURLs(true);//使用允许访问文件的urls        }

        if(Build.VERSION.SDK_INT >= 19) {            if(Configs.DEBUG){                WebView.setWebContentsDebuggingEnabled(true);            }        }        // webSettings.setRenderPriority(WebSettings.RenderPriority.NORMAL);//设置渲染优先级 will be Deprecated    }

    /**     * webView 销毁webView避免内存泄漏     */    public static  void destory(WebView webView){        if(webView != null){            webView.stopLoading();            webView.getSettings().setJavaScriptEnabled(false);            webView.clearHistory();            webView.removeAllViews();            webView.destroy();        }    }}

原文地址:https://www.cnblogs.com/denluoyia/p/10057794.html

时间: 2024-07-31 01:12:45

Android H5调起原生微信或支付宝支付的相关文章

iOS不用官方SDK实现微信和支付宝支付XHPayKit

作者:朱晓辉Allen 链接:https://juejin.im/post/5a90dd3a6fb9a0634912b755 前言 前段时间由于项目需求,移除了项目中的微信支付SDK和支付宝支付SDK,这种情况下需要自己搞定支付,第一时间考虑到的是使用openshare,但是当下载openshare下来后发现,openshare的支付接口,并不能直接替换官方SDK支付接口, 官方SDK的实现逻辑是后台订单签名完成后,客服端传签名信息及参数给支付SDK,支付SDK生成协议url,然后拉起第三方支付

MUI 微信 和支付宝支付 (前台代码)

<!-- 校园公告详情界面 用于显示校园公告的详情信息 在校园公告界面点击某一条目后 进入本界面查看详情 --> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maxim

Android应用跳转到微信和支付宝扫一扫

新版的微信已经把微信功能的schema都禁掉了,意味着我们无法打开微信的扫一扫等功能,目前正常的只能先进入微信(我测试的时候是微信版本7.0.3)已经是很新的版本了 具体调起微信扫一扫代码如下,测试后确实是可以使用的 @SuppressLint("WrongConstant") public static void toWeChatScanDirect(Context context) { try { Intent intent = new Intent(); intent.setCo

实现手机网页调起原生微信朋友圈分享的工具nativeShare.js

http://www.liaoxiansheng.cn/?p=294 我们知道现在我们无法直接通过js直接跳转到微信和QQ等软件进行分享,但是现在像UC浏览器和QQ浏览器这样的主流浏览器自带一个分享工具,而他们也有自己定义的js接口.我们通过调用浏览器的接口去调用浏览器的分享,从而实现原生分享功能.是不是很酷呢? 工具介绍: nativeShare是一个可以通过javascript直接调用原生分享的工具. 该工具具有以下特点: 支持原生微博.微信好友.微信朋友圈.QQ好友.QQ空间分享 支持调用

微信、支付宝支付绑定多个商户号

微信 当有多个收款或对账账户的需求的时候,可以通过微信服务商申请新的支付商户号,然后让服务商在配置中,给你设定默认关注的公众号是同一个公众号id就可以了. https://www.zhihu.com/question/33628407 支付宝 https://openclub.alipay.com/read.php?tid=2123&fid=56&page=1 原文地址:https://www.cnblogs.com/y-blog/p/9166813.html

微信与支付宝支付 浏览器判断&amp;页面关闭

以下为php浏览器头判断代码实例: public function getUserAgent(){ return isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : '';} $agent = self::getUserAgent(); if (strpos($agent, 'MicroMessenger') === false) { throw new Q_Exception('请使用微信打开', Lib_Cod

微信和支付宝实现

支付基本上是很多产品都必须的一个模块,大家最熟悉的应该就是微信和支付宝支付了,不过更多的可能还是停留在直接sdk的调用上,甚至和业务系统高度耦合,网上也存在各种解决方案,但大多形式各异,东拼西凑而成.所以这里我介绍下OSS.PayCenter开源跨平台支付组件 及其框架设计.并对常用支付模式进行一个全面介绍,方便大家开发以及跨平台使用.这篇文章主要围绕以下几个模块: 1. 微信和支付宝对比 2. 支付模式介绍 3. OSS.PayCenter框架设计 4. 调用示例 5. 注意事项 一. 微信和

Android通过外部浏览器调用微信H5支付,Android+PHP详解

看了好多关于讲解微信H5支付开发的文章,大多数都是通过微信内部浏览器来调用支付接口(其实就是公众号支付),可能是因为H5支付接口刚开放不久吧. 微信官方体验链接:http://wxpay.wxutil.com/mch/pay/h5.v2.php,请在微信外浏览器打开. 看了上面的体验链接,如果感兴趣,可以接着往下看,希望对你有所帮助. 一.Android端 Android端代码相对来说比较简单一些,我这边直接调用系统浏览器打开H5支付页面 Intent intent = new Intent()

企业号微信支付 公众号支付 H5调起支付API示例代码 JSSDK C# .NET

先看效果: 1.本文演示的是微信[企业号]的H5页面微信支付 2.本项目基于开源微信框架WeiXinMPSDK开发:https://github.com/JeffreySu/WeiXinMPSDK 感谢作者苏志巍的开源精神 一.准备部分 相关参数: AppId:公众号的唯一标识(登陆微信企业号后台 - 设置 - 账号信息 - CorpID) AppSecret:(微信企业号后台 - 设置 - 权限管理 - 新建一个拥有所有应用权限的普通管理组 - Secret) Key:商户API密钥(登陆微信