汇聚,杉德,微信原生支付,支付宝成功/失败回调记录

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了汇聚,杉德,微信原生支付,支付宝成功/失败回调记录相关的知识,希望对你有一定的参考价值。

参考技术A 1、清除微信缓存,清除微信存储空间,重新登录微信
2、如果有更换包名,有更换签名文件信息,清除编译器缓存clean Project 、Invalidate Caches/Restart,并确保包名,签名没错

额外补充说一句,无论是否支付成功、失败,最好都是轮训请求后端进行一个验证操作。所以对结果是怎么样的,我们都可以不用关心

杉德小程序支付,汇聚小程序支付,当你取消支付,点击小程序右边的关闭圆圈的时候,WXEntryActivity 界面会自动消失,但不会走finish,onDestroy。所以要做检测是否真的成功或者是否支付完成,需要自行在吊起微信支付页面或者待确认界面进行轮训请求后台,确定是否支付成功。

杉德小程序支付、汇聚小程序支付点击返回商户会走onResp,也会走finish,onDestroy

支付宝支付,不像微信一样,当你取消支付,支付成功,支付宝会帮你回调handleMessage,所以你需要在这里处理你自己的逻辑

1、原生微信APP支付,只能回调WXPayEntryActivity
2、汇聚、杉德小程序支付只能回调WXEntryActivity ,点击返回商户会走onResp,也会走正常的完整生命周期。如果点击的是小程序的圆圈关闭是不会走onResp,也就没有了WXEntryActivity 完结的生命周期,当你切回原来自己APP界面的时候,是直接在你发起小程序支付的界面了。

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, truenew 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();
        }
    }
}

以上是关于汇聚,杉德,微信原生支付,支付宝成功/失败回调记录的主要内容,如果未能解决你的问题,请参考以下文章

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

支付失败如何编程跳过变成支付成功

支付宝和微信h5支付成功或者取消支付返回App

React Native集成支付宝支付

iOS 支付宝支付成功不走回调方法

支付宝,微信支付不成功原因