H5中调起支付宝支付,处理方式比较简单,主要对url进行拦截,判断是否以alipay开头,则进行拦截,不在使用webview加载,直接跳转Intent。这里有个点,需要注意下:
不能以alipays://作为判断条件,例如有时返回的链接是这样的alipayqr
alipayqr://platformapi/startapp?saId=100&clientVersion=3.7.0.0718&qrcode=https://qr.alipay.com/ltx3afsnrpajaeji52?_s=web-other
所以在拦截url的时候放宽了判断条件,只要以alipay开头的,则拦截跳转,代码如下:

   @Overridepublic boolean shouldOverrideUrlLoading(WebView view, String url) {//支付宝if (url.startsWith(ALIPAYS_SCHEME)) {try {Intent intent = new Intent();intent.setAction(Intent.ACTION_VIEW);intent.setData(Uri.parse(url));startActivity(intent);} catch (ActivityNotFoundException e){Toast.makeText(DemoActivity.this, "请安装支付宝客户端", Toast.LENGTH_LONG).show();} catch (Exception e) {e.printStackTrace();}return true;}view.loadUrl(url);return true;}

到此,一切正常。突然有一天,测试过来找到我,接入的购票系统,用支付宝支付的时候,手机有安装支付宝却提示未安装。
我说我不信,在演示一下,问题复现了。我自言自语到:不可能啊!!!后来开始排查,跳转支付宝的链接,如下:

//url中删除了敏感信息
alipay://alipayclient/?%7b%22requestType%22%3a%22SafePay%22%2c%22dataString%22%3a%22dispatch_cluster_target%3dmrmapi%26ord_amt%3d8.00%26_input_charset%3dUTF-8%26sign%3dfhpN0rJGyfGCZXg%253D%253D%26ord_cur%3dCNY%26ord_id_ext%3dM2020087%26alipay_exterface_invoke_assign_target%3dcreateAndPayByBuyer.htm%26%26alipay_exterface_invoke_assign_client_ip%3d47.94.97.52%26bizcontext%3d%7b%5c%22appkey%5c%22%3a%5c%22201%5c%22%7d%22%2c%22fromAppUrlScheme%22%3a%22%22%7d

alipay://alipayclient,查了下这个链接,需要集成支付宝SDK在应用内打开支付宝,
上面的链接是经过url编码的,可以使用在线url解码,看下解码后的结果:

alipay://alipayclient/?{
"requestType":"SafePay",
"dataString":"dispatch_cluster_target=mrmapi&ord_amt=8.00&_input_charset=UTF-8&sign=fhpN0rJGyfGCZXg%3D%3D&ord_cur=CNY&ord_id_ext=M2020087&alipay_exterface_invoke_assign_target=createAndPayByBuyer.htm&&alipay_exterface_invoke_assign_client_ip=47.94.97.52&bizcontext={\"appkey\":\"201\"}",
"fromAppUrlScheme":""
}

其中,dataString便是对应的是订单信息。支付宝API需要传入。基本分为3步:
1.对Url进行解码
2.解码后以?号进行分割,对第二部分进行json解析
3.拿到字段dataString传入支付宝API进行调用

支付宝SDK及Demo下载

代码如下:

  private void startAlipaySDK(String url) {//? 号分割,?后面为订单参数String[] urlSplit = url.split("\\?");if (urlSplit.length > 1) {try {String data = urlSplit[1];if (TextUtils.isEmpty(data)) {Toast.makeText(DemoActivity.this, "调用失败, Toast.LENGTH_LONG).show();return ;}//对url进行解码,解码后解析String decodeUrl = URLDecoder.decode(data, "UTF-8");JSONObject obj = new JSONObject(decodeUrl);//订单信息String orderInfo = obj.getString("dataString");// 必须异步调用new Thread(() -> {PayTask alipay = new PayTask(X5WebActivity.this);//如果需要处理回调,可把result发送Handler消息,在handler中处理Map<String, String> result = alipay.payV2(orderInfo, true);}).start();} catch (Exception e) {e.printStackTrace();}}else{Toast.makeText(DemoActivity.this, "调用失败, Toast.LENGTH_LONG).show();}}

拦截Url中的最终代码:

 @Overridepublic boolean shouldOverrideUrlLoading(WebView view, String url) {//支付宝if (url.startsWith(ALIPAYS_SCHEME)) {try {Intent intent = new Intent();intent.setAction(Intent.ACTION_VIEW);intent.setData(Uri.parse(url));startActivity(intent);} catch (ActivityNotFoundException e){if (url.startsWith("alipay://alipayclient")) {//调用支付宝SDK打开startAlipaySDK(url);}else{Toast.makeText(this, "请安装支付宝").show();}} catch (Exception e) {e.printStackTrace();}return true;}view.loadUrl(url);return true;}

Android H5调起支付宝相关推荐

  1. Android H5页面调起微信和支付宝付款

    一.前提条件:后端已经生成了支付链接 微信是支持H5在非微信内核的浏览器调起支付的,只是流程很麻烦,需要企业账号申请才行,并且周期较长.微信官方开通说明 申请入口:登录商户平台–>产品中心–&g ...

  2. android 浏览器打开微信支付宝,Android通过webview调起微信和支付宝app进行支付

    extraHeaders = new HashMap(); // extraHeaders.put("Referer", "http://zxpay.fss518.cn& ...

  3. android webview调js方法,Android中WebView与H5的交互,Native与JS方法互调

    项目中经常用到WebView与H5的交互,一个是H5调本地方法,一个是本地调H5方法,在此记录一下. 首先,启用JS支持 //启用js支持 webSettings.setJavaScriptEnabl ...

  4. android通过webview调起支付宝app支付

    android通过webview调起支付宝app支付 webview在加载网页的时候会默认调起手机自带的浏览器加载网页,用户体验不好.但当用户设置浏览器客户端(setWebViewClient)设置这 ...

  5. iOS H5原生WKWebView调起支付宝客户端支付方案

    iOS H5原生WKWebView调起支付宝客户端支付方案 问题描述: 安卓直接WebView加载上面的URL直接可完成跳转支付宝弹出支付界面: iOS WKWebView加载这个URL,只是单纯加载 ...

  6. h5调微信支付 unkonw url_h5移动端调用支付宝、微信支付的实现

    公司项目之前已有支付宝支付,现要求增加微信支付,第一次做,摸着石头过河!结果是满意的. 废话就不说了直接上代码: var aliChannel = null; var wxChannel = null ...

  7. Android APP如何实现支付宝支付

    一.背景介绍: 业务需求需要,故加入支付宝支付功能. 二.如何实现. 1.关于APP调用支付宝支付的大致流程: 商家APP调用支付宝提供的SDK,SDK再调用支付宝APP内的支付模块.如果用户已经安装 ...

  8. 抖音小程序调起支付宝支付php微擎代码和HTML代码

              抖音小程序调起支付宝支付php微擎代码和HTML代码 内部订单号生成后,下一步调支付宝支付.内部订单号没有成功的看https://blog.csdn.net/weixin_3761 ...

  9. android支付宝支付微信支付封装,如何在Android App中集成支付宝和微信支付功能

    前言 本文主要介绍如何在 Android App 里集成支付宝和微信支付的功能,文中将实现的步骤一步步介绍的非常详细,对同样遇到这个问题的朋友相信会是一个很好的参考,下面话不多说了,来一起看看详细的介 ...

最新文章

  1. 《ASP.NET 2.0开发指南》随书光盘 安装问题
  2. 语音信号短时域分析之预处理(三)
  3. 数据结构与算法(1)——数组与链表
  4. JQuery学习使用笔记 -- JQuery插件开发
  5. [转]你所不知的 CSS ::before 和 ::after 伪元素用法
  6. 使用RabbitMQ实现松耦合设计
  7. java图像处理之幂律变换
  8. 【JEECG技术博文】JEECG表单配置-树形表单
  9. 确定比赛名次(HDU-1285)
  10. windows下的终端工具和产品力
  11. wpf 切换搜狗输入法英文_CPA《财管》考试,没时间按计算器,用搜狗V模式,真香!...
  12. ubuntu16.04下ROS操作系统学习笔记(六 )机器视觉-摄像头标定-ROS+OpenCv-人脸识别-物体跟踪-二维码识别
  13. 别了MongoDB?
  14. 某医院病房计算机管理数据库,毕业论文_数据库某医院病房计算机系统.doc
  15. 2018-4-25mysql数据库基础
  16. linux查看其他用户计划任务,Linux计划任务(crond、atd)
  17. 查看页面密码框明文密码
  18. python set去重
  19. java4android网易云_仿照网易云音乐界面 android特效
  20. 陆金所杨晓军:金融与区块链结合将…

热门文章

  1. 蓝桥七届 四平方和 JAVA
  2. 工程项目施工管理,这些你都做到了吗?
  3. 这些年掘金上的优质前端文章,篇篇经典,一次打包带走!
  4. 查看电脑重启日志_详解各个系统主机日志及数据库日志收集--AIX、redhat、HP-UX等...
  5. IDEA Maven项目中,pom.xml文件显示为橘红色普通xml文件,将pom文件变为蓝色图标
  6. Android 微博长图加载
  7. json解析函数c语言,C语言解析json类型数据
  8. 2022目前三种有效加速国内Github
  9. 导弹六自由度仿真模型,图1所有模块都给,对学习MATLAB/simulink搭建模型很有帮助。
  10. Oracle 11g RAC安装--基于openfiler存储+多路径+udev方式