功能描述

  • 1、webView加载H5页面
  • 2、点击微信支付,调起微信客户端支付
  • 3、支付完成,返回APP

操作流程

  • 1、调起微信的项目设置

选中‘TARGETS’一栏,在‘info’中的‘LSApplicationQueriesSchemes’添加‘weixin’,已添加过的可以忽略此步骤
  • 2、H5拦截微信支付请求,跳转微信

  • 2.1 WKWebView

// 实际使用时可以拦截weixin://wap/pay前缀的判断
#pragma mark - WKNavigationDelegate
//! WKWeView在每次加载请求前会调用此方法来确认是否进行请求跳转
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {// 先打印此方法拦截的所有请求// NSLog(@"\n ==== %@" ,navigationAction.request.URL.absoluteString);// decisionHandler(WKNavigationActionPolicyAllow);// return ;NSURLRequest *request        = navigationAction.request;NSString     *scheme         = [request.URL scheme];if (![scheme isEqualToString:@"https"] && ![scheme isEqualToString:@"http"]) {if ([scheme isEqualToString:@"weixin"]) {decisionHandler(WKNavigationActionPolicyCancel);BOOL canOpen = [[UIApplication sharedApplication] canOpenURL:request.URL];if (canOpen) {[[UIApplication sharedApplication] openURL:request.URL];}return;}decisionHandler(WKNavigationActionPolicyAllow);}decisionHandler(WKNavigationActionPolicyAllow);
}
  • 2.2 UIWebView

NSString *reqUrl = request.URL.absoluteString;if ([reqUrl hasPrefix:@"weixin://"]) {if([[UIApplication sharedApplication] openURL:[NSURL URLWithString:reqUrl]]) {[[UIApplication sharedApplication] openURL:[NSURL URLWithString:reqUrl]];} else {[DLLoading DLToolTipInWindow:@"请安装微信"];return NO;}}
  • 3、APP端更改redirect_url,实现回到APP

调用支付的时候一定会有一条URL::https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb&redirect_url =**********,通过测试得出支付返回的时候会加载redirect_url,当你的redirect_url是网址的时候,必定会跳转到浏览器,浏览器有个特性就是当你的url是****://的时候,会查找你的schemes(iOS系统应该在跳转浏览器之前自己有了判断是网址才进浏览器,****://直接会调用APP),从而可以跳转到APP,所以要修改这个redict_url的值为你的schemes的值加上://,就实现跳转回APP。

  • 3.1 WKWebView

- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {NSURLRequest *request = navigationAction.request;NSString *absoluteString = [navigationAction.request.URL.absoluteString stringByRemovingPercentEncoding];// 拦截WKWebView加载的微信支付统一下单链接, 将redirect_url参数修改为唤起自己App的URLSchemeif ([absoluteString hasPrefix:@"https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb"] && ![absoluteString hasSuffix:[NSString stringWithFormat:@"redirect_url=a1.company.com://wxpaycallback/"]]) {decisionHandler(WKNavigationActionPolicyCancel);NSString *redirectUrl = nil;if ([absoluteString containsString:@"redirect_url="]) {NSRange redirectRange = [absoluteString rangeOfString:@"redirect_url"];redirectUrl = [[absoluteString substringToIndex:redirectRange.location] stringByAppendingString:[NSString stringWithFormat:@"redirect_url=a1.company.com://wxpaycallback/"]];} else {redirectUrl = [absoluteString stringByAppendingString:[NSString stringWithFormat:@"redirect_url=a1.company.com://wxpaycallback/"]];}NSMutableURLRequest *newRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:redirectUrl] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:30];newRequest.allHTTPHeaderFields = request.allHTTPHeaderFields;newRequest.URL = [NSURL URLWithString:redirectUrl];[webView loadRequest:newRequest];return;}decisionHandler(WKNavigationActionPolicyAllow);return;
}
  • 3.2UIWebView

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {static const NSString*schemeString =@"a1.company.com";static const NSString*redirectString =@"redirect_url";//更改微信参数redirect_urlif ([reqUrl hasPrefix:jumpString] && ![reqUrl containsString:changeredirectString]) {dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{dispatch_async(dispatch_get_main_queue(), ^{NSRange redirectRange = [reqUrl rangeOfString:@"redirect_url"];//更改reidrect_url为scheme地址NSString *redirectUrl = [[reqUrl substringToIndex:redirectRange.location] stringByAppendingString:changeredirectString];//记录本来跳转的地址 用于APP回来之后的刷新NSArray *reloadArr = [reqUrl componentsSeparatedByString:@"redirect_url="];if (reloadArr.count > 1) {self.reloadURL = [[reloadArr lastObject] stringByRemovingPercentEncoding];} else {self.reloadURL = [NSString stringWithFormat:@"https:%@",schemeString];}//发送请求NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:redirectUrl] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10.0];[request setHTTPMethod:@"GET"];//referer为空会提示"出现商家参数格式有误,请联系商家解决"//设置Referer 此地址必须注册到商户后台[request setValue:@"jxjywechat.cdeledu.com://" forHTTPHeaderField:@"Referer"];[self.webView loadRequest:request];});});return NO;}

注:a1.company.com 为微信后台注册二级域名(服务端人员提供)
一级域名也可以,其中一级域名格式www.xxx.com,二级域名格式xxx.xxx.com
[request setValue:a1.company.com :// forHTTPHeaderField: @"Referer"];
这个a1.company.com :// 后面的://一定要加,这个实际是你要跳转的地址,就是你支付后回跳到你的APP的地址

  • 4、重新加载正确的url

上一步回来的时候是个白屏,因为你的url是错误的,H5也不能识别,所以我们要重新加载之前保存的正确的url

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {NSString *reqUrl = request.URL.absoluteString;if ([reqUrl isEqualToString:[NSString stringWithFormat:@"%@://",schemeString]]) {dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{dispatch_async(dispatch_get_main_queue(), ^{NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:self.reloadURL] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10.0];[self.webView loadRequest:request];});});return NO;}
return YES;
}
  • 5、URL Types配置

选中‘TARGETS’一栏,在‘info’中的‘URL Types’添加一项,URL Schemes 填写‘a1.company.com’

  • 6、支付取消或完成后跳转到APP内

也可以在payResult中执行step4的操作

AppDelegate中实现
// iOS 9.0
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options {if ([url.absoluteString containsString:@"account.test.com://"]) {[[NSNotificationCenter defaultCenter] postNotificationName:@"test" object:url];}return YES;
}WebViewController中实现
在viewDidLoad中监听
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(payResult:) name:@"test" object:nil];- (void)payResult:(NSNotification *)noti {}

注:在shouldStartLoadWithRequest代理方法中执行的这几个操作 都需要在if中return NO,否则会出现连续跳转的问题

iOS H5微信支付总结相关推荐

  1. 解决ios H5微信支付不能跳回App的问题

    解决ios H5微信支付不能跳回App的问题 app项目是uni-app开发的安卓和iOS版本,安卓测试无问题,以下主要说iOS的解决方案. 问题点:app用webview打开H5页面,在H5页面发起 ...

  2. ios浏览器微信支付回调页面_iOS集成H5微信支付实现跳转与回调的解决方案

    前言 最近有个需求,不能在iOS客户端内集成支付宝和微信的App支付SDK(为了防苹果审核检测SDK),因此使用H5支付,虽然微信和支付宝的H5支付文档都说不要在App内使用H5支付而是使用App支付 ...

  3. iOS WKWebView H5微信支付跳转

    iOS WKWebView H5微信支付跳转 需求:iOS客户端实现嵌入H5进行微信支付跳转到微信客户端,支付完成后再跳转回我们的APP,解决WKWebView无法跳转回APP的BUG. 阅读前提: ...

  4. h5 微信支付 php,用h5做出微信的支付过程的实现步骤

    这次给大家实现的案例是用户在微信里打开网页的时候,也可以调用微信支付来完成下单功能.当然,微信官网的,开发文档也有很详细的介绍,但是今天我们来教大家怎样手动做出支付接口的开发. 以提交问题流程为例描述 ...

  5. 微信h5支付“网站域名ICP备案主体与商户号主体不一致”的解决方法,H5微信支付 授权函下载

    微信h5支付"网站域名ICP备案主体与商户号主体不一致"的解决方法,H5微信支付 授权函下载 参考文章: (1)微信h5支付"网站域名ICP备案主体与商户号主体不一致&q ...

  6. 关于IOS调用微信支付jsapi不起作用的解决方法

    关于IOS调用微信支付jsapi不起作用的解决方法 参考文章: (1)关于IOS调用微信支付jsapi不起作用的解决方法 (2)https://www.cnblogs.com/randy619/p/5 ...

  7. android WebView套壳 H5微信支付

         看博客,首先得看日期,首先吐槽下,第一次做webview  套壳的android  APP  ,项目有微信支付这一块,就百度搜 看别人的博客,有的说android  webview H5 微 ...

  8. php苹果h5微信支付白屏,iOS 微信h5支付 返回APP显示支付结果

    作者:QuinceyYang (YangQing) 一.解决UIWebView页面不能调起微信支付 - (BOOL)webView:(UIWebView *)webView shouldStartLo ...

  9. ios调用微信支付提示当前页面的URL未注册

      ios调用JSAPI微信支付提示"当前页面的URL未注册",而页面手动刷新后再次支付则正常,安卓也正常,肯定不是授权目录配置问题.   在微信支付页面,当通过JSAPI微信支付 ...

最新文章

  1. 分布式工具的一次小升级⏫
  2. 6、日期格式化(DateFormat类和SimpleDateFormat类)
  3. sysfs API总结
  4. LeetCode(709)——转换成小写字母(JavaScript)
  5. 微软Windows家族一览 从1.0到Longhorn
  6. Bailian4098 第二大价值【排序+最值】
  7. 《21天学通Java(第6版)》—— 1.6 总结
  8. 简单常用的10个excel公式
  9. MFC界面库BCGControlBar v32.0 - 网格、报表控件升级
  10. RT-Thread:STM32F407虚拟U盘,无法识别拔出问题解决方案
  11. Pycharm专业版安装详细教程!
  12. No compiler is provided in this environment. Perhaps you are run
  13. 2022全球与中国瞬态发生器市场现状及未来发展趋势
  14. Google实时文字翻译背后的技术
  15. woo语言实现 m3u8流媒体视频文件 下载并播放
  16. 6000+个景点数据可视化,国庆出游避免拥挤,这一篇就够了
  17. 远东宏信2018年收入254亿元,同比大幅增长35%
  18. vs2008安装问题
  19. 010_电商实时交易风控系统_第5天(行业知识、需求分析、架构设计、代码开发) ---没用...
  20. 上网入门之Skype软件介绍

热门文章

  1. 计算机系统设置采购销售,2- 药品经营企业计算机系统培训考试试题
  2. 【职场必备的8项竞争力】修炼七:演讲力——让演讲成为加分项
  3. 网商大智慧:走出淘宝创业迷局
  4. kurento 6.14.0文档翻译 第一章 关于kurento与webrtc
  5. 前端使用pako对数据进行压缩与解压
  6. Android:解决华为手机隐藏虚拟按键Activity被重新创建的问题
  7. python dtype o_python - 什么是dtype('O')? - 堆栈内存溢出
  8. Android非常规BUG之createView AndroidRuntime(29797)
  9. QQ群计数器统计器使用教程
  10. 判断单链表的对称性-链表