热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Swift与H5交互:跳转拦截完成支付功能

Swift与H5交互:跳转拦截完成支付功能-这是我参与更文挑战的第7天,活动详情查看:[更文挑战]与H5交互不得不说的事最近上班一直都在和公司的其他项目的人员忙活App原生(双

这是我参与更文挑战的第7天,活动详情查看: [更文挑战]

与H5交互不得不说的事

最近上班一直都在和公司的其他项目的人员忙活App原生(双端)与H5交互的事情,因为遇到了需求方非常质疑的态度(主要是感觉方案不可行),导致需要进行验证与尝试。

虽然,在原生与H5的交互上,我基本都了解情况,不过在此机会也记录一下,就当存档的吧。

后面再遇到这类问题,给自己抑或掘友们一点点启发与思路。

今天说先说一个业务需求。

App内嵌H5页面进行支付

事情大概是这样的,我们团队的前端做了一个Web页面,是一个商城类型,有支付功能,可以进行微信和支付宝支付。

这个Web页面在浏览器中支付跳转,不管是跳转到微信支付或者是支付宝支付都是好好的,但集成到移动端App里面的WebView后,就不生效了。

前端的同事感到疑惑后找到了我,寻求如何在App端跳转微信或者支付宝进行支付的方案。

我直接就下了结论:App什么都不做,这明摆着不能的呀?虽然H5大部分时间都能都为所欲为,但这类Web页面在App中需要进行跳转,必须在App端进行跳转拦截与处理呀。

说到这里,必须上代码来演示了。

在iOS中WKWebKit中的WebView有一个代理属性WKNavigationDelegate,其中有这样一个代理方法:

/// 根据WebView对于即将跳转的HTTP请求头信息和相关信息来决定是否跳转
///
/// - Parameters:
///   - webView: 实现该代理的webview
///   - navigationAction: 当前navigation
///   - decisionHandler: 是否跳转block
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
    decisionHandler(.allow)
}

这里面,一个非常重要的参数,navigationAction,我们来看看它的类WKNavigationAction里面有哪些属性:

@available(iOS 8.0, *)
open class WKNavigationAction : NSObject {

    
    /** @abstract The frame requesting the navigation.
     */
    @NSCopying open var sourceFrame: WKFrameInfo { get }

    
    /** @abstract The target frame, or nil if this is a new window navigation.
     */
    @NSCopying open var targetFrame: WKFrameInfo? { get }

    
    /** @abstract The type of action that triggered the navigation.
     @discussion The value is one of the constants of the enumerated type WKNavigationType.
     */
    open var navigationType: WKNavigationType { get }

    
    /** @abstract The navigation's request.
     */
    open var request: URLRequest { get }

    
    /** @abstract A value indicating whether the web content used a download attribute to indicate that this should be downloaded.
    */
    @available(iOS 14.5, *)
    open var shouldPerformDownload: Bool { get }
}

注意看其中有一个属性是open var request: URLRequest { get }通过这个属性,我们可以获取到需要跳转的URL的内容,针对我们跳转微信支付或者支付宝支付,我们只用判断request中的scheme和url字符串就可以了。

而这方面支付宝的官方文档中就给出了明确的例子:

App通过监听alipays://或者alipay:// 开头的路由来唤醒支付宝。

支付宝文档

- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler
{
    __weak APWebViewController* wself = self;
    NSString * reqUrl = navigationAction.request.URL.absoluteString;
    if ([reqUrl hasPrefix:@"alipays://"] || [reqUrl hasPrefix:@"alipay://"]) {
        // NOTE: 跳转支付宝App
        BOOL bSucc = [[UIApplication sharedApplication]openURL:navigationAction.request.URL];
 
        // NOTE: 如果跳转失败,则跳转itune下载支付宝App
        if (!bSucc) {
            UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"提示"
                                                           message:@"未检测到支付宝客户端,请安装后重试。"
                                                          delegate:wself
                                                 cancelButtonTitle:@"立即安装"
                                                 otherButtonTitles:nil];
            [alert show];
        }
        
        decisionHandler(WKNavigationActionPolicyCancel);
        return;
    }
    
    decisionHandler(WKNavigationActionPolicyAllow);
}

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    // NOTE: 跳转itune下载支付宝App
    NSString* urlStr = @"https://itunes.apple.com/cn/app/zhi-fu-bao-qian-bao-yu-e-bao/id333206289?mt=8";
    NSURL *downloadUrl = [NSURL URLWithString:urlStr];
    [[UIApplication sharedApplication]openURL:downloadUrl];
}

而微信文档中明确说明了不建议App调用H5支付,见下图:

虽然微信文档不建议,但通过支付宝给出的代码,完全可以照抄,通过判断url中是否包含weixin://来进行跳转。

其实这类拦截跳转到最后,都会调用UIApplication.shared的一个函数:

open func open(_ url: URL, options: [UIApplication.OpenExternalURLOptionsKey : Any] = [:], completionHandler completion: ((Bool) -> Void)? = nil)

这个函数可以认为是一个系统级路由方法,可以在iOS系统层面进行App的切换。

结论

App通过WebView加载H5页面,进行支付功能是可行的,同时App端(双端)都需要进行WebView的跳转拦截,通过系统级路由去跳转到微信或者支付宝完成支付。

通过H5调用其他功能,比如打电话,也可以通过在上面所示的代理方法中判断是否包含tel://来进行处理。

微信支付不建议App调用H5支付,我个人认为是处于安全考虑,因为可能涉及恶意重定向拦截的request的url,导致指向其他订单,出现支付的异常扣款的情况。

明日继续

明天会继续更新原生调用js,和js调用原生的分析与例子。大家加油!


推荐阅读
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 本文介绍了UVALive6575题目Odd and Even Zeroes的解法,使用了数位dp和找规律的方法。阶乘的定义和性质被介绍,并给出了一些例子。其中,部分阶乘的尾零个数为奇数,部分为偶数。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 深入理解Kafka服务端请求队列中请求的处理
    本文深入分析了Kafka服务端请求队列中请求的处理过程,详细介绍了请求的封装和放入请求队列的过程,以及处理请求的线程池的创建和容量设置。通过场景分析、图示说明和源码分析,帮助读者更好地理解Kafka服务端的工作原理。 ... [详细]
  • 预备知识可参考我整理的博客Windows编程之线程:https:www.cnblogs.comZhuSenlinp16662075.htmlWindows编程之线程同步:https ... [详细]
  • 手把手教你使用GraphPad Prism和Excel绘制回归分析结果的森林图
    本文介绍了使用GraphPad Prism和Excel绘制回归分析结果的森林图的方法。通过展示森林图,可以更加直观地将回归分析结果可视化。GraphPad Prism是一款专门为医学专业人士设计的绘图软件,同时也兼顾统计分析的功能,操作便捷,可以帮助科研人员轻松绘制出高质量的专业图形。文章以一篇发表在JACC杂志上的研究为例,利用其中的多因素回归分析结果来绘制森林图。通过本文的指导,读者可以学会如何使用GraphPad Prism和Excel绘制回归分析结果的森林图。 ... [详细]
  • 1.webkit内核中的一些私有的meta标签,这些meta标签在开发webapp时起到非常重要的作用(1) ... [详细]
  • 博主使用代理IP来自于网上免费提供高匿IP的这个网站用到的库frombs4importBeautifulSoupimportrandomimporturllib.re ... [详细]
  • Material Design Lite ,简洁惊艳的前端工具箱。
    2019独角兽企业重金招聘Python工程师标准MaterialDesignLite简介本文主要介绍MaterialDesign设计语言的HTMLCSSJS部分实现。对应每一 ... [详细]
  • 小程序引入外部文件的方式是:import**.wxss;因为业务需要,正在开发的小程序中需要使用iconfont,很容易想到了H5的引 ... [详细]
  • h5页面在iOS上的问题解决
    1、ios移动端软键盘收起后,页面内容被顶上去,不下滑回原处代码如下: $(function(){$('input,textarea').on('bl ... [详细]
  • nginx 解决跨域问题 No: 'AccessControlAllowOrigin' header is present on the requested resource
    错误信息:1, ... [详细]
author-avatar
PLDLYY
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有