我这里用的是WKWebView,首先要实现WKNavigationDelegate协议
1、由H5页跳转微信客户端--WKNavigationDelegate方法
该方法是决定H5页面是否允许跳转的
-(void)webView:(WKWebView*)webView decidePolicyForNavigationAction:(WKNavigationAction*)navigationAction decisionHandler:(void(^)(WKNavigationActionPolicy))decisionHandler{
WKNavigationActionPolicy actionPolicy = WKNavigationActionPolicyAllow;//允许
NSString*urlString = [[navigationAction.request URL] absoluteString];
urlString = [urlString stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSLog(@"跳转:>>>???>>%@",urlString);
//打开微信
if([urlString containsString:@"weixin://wap/pay?"]) {
actionPolicy =WKNavigationActionPolicyCancel;//不允许跳转
NSURL*url = [NSURL URLWithString:urlString];
if([[UIApplication sharedApplication] respondsToSelector:@selector(openURL:options:completionHandler:)]) {
[[UIApplication sharedApplication] openURL:url options:@{UIApplicationOpenURLOptionUniversalLinksOnly: @NO} completionHandler:^(BOOL success) {
}];
}else{
[[UIApplication sharedApplication]openURL:webView.URL];
}
}
decisionHandler(actionPolicy); //这句是必须加上的,不然会异常
}
2、从微信客户端跳回APP
很多小伙伴儿都遇到回跳的问题,点击“完成”或“取消”跳到了Safari却跳不回APP。
1、配置 URL Types 添加schemes:www.xxxx.com
2、配置 Referer
[request setValue:@"www.xxxx.com://" forHTTPHeaderField:@"Referer"];
3、服务器回调的URL中一定要写成 www.xxxx.com:// , 如果一定要拼接,可以让后台区分一下,如果是iOS 前面一定要写成 www.xxxx.com:// ,不然跳不回APP。
注意:www.xxxx.com 此域名一定是H5授权的域名,如果是二级域名,可以写成:aaa.xxxx.com
3、支付回来页面不刷新或产生空白页
一般支付完不管完成与否都要调一下回调地址来刷新支付页面的,但问题是iOS的回调地址中一定要写成 www.xxxx.com:// 这样的格式才能跳回来,但是调回来后没有执行回调地址,页面又刷新不了,或者跳回来后是个空白页,这又产生了一个新的问题。当点击微信支付页上的“完成”或“取消”返回APP时,会调用 AppDelegate 中的 openURL: 方法
-(BOOL)application:(UIApplication*)app openURL:(NSURL*)url options:(NSDictionary *)options{
// url.scheme 就是 www.xxxx.com ,你只需要在这做一个判断,如果是 www.xxxx.com 你就给外部发一个通知,那外部接收到这个通知,刷新界面就行了。
那么问题又来了,刷新方法是什么呢??
刷新地址也就是支付完的回调地址,后台可以把回调地址拼接在 www.xxxx.com:// 后面,例如:www.xxxx.com://http://www.baidu.com 。 那么 url 就是 www.xxxx.com:// http://www.baidu.com ,你向外部发通知时把 url 作为参数传出去即可
if ([url.scheme containsString:@"www.xxxx.com"]) {
[[NSNotificationCenter defaultCenter] postNotificationName:@"refreshWXH5Pay" object:nil userInfo:@{@"url":url}];
}
}
//这是外部接收、处理通知的方法 -(void)refreshOrderData:(NSNotification*)notifi{
NSDictionary*dic = notifi.userInfo;
NSString*url = [NSString stringWithFormat:@"%@",dic[@"url"]];
NSString*urlStr = [url substringFromIndex:14]; //截取 www.xxxx.com:// http://www.baidu.com 后面的部分
[self.webView loadRequest:[self getRequest:urlStraction:nil]];
}