为什么非微信内置微信浏览器调用qq聊天微信支付失败

安卓非微信内置浏览器中的网页调起微信支付的方案研究 - CSDN博客
安卓非微信内置浏览器中的网页调起微信支付的方案研究
之前在app中集成过微信支付,此种微信支付方式为app支付,即在我们自己的应用中嵌入微信支付SDK,由Native代码调起微信支付。
后来由于业务需要在我们app的WebView中打开第三方店铺的网页,在第三方网页中有微信支付按钮,测试反馈说ios可以调起微信支付,而android不可以。后来网上看到说微信内置Webview和京东的网页也可以调起微信支付,微信自己没什么奇怪的,而京东可以的话,如果它跟微信没什么合作协议的话,那么其他app应该也可以在网页中调用微信支付。
由于ios可以支持,因此找ios同事测试了一下,发现ios内置浏览器中只要输入相关协议都可以调起相关app的,比如:
1. 输入weixin:// 可以调起微信
2. 输入alipay:// 可以调起支付宝
这样就不难解释为什么ios的webview中第三方网页可以调起微信支付了,但android在浏览器中输入上述协议,没有任何响应。因此本文主要探讨是基于android平台的。
后来终于找到,作为客户端开发者,是不会想到这个开发文档的,当时集成app支付的时候所查阅的文档也未提到H5支付的方式。在文档的使用场景介绍中有这么一段:
H5支付是基于公众号基础开发的一种非微信内浏览器支付方式(需要单独申请支付权限),可以满足在微信外的手机H5页面进行微信支付的需求。同时,由于H5链接传播十分方便、来源不易追踪,商户需要特别注意做好防钓鱼、防刷单的处理,控制风险。
由此看来,确实官方是支持在非微信内置浏览器中调起微信支付的。
在文档中,微信给了一个官方的测试链接:,在手机中打开该页面,点击“立即购买”,就可以调起微信支付,我测试了Nexus手机的Chorme浏览器和Sony手机的自带浏览器,均可以。具体效果如下图:
通过查看网页源代码,发现“立即购买”是一个按钮,其连接点击协议是这样的:
href=&weixin://wap/pay?appid%3Dwx0ec43b%26noncestr%3D3e84679af4efab5f32ee9ea01b2ec290%26package%3DWAP%26prepayid%3Dwx19fdacd7bc0d%26timestamp%3D%26sign%3DC40DC4BB0BAB&
瞬间觉得非常熟悉,以前集成app支付的关键代码是这样的:
PayReq request = newPayReq();
request.appId = &wxd930ea5d5a258f4f&;
request.partnerId = &&;
request.prepayId=&fc314aa427&,;
request.packageValue = &Sign=WXPay&;
request.nonceStr=&f&;
request.timeStamp=&&;
request.sign=&7FFECB600D810D2D8F28BC2811827B&;
api.sendReq(req);上述a链接里的协议就是app支付里面的各种参数,因此可以得到结论,weixin://wap/pay是微信定义的一种支付协议,用于网页端支付,微信app必定设置了名为weixin://的scheme,因此可以在网页上唤起微信app,在通过约定的参数名称,获取各种参数,从而可以完成支付,具体机制跟app支付是相同的。至于上面一系列参数,是第三方网页端跟微信那边获取的,均由第三方服务端处理,客户端不必关心。
知道了以上原理,就该讨论解决方案了,下面有几种可行的方案。
上面可知,微信的H5支付协议可以在浏览器中调起微信,这也是最简单的方案。如果我们的app打开第三方网页用的是手机浏览器的话,就不用做什么,直接可以调起微信支付了。按微信文档所说,应该大部分浏览器都支持,我只是简单测试了两款。
第一种方案固然简单,但事实上我们往往使用WebView来打开第三方网页,而不是手机浏览器,因此如何让WebView也支持调起微信支付才是核心问题。经过测试发现,原生WebView是可以唤起微信支付的,核心代码如下:
webView = newWebView(this);
webView.getSettings().setJavaScriptEnabled(true);
webView.loadUrl(&http://wxpay./pub_v2/pay/wap.v2.php&);
对,就这样简单就OK了。
然而往往我们的app中使用自定义的WebView,经测试发现如果为WebView设置了WebViewClient,如下:
webView.setWebViewClient(newWebViewClient() {
// some logic
那么就不能唤起微信支付了,errorCode返回-10,提示“不支持该协议”。联系到可以在浏览器中唤起微信支付,因此我的解决方案如下,经测试是可以的。
webView.setWebViewClient(newWebViewClient() {
publicbooleanshouldOverrideUrlLoading(WebView view, String url) {
// 如下方案可在非微信内部WebView的H5页面中调出微信支付
if(url.startsWith(&weixin://wap/pay?&)) {
Intent intent = newIntent();
intent.setAction(Intent.ACTION_VIEW);
intent.setData(Uri.parse(url));
startActivity(intent);
returnsuper.shouldOverrideUrlLoading(view, url);
publicvoidonPageFinished(WebView view, String url) {
// TODO Auto-generated method stub
super.onPageFinished(view, url);
publicvoidonReceivedError(WebView view, interrorCode,
String description, String failingUrl) {
// TODO Auto-generated method stub
super.onReceivedError(view, errorCode, description, failingUrl);
第二种解决方案的效果图如下,注意使用了WebView打开的网页:
跟前两种方案相比,第三种就算直接暴力了。结合之前嵌入SDK的app支付方式,我们可以在WebView里拦截H5的支付协议,从上述协议中取出各个参数,完全可以走微信APP支付的方式了。可以发现H5的支付协议中唯独少了partnerId,partnerId指商户ID,在注册微信支付时都会有。至于为什么没有商户id,猜测一是为了安全,另外第三方自家的网页,当然已知partnerId了(如京东的网页,京东在微信的商户id当然知道的),就没必要放到协议中去。
如果我们的app知道第三方的partnerId的话,这样就能拿到所有参数的话,理论上完全可以转走app支付的方式,具体我没有测试,有兴趣的可以试一下。
本文已收录于以下专栏:
相关文章推荐
public boolean shouldOverrideUrlLoading(WebView view, String url) {
// 如下方...
一家移动互联网公司,说到底,要盈利总是需要付费用户的,自己开发支付系统对于资源有限的公司来说显然不太明智,国内已经有多家成熟的移动支付提供商,阿里就是其中之一。 本文分享支付宝app支付sdk的接入。
EasyPay是一个开源的聚合支付可定制化框架,目前已集成微信APP支付,支付宝APP支付SDK。银联支付(开发中)。
Android开发者只需要简单调用EasyPay的几行代码,即可调起支付客户端...
有个需求是调用微信支付和支付宝支付,原本以为要集成SDK,之后才知道后台返回的是html,只需要用webview显示出来,之前没有接触过这种,结果跳了几天的坑 o(////▽////)q傻傻地直接显示...
webView.getSettings().setAllowFileAccess(true);
//如果访问的页面中有Javascript,则webview必须设置支持Javascri...
项目中,需要在App中使用webview通过访问url,最终调起微信支付。
{CSDN:CODE:1880062}
当使用webview打开类似淘宝美团等网页时,如何调用native支付呢.
首先,在webview中点击某个链接时,需要我们在shouldOverrideUrlLoading()这个方法中对响应进行处...
问题来源之前在app中集成过微信支付,当时还写了一篇扫坑贴,此种微信支付方式为app支付,即在我们自己的应用中嵌入微信支付SDK,由Native代码调起微信支付。后来由于业务需要在我们app的WebV...
一 摘要这里HTML5集成微信支付跟iOS,安卓集成微信支付过程是一样的,iOS微信集成参考之前的文章.
http://blog.csdn.net/baihuaxiu123/article/deta...
参考网址:/kf/727.html
http://blog.csdn.net/u/article/details/51426...
他的最新文章
讲师:宋宝华
讲师:何宇健
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。问题: (html)微信内置浏览器中如何调用微信原生支付?
描述:在手机浏览器中,网页可以通过weixin://xxx协议调用微信进入支付模块。但现在网页是在微信webview中打开的,用weixin://协议貌似不起作用了。有替代的方案吗?解决方案1:生成二维码,让客户长按识别
以上介绍了“ (html)微信内置浏览器中如何调用微信原生支付?”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:/itwd/3893794.html
上一篇: 下一篇:

我要回帖

更多关于 浏览器调用微信支付 的文章

 

随机推荐