iOS H5调微信支付与回调

0.58字数 749阅读 5454

我这里用的是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]];

}

推荐阅读更多精彩内容