android利用微信intent-filter进行支付

AlienJun 发布于 2016/05/03 10:12
阅读 1K+
收藏 0

最近项目内嵌入了webview 访问了“有赞” 平台进行交易,iOS 上默认就可以直接打开微信支付,我们Android客户端也他们说没有做任何处理,现在是无法跳转支付。也就是说用我们的app访问一个网页,然后支付部分可以直接调起微信原生支付,而这部分并不需要app做支付部分的编码处理。感觉很奇葩啊?然后研究发现是微信推出的功能,例如打电话:< a href="tel://13788889999">打开拨号</ a> 这样的自定义 URL schema 协议。
微信以类似weixin://schema协议调起微信APP,携带支付信息;iOS 中的webview 默认是支持的这种方式,但也有些应用为了“安全”把那些认为不安全的协议给屏蔽掉了。

在android上也同样有这样的方式,而android浏览器只需要知道Activity中intent-filter 配置的data下配置的host和scheme就能打开, 网上有反编译看到微信的Activity配置:


可以看出 action为:android.intent.action.VIEW,category为:BROWSABLE ;Intent设置对应Action或者浏览器中weixin://qr都可以直接调起微信客户端;而它这个data 中的scheme就是处理weixin://这个协议的,前面的host=“qr”,应该是表示来自二维码扫描,猜想微信很多时候使用二维码扫描支付,其实扫描的也是某个url,所以可以确定“有赞”就是使用了微信的这种方式来支持网页直接调用微信支付,付款成功后微信会服务端回调“有赞”的后台,而App上看到的网页也会等“有赞”后台收到通知后刷新。

说明:data 中配置的host 和 scheme必须要匹配才能在浏览器中调起,host = “qr” 应该是只识别:weixin://qr/... 这种方式,而“有赞”的支付链接是 weixin://pay/... 这样的,故无法直接在webview中打开微信客户端。

所以通过以上分析,只能使用Intent方式手动去发起支付了,需要起一个Intent 然后携带上相关支付信息就可以完成,回忆下android的WebView;
WebView默认加载url 都是会打开系统自带的浏览器,必须要setWebViewClient,然后重写public boolean shouldOverrideUrlLoading(WebView view, String url);这个方法。于是就需要在这个方法中做一下判断处理,识别一下是不是weixin:// 协议,

public boolean shouldOverrideUrlLoading(WebView view, String url) { if (url.startsWith("weixin://")) {//网页内的微信支付,例如:有赞 Intent localIntent = new Intent();
        localIntent.setAction("android.intent.action.VIEW");
        localIntent.setData(Uri.parse(url));
        context.startActivity(localIntent); return true;
   } return false;
 }

总结:我们在前几个版本中有发现android是可以直接在webview中访问“有赞”进行支付的,而我问android的开发人员,他们说也没有进行任何处理,所以我猜想,要么是“有赞”把这个协议改了,要么是微信升级版本后把weixin://pay/ 给去掉了。 没有深入做android开发,理解不正确的地方望见谅。

特别感谢:
http://blog.csdn.net/geekpark/article/details/16118457

加载中
返回顶部
顶部