iOS WKWebView H5微信、支付宝支付跳转

iOS客户端实现嵌入H5进行支付跳转到客户端,支付完成后再跳转回自己的App时,解决WKWebView无法跳转回APP的BUG.

一、支付宝

- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {NSURLRequest *request        = navigationAction.request;NSString     *scheme         = [request.URL scheme];// decode for all URL to avoid url contains some special character so that it wasn't load.NSString     *absoluteString = [navigationAction.request.URL.absoluteString stringByRemovingPercentEncoding];NSLog(@"Current URL is %@",absoluteString);static NSString *endPayRedirectURL = nil;// 跳转到本地某宝Appif ([absoluteString hasPrefix:@"alipays://"] || [absoluteString hasPrefix:@"alipay://"]){NSURL *openedURL = navigationAction.request.URL;NSString *prefixString = @"alipay://alipayclient/?";NSString *urlString = [[self xh_URLDecodedString:absoluteString] stringByReplacingOccurrencesOfString:@"alipays" withString:@"自定义scheme"];;if ([urlString hasPrefix:prefixString]) {NSRange rang = [urlString rangeOfString:prefixString];NSString *subString = [urlString substringFromIndex:rang.length];NSString *encodedString = [prefixString stringByAppendingString:[self xh_URLEncodedString:subString]];openedURL = [NSURL URLWithString:encodedString];}BOOL isSucc = [[UIApplication sharedApplication] openURL:openedURL];if (!isSucc) {NSLog(@"未安装某宝客户端");}decisionHandler(WKNavigationActionPolicyCancel);return;}decisionHandler(WKNavigationActionPolicyAllow);
}- (NSString *)xh_URLDecodedString:(NSString *)urlString
{NSString *string = urlString;NSString *decodedString=(__bridge_transfer NSString *)CFURLCreateStringByReplacingPercentEscapesUsingEncoding(NULL, (__bridge CFStringRef)string, CFSTR(""), CFStringConvertNSStringEncodingToEncoding(NSUTF8StringEncoding));return decodedString;
}- (NSString *)xh_URLEncodedString:(NSString *)urlString
{NSString *string = urlString;NSString *encodedString = (NSString *) CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,(CFStringRef)string,NULL,(CFStringRef)@"!*'();:@&=+$,/?%#[]",kCFStringEncodingUTF8));return encodedString;
}

二、微信

1.在项目的Info.plist中添加一个URL Schemes(用于跳回我们项目),如下图所示

2.添加WKNavigationDelegate代理,并实现重定向代理方法,通过拦截微信链接以实现跳转

- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {NSURLRequest *request        = navigationAction.request;NSString     *scheme         = [request.URL scheme];// decode for all URL to avoid url contains some special character so that it wasn't load.NSString     *absoluteString = [navigationAction.request.URL.absoluteString stringByRemovingPercentEncoding];NSLog(@"Current URL is %@",absoluteString);static NSString *endPayRedirectURL = nil;// Wechat Pay, Note : modify redirect_url to resolve we couldn't return our app from wechat client.if ([absoluteString hasPrefix:@"https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb"] && ![absoluteString hasSuffix:[NSString stringWithFormat:@"redirect_url=%@%@://",kSchemePrefix,CompanyFirstDomainByWeChatRegister]]) {decisionHandler(WKNavigationActionPolicyCancel);#warning Note : The string "xiaodongxie.cn://" must be configured by wechat background. It must be your company first domin. You also should configure "URL types" in the Info.plist file.// 1. If the url contain "redirect_url" : We need to remember it to use our scheme replace it.// 2. If the url not contain "redirect_url" , We should add it so that we will could jump to our app.//  Note : 2. if the redirect_url is not last string, you should use correct strategy, because the redirect_url's value may contain some "&" special character so that my cut method may be incorrect.NSString *redirectUrl = nil;if ([absoluteString containsString:@"redirect_url="]) {NSRange redirectRange = [absoluteString rangeOfString:@"redirect_url"];endPayRedirectURL =  [absoluteString substringFromIndex:redirectRange.location+redirectRange.length+1];redirectUrl = [[absoluteString substringToIndex:redirectRange.location] stringByAppendingString:[NSString stringWithFormat:@"redirect_url=%@%@://",kSchemePrefix,CompanyFirstDomainByWeChatRegister]];}else {redirectUrl = [absoluteString stringByAppendingString:[NSString stringWithFormat:@"&redirect_url=%@%@://",kSchemePrefix,CompanyFirstDomainByWeChatRegister]];}NSMutableURLRequest *newRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:redirectUrl] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:XDX_URL_TIMEOUT];newRequest.allHTTPHeaderFields = request.allHTTPHeaderFields;newRequest.URL = [NSURL URLWithString:redirectUrl];[webView loadRequest:newRequest];return;}// Judge is whether to jump to other app.if (![scheme isEqualToString:@"https"] && ![scheme isEqualToString:@"http"]) {decisionHandler(WKNavigationActionPolicyCancel);if ([scheme isEqualToString:@"weixin"]) {// The var endPayRedirectURL was our saved origin url's redirect address. We need to load it when we return from wechat client.if (endPayRedirectURL) {[webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:endPayRedirectURL] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:XDX_URL_TIMEOUT]];}}else if ([scheme isEqualToString:[NSString stringWithFormat:@"%@%@",kSchemePrefix,CompanyFirstDomainByWeChatRegister]]) {}//        BOOL canOpen = [[UIApplication sharedApplication] canOpenURL:request.URL];//        if (canOpen) {//            [[UIApplication sharedApplication] openURL:request.URL];//        }if ([navigationAction.request.URL.absoluteString hasPrefix:@"weixin://"]) {[[UIApplication sharedApplication] openURL:navigationAction.request.URL];}return;}decisionHandler(WKNavigationActionPolicyAllow);
}

注:kSchemePrefix 自定义前缀,可任意填写
CompanyFirstDomainByWeChatRegister 微信一级域名
XDX_URL_TIMEOUT 超时时间

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/178778.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

力扣203:移除链表元素

力扣203:移除链表元素 题目描述: 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val val 的节点,并返回 新的头节点 。 示例 1: 输入:head [1,2,6,3,4,5,6], val 6 输出&a…

如何掌握项目管理的5个阶段?

项目管理协会(PMI)创建了一个五步项目管理流程,即从启动、规划、执行、监控到结束,为项目经理更好地管理项目提供了现成的基础。如果你正为范围蔓延、返工或项目总体混乱而苦恼,那么遵循项目管理的五个阶段&#xff0c…

【Java 进阶篇】Java与JQuery选择器:解锁前端开发的魔法大门

在前端开发的世界中,选择器是我们与HTML文档进行互动的钥匙,而Java和JQuery则为我们提供了强大的工具,使得前端开发不再是一个艰深的谜题。本篇博客将围绕Java与JQuery选择器展开,深入解析选择器的奥秘,为你打开前端开…

使用matlab实现图像信号的色彩空间转换

利用matlab对图像信号进行读取,并对RGB空间进行转换,如转换到HSI空间等。 下面的这个代码是在使用了rgb2hsi()方法失败后,进行修改的。 rgb2hsi(img)这个方法可以将RGB图像转换为HIS图像;但是爆出了 Untitled5(line 5)hsi rgb2h…

多数据源切换

多数据源切换 1.jdbcTemplate2.使用切面3.mybatis层次的多数据源4.spring的dynamic自动注入 项目中经常会有多个数据源,那么如何处理呢 有4种方法 准备: 创建两个数据库 CREATE SCHEMA test DEFAULT CHARACTER SET utf8mb4 ; CREATE SCHEMA school DEFA…

Power Automate-调用API

API:汇率查询API免费接口,汇率查询API接口付费定制-进制数据 在输出结果之前添加操作,搜索HTTP,点击绿色的图标 选择第一个 查看API详情对应填入到HTTP操作中,比如方法(请求方法)、URL(接口地址…

Javaweb之Vue的概述

2.1 Vue概述 通过我们学习的htmlcssjs已经能够开发美观的页面了,但是开发的效率还有待提高,那么如何提高呢?我们先来分析下页面的组成。一个完整的html页面包括了视图和数据,数据是通过请求 从后台获取的,那么意味着我…

[Linux] 网络文件共享服务

一、存储类型 存储类型可分为三类:DAS(直连式存储),NAS(网络附加存储),SAN(存储区域网络)。 1.1 DAS 定义: DAS是指直连存储,即直连存储,可以理解为本地文…

防爆五参数气象仪的科技力量

WX-FBQ2 随着科技的不断进步,气象监测设备也在不断升级和完善。 防爆五参数气象仪是一种可以同时监测温度、湿度、压力、风速和风向五个基本气象参数的仪器。它采用了气象监测技术,不仅可以实时监测气象数据,还可以对数据进行分析和处理。 …

Neo4j数据库介绍及简单使用

图数据库介绍 图数据库是一种专门设计用于存储和管理图形数据的数据库类型。在图数据库中,数据以图的形式表示,其中节点表示实体,边表示实体之间的关系。这种表示方式非常适合处理具有复杂关系的数据,如社交网络、推荐系统、网络…

excel中vlookup用法

excel中vlookup用法 用法示例 参数说明 参数1:E1用于匹配的字段 参数2:E1:F4,匹配表格范围 参数3:要取的字段属于匹配表格范围的第几列 数据4:精确匹配

【VBA】基于EXCEL生成Insert语句工具

前言 基于Excel生成INSERT语句工具是为了解决在数据库中插入大量数据时手动编写INSERT语句繁琐和耗时的问题而开发的辅助工具。在软件开发和数据库管理等领域,测试数据是非常重要的,它可以用于测试和验证数据库的性能、功能和准确性。 手动编写INSERT语…