热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

iOSAPP实现微信H5支付示例总结

这篇文章主要介绍了iOSAPP实现微信H5支付示例总结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

微信H5支付流程

1、发起下单请求(调用统一下单接口)注:交易类型trade_type=MWEB

2、统一下单接口返回支付相关参数给商户后台,如支付跳转url(参数名“mweb_url”),商户通过mweb_url调起微信支付中间页。如:https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb?prepay_id=wx27142704550165900edae5270331515985&package=600759311&redirect_url=http%3a%2f%2www.baidu.com

3、中间页进行H5权限的校验,安全性检查(具体错误见微信官方文档)

4、如果权限校验成功,微信支付中间页会发起支付请求。请求完毕跳到回调页面(由redirect_url决定)。APP需要在webView中监听这个请求,打开微信进行支付。如:weixin://wap/pay?prepayid%3Dwx2718114258281033efb8751f1574826586&package=2965581453&nOncestr=1545905512&sign=cb0f6dbd067549a04aada9c3eef09aac

5、微信支付完毕跳回APP。

Referer和redirect_url说明

HTTP Referer是header的一部分,当浏览器向web服务器发起请求的时,一般会带上Referer,告诉服务器我是从哪个页面链接过来。微信中间页会对Referer进行校验,非安全域名将不能正常加载。
redirect_url是微信中间页唤起微信支付之后,页面重定向的地址。中间页唤起微信支付后会跳转到指定的redirect_url。并且微信APP在支付完成时,也是通过redirect_url回调结果,redirect_url一般是一个页面地址,所以微信支付完成会打开Safari浏览器。本文通过修改redirect_url,实现微信支付完毕跳回当前APP。

注意:微信会校验Referer(来源)和redirect_url(目标)是否是安全域名。如果不传redirect_url,微信会将Referer当成redirect_url,唤起支付之后会重定向到Referer对应的页面。
建议带上redirect_url。

代码实现

1、info.plist配置scheme

需要将微信H5支付的安全域名配置成scheme,微信支付完成会通过这个scheme跳转回APP。

CFBundleURLTypes
 
  
   CFBundleTypeRole
   Editor
   CFBundleURLName
   wxPay
   CFBundleURLSchemes
   
微信scheme(安全域名)  
  
 

LSApplicationQueriesSchemes
 
  wechat
  weixin

2、拦截微信中间页,截取redirect_url

再shouldStartLoadWithRequest:方法里面拦截微信中间页(以“https://wx.tenpay.com”开头的请求),截取redirect_url,如果redirect_url已经被替换成scheme不拦截,如果没有被替换,拦截请求,保存当前的redirect_url。创建一个新的微信中间页请求,将redirect_url替换成“安全域名://”(微信支付完毕会通过openURL打开当前APP,如果不替换redirect_url,微信支付完毕会打开Safari浏览器。)。设置“Referer”为安全域名(微信会校验Referer,不是安全域名会加载失败),重新load请求。

//这个referer和安全域名以及配置在info.plist中scheme一致
 NSString *referer = [NSString stringWithFormat:@"%@://",wxScheme];
  if ([newUrl rangeOfString:@"https://wx.tenpay.com"].location != NSNotFound) {
   //截取redirect_url对应的值
   NSDictionary *params = [HJStringHelper getUrlParam:newUrl];
   NSString *backUrl = params[@"redirect_url"];
   if ([backUrl isEqualToString:referer]) {
   //截取redirect_url被替换成referer,不拦截
    return YES;
   }else{
    //记录当前的redirectUrl,并拦截请求
    self.redirectUrl = [HJStringHelper decodeURL:backUrl];
    dispatch_async(dispatch_get_main_queue(), ^{
     NSRange range = [newUrl rangeOfString:@"redirect_url="];
     NSString *reqUrl;
     if (range.length>0) {
      reqUrl = [newUrl substringToIndex:range.location+range.length];
      reqUrl = [reqUrl stringByAppendingString:referer];
     }else{
      reqUrl = [newUrl stringByAppendingString:[NSString stringWithFormat:@"&redirect_url=%@",referer]];
     }
     NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:reqUrl] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];
     //设置授权域名
     [request setValue:referer forHTTPHeaderField:@"Referer"];
     [self.webView loadRequest:request];
    });
    return NO;
   }
  }

2、拦截微信中间页中打开微信请求

微信中间页加载成功后,会收到一个打开微信的请求,用openURL:打开这个url实现跳转到微信支付。

 if([newUrl rangeOfString:@"weixin://wap/pay"].location != NSNotFound){
   if ([[UIApplication sharedApplication] canOpenURL:url]) {
    if (@available(iOS 10.0, *)){
     [[UIApplication sharedApplication] openURL:url options:@{} completionHandler:nil];
    }else{
     [[UIApplication sharedApplication] openURL:url];
    }
   }else{
   }
   return NO;
  }

3、加载重定向地址

微信中间页跳转到微信时,会将页面从定向到redirect_url,由于redirect_url被我们修改为scheme,所以需要拦截这个非法的scheme请求,替换成记录下的redirect_url。

 if([newUrl isEqualToString:referer]){
   dispatch_async(dispatch_get_main_queue(), ^{
    if (self.redirectUrl) {
     //注意,这个地方需要对redirectUrl解码,因为截取的redirectUrl被完全编码了,需要先解码才能加载
     self.redirectUrl = [HJStringHelper decodeURL:self.redirectUrl];
     
     NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:[HJStringHelper encodeURL:self.redirectUrl]] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];
     [self.webView loadRequest:request];
     self.redirectUrl = nil;
    }
   });
   return NO;
  }

完整代码如下

以UIWebView为例

-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType{
 //添加微信支付功能
 NSURL *url = [request URL];
 NSString *newUrl = url.absoluteString;
 //获取微信安全域名
 NSString *wxScheme = [h5WXPayScheme copy];
 if (wxScheme.length>0) {
 //使用安全域名拼接referer
  NSString *referer = [NSString stringWithFormat:@"%@://",wxScheme];
  if ([newUrl rangeOfString:@"https://wx.tenpay.com"].location != NSNotFound) {
   
   NSDictionary *params = [HJStringHelper getUrlParam:newUrl];
   NSString *backUrl = params[@"redirect_url"];
   if ([backUrl isEqualToString:referer]) {
    return YES;
   }else{
    self.redirectUrl = [HJStringHelper decodeURL:backUrl];
    dispatch_async(dispatch_get_main_queue(), ^{
     NSRange range = [newUrl rangeOfString:@"redirect_url="];
     NSString *reqUrl;
     if (range.length>0) {
      reqUrl = [newUrl substringToIndex:range.location+range.length];
      reqUrl = [reqUrl stringByAppendingString:referer];
     }else{
      reqUrl = [newUrl stringByAppendingString:[NSString stringWithFormat:@"&redirect_url=%@",referer]];
     }
     NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:reqUrl] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];
     //设置授权域名
     [request setValue:referer forHTTPHeaderField:@"Referer"];
     [self.webView loadRequest:request];
    });
    return NO;
   }
  }else if([newUrl rangeOfString:@"weixin://wap/pay"].location != NSNotFound){
   if ([[UIApplication sharedApplication] canOpenURL:url]) {
    if (@available(iOS 10.0, *)){
     [[UIApplication sharedApplication] openURL:url options:@{} completionHandler:nil];
    }else{
     [[UIApplication sharedApplication] openURL:url];
    }
   }else{
    
   }
   return NO;
  }else if([newUrl isEqualToString:referer]){
   dispatch_async(dispatch_get_main_queue(), ^{
    if (self.redirectUrl) {
     
     self.redirectUrl = [HJStringHelper decodeURL:self.redirectUrl];
     
     NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:[HJStringHelper encodeURL:self.redirectUrl]] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];
     [self.webView loadRequest:request];
     self.redirectUrl = nil;
    }
   });
   return NO;
  }
 }
 return [super webView:webView shouldStartLoadWithRequest:request navigationType:navigationType];
}

还有一篇文章讲的是H5支付封装,H5支付不仅可以在网页上使用,原生也可以调用。具体内容见:iOS-H5支付(微信、支付宝)原生封装

到此这篇关于iOS APP实现微信H5支付示例总结的文章就介绍到这了,更多相关iOS APP实现微信H5支付内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!


推荐阅读
  • 小程序引入外部文件的方式是:import**.wxss;因为业务需要,正在开发的小程序中需要使用iconfont,很容易想到了H5的引 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • 禁止程序接收鼠标事件的工具_VNC Viewer for Mac(远程桌面工具)免费版
    VNCViewerforMac是一款运行在Mac平台上的远程桌面工具,vncviewermac版可以帮助您使用Mac的键盘和鼠标来控制远程计算机,操作简 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • macOS Big Sur全新设计大版本更新,10+个值得关注的新功能
    本文介绍了Apple发布的新一代操作系统macOS Big Sur,该系统采用全新的界面设计,包括图标、应用界面、程序坞和菜单栏等方面的变化。新系统还增加了通知中心、桌面小组件、强化的Safari浏览器以及隐私保护等多项功能。文章指出,macOS Big Sur的设计与iPadOS越来越接近,结合了去年iPadOS对鼠标的完善等功能。 ... [详细]
  • 手把手教你使用GraphPad Prism和Excel绘制回归分析结果的森林图
    本文介绍了使用GraphPad Prism和Excel绘制回归分析结果的森林图的方法。通过展示森林图,可以更加直观地将回归分析结果可视化。GraphPad Prism是一款专门为医学专业人士设计的绘图软件,同时也兼顾统计分析的功能,操作便捷,可以帮助科研人员轻松绘制出高质量的专业图形。文章以一篇发表在JACC杂志上的研究为例,利用其中的多因素回归分析结果来绘制森林图。通过本文的指导,读者可以学会如何使用GraphPad Prism和Excel绘制回归分析结果的森林图。 ... [详细]
  • 本文介绍了互联网思维中的三个段子,涵盖了餐饮行业、淘品牌和创业企业的案例。通过这些案例,探讨了互联网思维的九大分类和十九条法则。其中包括雕爷牛腩餐厅的成功经验,三只松鼠淘品牌的包装策略以及一家创业企业的销售额增长情况。这些案例展示了互联网思维在不同领域的应用和成功之道。 ... [详细]
  • Windows7企业版怎样存储安全新功能详解
    本文介绍了电脑公司发布的GHOST WIN7 SP1 X64 通用特别版 V2019.12,软件大小为5.71 GB,支持简体中文,属于国产软件,免费使用。文章还提到了用户评分和软件分类为Win7系统,运行环境为Windows。同时,文章还介绍了平台检测结果,无插件,通过了360、腾讯、金山和瑞星的检测。此外,文章还提到了本地下载文件大小为5.71 GB,需要先下载高速下载器才能进行高速下载。最后,文章详细解释了Windows7企业版的存储安全新功能。 ... [详细]
  • 前言作为一个移动端初学者、爱好者,能使用前端技术开发原生游戏一直是一件渴望而不可及的事情,暂且不说游戏逻辑的复杂度,算法的健壮性ÿ ... [详细]
  • 今天凌晨开始苹果正式开始了iOS10的推送工作,使用iPhone和iPad的用户可 ... [详细]
  • 《Axure新技能:自适应手机屏幕大小》相信不少人都已经看过,并对设置方法已经很熟悉了,但该教程只能适应iphone6的屏幕尺寸的比例&# ... [详细]
  • vue 地图使用navigator_weex踩坑之旅第五弹 ~ 使用navigator内置模块实现导航
    目前,我个人认为在weex中实现页面跳转的方式有两种,一种是通过weex提供的navigator模块,一种是通过vue-router之类的 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • H5前端开发_金三银四,H5前端开发如何用性能优化征服前端面试官?
    本文由编程笔记#小编为大家整理,主要介绍了金三银四,H5前端开发如何用性能优化征服前端面试官?相关的知识,希望对你有一定的参考价值。许多Web性能优化都是无效的,问题出在哪 ... [详细]
author-avatar
tommy来了
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有