一说支付,大多数人都会理解支付方式是下载微信和支付宝SDK进行支付,但是其实还有其他的方式,就是H5调用系统支付宝和微信进行支付。

H5支付可能很多人认为是加载完页面剩下的就是页面完成即可,但是实际没有那么简单。

下面介绍一下H5调用支付宝和微信支付。

首先是支付宝,支付宝在支付这一块是非常专业的他的代码也是非常简单的。既然是H5调用,那么就少不了网址拦截。这里加载页面我是使用的WebView

这里说一下,这里微信和支付宝都是使用这个方法里进行

- (BOOL) webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType) navigationType;

首先是支付宝,这里我们要拦截包含下面的内容的链接

alipay://alipayclient

下面就是代码了。

if([[request.URL absoluteString] containsString:@"alipay://alipayclient"]) {NSArray* urlBaseArr = [[request.URL absoluteString] componentsSeparatedByString:@"?"];NSString* urlBaseStr = urlBaseArr.firstObject;NSString* urlNeedDecode = urlBaseArr.lastObject;NSString* afterDecodeStr =[self URLDecodedString:urlNeedDecode];NSString* afterHandleStr = [afterDecodeStr stringByReplacingOccurrencesOfString:@"alipays" withString:@"设置的支付宝URLSchemes"];NSString* finalStr = [NSString stringWithFormat:@"%@?%@",urlBaseStr,[self URLEncodeString:afterHandleStr]];dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:finalStr]]) {[[UIApplication sharedApplication] openURL:[NSURL URLWithString:finalStr]];}});return NO;}

下面是上面代码中使用的两个方法

// OC 做URLEncode的方法- (NSString *)URLEncodeString:(NSString*)str {NSString *unencodedString = str;NSString *encodedString = (NSString *) CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,(CFStringRef)unencodedString,NULL,(CFStringRef)@"!*'();:@&=+$,/?%#[]", kCFStringEncodingUTF8));return encodedString;}- (NSString*)URLDecodedString:(NSString*)str {NSString *decodedString=(__bridge_transfer NSString *)CFURLCreateStringByReplacingPercentEscapesUsingEncoding(NULL, (__bridge CFStringRef)str, CFSTR(""), CFStringConvertNSStringEncodingToEncoding(NSUTF8StringEncoding));return decodedString;}

这样在点击支付宝支付的时候会直接调起支付宝完成支付,这里有一个重点,就是URLSchemes,如果不设置,取消支付或者支付完成,会直接进入safari浏览器,所以这里我们要设置一下

下来就是Appdelegate我们收到支付宝支付成功的回掉

// NOTE: 9.0以后使用新API接口- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options{NSString *urlStr = [NSString stringWithFormat:@"%@",url];if ([url.host isEqualToString:@"safepay"]) {// 支付跳转支付宝钱包进行支付,处理支付结果,此处发送通知,哪里需要接受通知处理,哪里就接受[[NSNotificationCenter defaultCenter]postNotificationName:@"AlipaySDK" object:nil userInfo:nil];}}

到此设置完成

下面是微信,微信就比较麻烦,没有支付宝简单,废话不多说直接上代码

if ([[request.URL absoluteString] rangeOfString:@"https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb?"].location != NSNotFound) {//设置redirect_url,如果存在redirect_url,那么需要替换redirect_url对应的值(替换内容为,自已公司支付的网页域名)NSString *redirect_url = @"&redirect_url=自已公司支付的网页域名";NSString *newUrl = [NSString stringWithFormat:@"%@%@",absoluteUrl,redirect_url];//字符串进行替换,让回调之后返回自己的appnewUrl = [newUrl stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];NSLog(@"newUrl - - - - - - %@",newUrl);NSMutableURLRequest *newRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:newUrl]];NSDictionary *headers = [request allHTTPHeaderFields];BOOL hasReferer = [headers objectForKey:@"Referer"]!=nil;if (hasReferer) {return YES;} else {dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{dispatch_async(dispatch_get_main_queue(), ^{NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:newUrl] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];[request setHTTPMethod:@"GET"];[request setValue:@"自已公司支付的网页域名://" forHTTPHeaderField: @"Referer"];[self.myWebView loadRequest:request];});});return NO;}}

到此我们就能完成了微信支付,但是当我们取消或者返回的时候就会出现就会返回safari浏览器,无法返回自己的app,这里很多人就会懵,这里很多人都会去查阅资料,说是在wx.tenpay.com这个链接后面拼接redirect_url='公司域名'这个操作,这里我重点说一下redirect_url这个问题,如果在这个链接后面带有redirect_url,那么redirect_url后面的更的跟的内容直接替换为域名,如果没有我们也不要去添加,本人实测加上也是会返回safari浏览器。

那我们要如何去设置内,我们要做的就是白名单,这个白名单就是我们从微信返回自己app的唯一表示,由于app是页面支付所以我们这个唯一标示URLSchemes必须为公司域名。这个域名必须指定形式如:www.baidu.com,与上面微信支付页面的代码块的的域名对应上。

当然这里我们也需要设置URLSchemes

下来就是Appdelegate我们收到微信支付成功的回掉

if ([urlStr rangeOfString:@"自已公司支付的网页域名"].location != NSNotFound) {//此处发送通知,哪里需要接受通知处理,哪里就接受[[NSNotificationCenter defaultCenter] postNotificationName:@"WeChatH5PayNotification" object:url.absoluteString];}
至此,H5支付完成。

微信支付要比支付宝支付墨迹一点,如果微信支付大家上述看不明白,我下面回复一个详细链接,本人也是看完这个博客才调同的微信支付,并且还附有demo。

简书地址:https://www.jianshu.com/p/90db7dfb075c

IOS唤起H5微信或支付宝收银台相关推荐

  1. iOS WKWebView H5微信支付跳转

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

  2. 实战:第六章:H5微信与支付宝调试错误,请回到请求来源地,重新发起请求。 错误代码 insufficient-isv-permissions

    H5支付宝支付 接人H5手机网站支付宝支付时,已经将表单发给页面了,支付宝响应调试错误,请回到请求来源地,重新发起请求. 错误代码 insufficient-isv-permissions 错误原因: ...

  3. h5唤起支付(微信和支付宝)

    h5调用微信支付 // 微信支付weChatPay(data){var vm= this;//下面是解决WeixinJSBridge is not defined 报错的方法if (typeof We ...

  4. 关于对接支付接口遇到的问题(微信和支付宝)

    目录 前言 问题 支付场景非法或请在微信外打开订单 微信公众号支付 错误chooseWXPay:fail, the permission value is offline verifying 其他支付 ...

  5. iOS H5页面调用微信或者支付宝进行支付

    一说支付,大多数人都会理解支付方式是下载微信和支付宝SDK进行支付,但是其实还有其他的方式,就是H5调用系统支付宝和微信进行支付. H5支付可能很多人认为是加载完页面剩下的就是页面完成即可,但是实际没 ...

  6. iOS H5 调用微信、支付宝支付无法返回app 解决方案

    最新项目中遇到H5页面中调用微信.支付宝客户端支付的需求,虽然这并不是推荐的做法,但是需求确实存在...加载h5页面点击支付调起需要支付的客户端(微信或者支付宝). 微信支付解决方案: 1.首先要设置 ...

  7. h5语音自动播报,能够兼容ios,安卓微信支付宝

    1.语音播报使用方式如下,由于安卓ios兼容性问题封装成不同组件 <!-- 安卓版微信.安卓.ios版支付宝--><common-audio ref="audioTip&q ...

  8. H5接入支付流程-微信支付支付宝支付

    业务场景: H5对接微信支付和支付宝支付,app无法发版,需要支持在app内和浏览器内同时使用. 于是借此机会对前端接入对第三方支付进行了调研,本次只讨论微信支付,和支付宝支付. 微信支付 文档地址: ...

  9. h5支付不能打开支付宝 ios_iOS实现H5支付(微信、支付宝)原生封装

    前言 支付分APP支付.H5支付.扫码支付等.app支付一般在app中使用,并且需要集成相应的支付SDK,H5支付多用于网页.如果你的APP不想集成支付SDK,又想实现支付功能,你可以在项目中使用H5 ...

最新文章

  1. SQL Server 2008 : 基于策略的管理(Policy-Based Management)
  2. 在服务器系统怎么设置地址怎么办,路由器怎么设置地址
  3. leetcode404. 左叶子之和
  4. 神经网络与深度学习——TensorFlow2.0实战(笔记)(五)(NumPy科学计算库<1>python)
  5. 一个好端端的团队是如何被管理者搞垮的?
  6. 有限差分法FDM和有限元法FEA比较
  7. 工具 - 文本比较/对比 - 收集
  8. 威廉玛丽学院计算机专业,威廉玛丽学院专业设置有哪些?
  9. 长春理工大学第八届电子设计大赛 之 开关电源(2)
  10. mysql if 多个,mysql多个if语句
  11. 5个免费好用的在线工具推荐,让你的工作效率提升百倍!
  12. 如何在Linux上的命令行中设置Google Chrome浏览器的代理设置?
  13. C#输出斐波那契数列
  14. 2天,我把MySQL索引、锁、事务、分库分表撸干净了!
  15. 大系统观:1.4时间之矢
  16. 全网页CSS 超链接无下划线
  17. 【原创】精品课程之PS快速抠图!50秒快速人像抠图!
  18. hihoCoder:#1082 然而沼跃鱼早就看穿了一切
  19. Go-Micro微服务框架使用
  20. GIS的云计算解决方案

热门文章

  1. c语言三级考试题库,计算机三级考试C语言上机试题.doc
  2. 短视频配音用什么软件?推荐几款可以用自己视频配音的app
  3. 4.20作业--jQuery
  4. 学人工智能后悔了?为什么千万别学人工智能专业?
  5. 基于JAVAEE公共自行车租赁系统的设计与实现
  6. 计算机科学专业的五种高薪职业选择,看看你适合哪种?
  7. HTTP Headers 之 Origin跨域访问一定要加上这个header
  8. 网恋吗?我小猪佩奇音
  9. 工业废水的种类及其处理工艺简析
  10. 小书匠绑定阿里云oss+阿里云oss图片url永久有效设置--菜鸟小回