APP如何调用微信支付H5支付?
文章转发自:https://blog.csdn.net/paymm/article/details/78928224
有一种奇特的需求叫做,在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方法没有被调用
============================================
附上微信的官方文档地址,一些错误可以在这里面找到原因 点击打开链接