第三方商户调起支付宝出现 alipays://platformapi

本文介绍了在项目中遇到的第三方商户调起支付宝时遇到的alipays://platformapi异常情况。通过在Android的WebView中拦截URL加载,并判断网络连接及支付宝应用是否已安装,实现正确跳转。

前言:

很久没有写过博客了,主要是因为之前一直在学习RN和web相关的知识,以及工作上的原因忙不过来,没有坚持了,现阶段终于有时间来写写博客了。

     这次要分享的内容也是前不久项目中出现的一个问题,项目中有一块功能是需要与第三方商户合作,通过访问他们提供的h5页面来调起我们自己手机端的支付宝。先上一个出现错误的异常图

可以看到 url是由‘’alipays‘’开头的,由于我们的webview是无法识别这个(只能识别http/https开头的),所以要对这个操作进行拦截,也就是通过我们webview的setWebViewClient()方法,重写WebViewClient的shouldOverrideUrlLoading(WebView view, String url)中进行拦截.

 
 

[html] view plain copy

 

  1. //判断网络连接  
  2.         if (!NetUtil.checkNetIsAccess(context)) {  
  3.             loading.setLoadStop(false, null, R.string.no_connect);  
  4.         }  
  5.   
  6.         if(url.contains("alipays://platformapi")){  
  7.             Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));  
  8.             startActivity(intent);  
  9.         } else {  
  10.             view.loadUrl(url);  
  11.             LogUtil.d("url", url);  
  12.         }  


shouldOverrideUrlLoading(WebView view, String url)中具体执行的代码就在上面。但是这样处理的话,可能就

会出现一种情况,因为这段代码是优先调起手机上的支付宝app的,在手机上没有安装支付宝app的时候,可能就会
出现异常,当时我就觉得奇怪了,为什么会这样,因为以上的处理方案也是在网上查找到的资料。后来通过与客服沟
通,可能原因是出在商户集成了第三方软件,然后该软件hook了系统的openurl函数导致的。原因是找到了,但是我们
这边不可能要求商户去改他们的第三方软件,所以只能我们这边处理。
主要是因为手机上没有安装支付宝app,所以可以从这里下手,我们可以先判断手机上是否安装了支付宝app,安装
了,就执行上图的代码。
判断手机上是否安装支付宝app:
 

[html] view plain copy

 

  1. //判断是否安装支付宝app  
  2.     public static boolean checkAliPayInstalled(Context context) {  
  3.   
  4.         Uri uri = Uri.parse("alipays://platformapi/startApp");  
  5.         Intent intent = new Intent(Intent.ACTION_VIEW, uri);  
  6.         ComponentName componentName = intent.resolveActivity(context.getPackageManager());  
  7.         return componentName != null;  
  8.     }  

 

通过以上的判断来处理shouldOverrideUrlLoading(WebView view, String url)中的拦截事件
 

[html] view plain copy

 

  1. if(url.contains("alipays://platformapi")){  
  2.                     boolean visit = checkAliPayInstalled(mContext);  
  3.                     if(visit){  
  4.                         Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));  
  5.                         startActivity(intent);  
  6.                     }  
  7.                 }  

 

这问题当时困扰了好久,一直在排查我们这边项目的代码,后来才知道原来是商户那边的问题,通过以上的方式就
处理了当自定义url是 alipays 开头的时候,并且手机上不存在支付宝app时,能够正常调起h5的支付宝登录页。

转载于:https://my.oschina.net/renliangrong/blog/1486175

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值