先说一下最简单的h5微信支付的方法,就是直接甩给浏览器处理
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"http://xxxxxx.com/pay/ChildAdd.aspx?memberid=会员号"]];
但是这样做,就是不够理想化,项目的需求是跳回app,于是我调整了作战计划,哈哈哈,通过UIWebView 展示上面的h5支付页面
1、添加白名单
选中‘TARGETS’一栏,在‘info’中的‘LSApplicationQueriesSchemes’添加‘weixin’
2、URL Schemes 设置要跟你h5支付申请的域名一致,前面的http,改成www
3、webview
self.webView = [[UIWebView alloc]initWithFrame:CGRectMake(0, 0, WIDTH, HEIGHT)];
[self.view addSubview:self.webView];
self.webView.opaque=NO;
self.webView.delegate=self;
self.webView.backgroundColor = [UIColor whiteColor];
NSDictionary *dic = [NSKeyedUnarchiver unarchiveObjectWithData:[aUseDefaults objectForKey:@"KBTOOL_login_Info"]];
NSString *urlStr = [NSString stringWithFormat:@"http://xxxxxx.com/pay/ChildAdd.aspx?memberid=%@&class=ios",dic[@"MemberId"]];
这里的class=ios,是为了方便后台判断,打开的该h5页面,是ios端还是安卓端。
那么判断的目的是为了从浏览器跳回app时的url标识,因为ios端的浏览器识别跳回自己app,需要www.xxxxx.com://,多冒号双斜杠这样的格式,而安卓那边带冒号斜杠反而调不回自己的app了,这里做一个判断设备
self.url= [NSURLURLWithString:urlStr];
NSURLRequest *request = [NSURLRequest requestWithURL:self.url];
[self.webViewloadRequest:request];
webview 协议方法
-(BOOL)webView:(UIWebView*)webViewshouldStartLoadWithRequest:(NSURLRequest*)requestnavigationType:(UIWebViewNavigationType)navigationType{
NSDictionary*headers = [requestallHTTPHeaderFields];
BOOLhasReferer = [headersobjectForKey:@"Referer"] !=nil;
if(hasReferer) {
NSURL*url = [requestURL];
NSString*newUrl = url.absoluteString;
NSLog(@"截取到的url---%@",newUrl);
if([newUrlcontainsString:@"weixin://"]) {//支付宝是alipays://
NSRangerange = [newUrlrangeOfString:@"weixin://"];//截取的字符串起始位置
NSString* resultStr = [newUrlsubstringFromIndex:range.location];//截取字符串
NSURL*weixinURL = [NSURLURLWithString:resultStr];
[[UIApplication sharedApplication] openURL:weixinURL options:@{UIApplicationOpenURLOptionUniversalLinksOnly: @NO} completionHandler:^(BOOL success) {}];
returnNO;
}
returnYES;
}
跳回app的关键代码如下
else{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
dispatch_async(dispatch_get_main_queue(), ^{
NSURL*url = [requestURL];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];
[requestsetHTTPMethod:@"GET"];
这里是跳回app的关键
浏览器有个特性就是当你的URL是****://的时候,会查找你的schemes,(iOS系统应该在跳转浏览器之前自己有了判断是网址才进浏览器,****://直接会调用APP),从而可以跳转到APP,SO,只要更改这个redirect_url的值等于你的schemes的值加上://,就可以实现跳转回APP
[requestsetValue:@"www.kbzhushou.com://" forHTTPHeaderField:@"Referer"];
[self.webViewloadRequest:request];
});
});
returnNO;
}
}
以上就实现了h5支付完成,从浏览器跳回自己app的过程。
以上回到app的页面是,你从哪个页面跳转的,跳回app的时候就会回到哪个页面,如果需要回到其他指定页面,
在appdelegate中,
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options {
if ([url.absoluteString containsString:@"www.kbzhushou.com://"]) {
//跳到app指定页面
}
return YES;
}
网友评论