APP如何调用微信支付H5支付?

有一种奇特的需求叫做,在app上使用h5支付。这个实际上是有优势的,比如有多个app要做微信支付,只要h5做一套就可以全部通用。网上搜了一圈,讲的有很多,但是都不太细致,有些坑没有说。下面是我的实现:

 

public class WebViewTestActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_web_view_test);
        WebView webView = ((WebView) findViewById(R.id.webviewtest));

        WebSettings settings = webView.getSettings();
        settings.setJavaScriptEnabled(true);
        settings.setDefaultTextEncodingName("UTF-8");
        webView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
        webView.setWebChromeClient(new WebChromeClient());
        WebViewClient webViewClient = new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                // 如下方案可在非微信内部WebView的H5页面中调出微信支付
                if (url.startsWith("weixin://wap/pay?")) {
                    Intent intent = new Intent();
                    intent.setAction(Intent.ACTION_VIEW);
                    intent.setData(Uri.parse(url));
                    startActivity(intent);
                    return true;
                } else {
                    Map<String, String> extraHeaders = new HashMap<String, String>();
                    extraHeaders.put("Referer", "http://wxpay.wxutil.com");
                    view.loadUrl(url, extraHeaders);
                }
                return true;
            }

            @Override
            public void onReceivedSslError(WebView view, SslErrorHandler handler, android.net.http.SslError error) { // 重写此方法可以让webview处理https请求
                handler.proceed();
            }
        };
        webView.setWebViewClient(webViewClient);
        webView.loadUrl("http://wxpay.wxutil.com/mch/pay/h5.v2.php");
    }

}

 

 

 

出现的错误无外乎就是微信官网列出的那几种,可以看这个链接 https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=15_4 。比如我在原生系统上最开始报的错误就是:商家参数格式有误,请联系商家解决,这个实际上官方给出了解决方案:

2. 如果是APP里调起H5支付,需要在webview中手动设置referer,如

(Map extraHeaders = new HashMap();
extraHeaders.put("Referer", "商户申请H5时提交的授权域名");//例如 http://www.baidu.com ))

当时就不太理解这个玩意应该加在哪儿。后来试过几次以后才明白这个是给webview用的。知识点没有什么,就是写出来做个备忘,万一哪天用到了不用再去翻别人的坑了。h5支付的审核还是比较严格的,以前只有京东什么的合作伙伴才能拿到资格,今年开始放开一点了,但是小公司估计也申请不下来。

有问题或者交流可以加qq 1510312433

============================================

有同学反馈问题说是按照这个demo写的,但是还是报 商家参数格式错误,我看了下他的代码,在WebViewClient中覆写了这个方法 

[code=java]
 @Override
            public void onPageStarted(WebView view, String url, Bitmap favicon) {
                view.loadUrl(url);
                super.onPageStarted(view, url, favicon);
            }
[/code]
把这段去掉就正常了。原因大概是onpagestart方法是最开始调用的,导致shouldoverride方法没有被调用

============================================

附上微信的官方文档地址,一些错误可以在这里面找到原因 点击打开链接

 

 

*********************************************************

BT搜索

展开阅读全文

没有更多推荐了,返回首页