小技能

iOS-H5微信支付问题总结(WKWebView篇)

2019-05-10  本文已影响0人  同心圆圈
场景描述
现象描述
因公司业务需要,调试现象如下:
公司前端开发一套H5页面,和APP端功能类似(提供给第三方集成使用)
客户完成下单,点击微信支付,调起微信APP,支付完成或者取消支付后,直接跳转进入Safari浏览器,而非返回APP
解决方案
选中‘TARGETS’一栏,在‘info’中的‘LSApplicationQueriesSchemes’添加‘weixin’,已添加过的可以忽略此步骤
// 实际使用时可以拦截weixin://wap/pay前缀的判断
#pragma mark - WKNavigationDelegate
//! WKWeView在每次加载请求前会调用此方法来确认是否进行请求跳转
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {
    
    // 先打印此方法拦截的所有请求
    // NSLog(@"\n ==== %@" ,navigationAction.request.URL.absoluteString);
    // decisionHandler(WKNavigationActionPolicyAllow);
    // return ;

    NSURLRequest *request        = navigationAction.request;
    NSString     *scheme         = [request.URL scheme];

    if (![scheme isEqualToString:@"https"] && ![scheme isEqualToString:@"http"]) {
        if ([scheme isEqualToString:@"weixin"]) {
            decisionHandler(WKNavigationActionPolicyCancel);
            BOOL canOpen = [[UIApplication sharedApplication] canOpenURL:request.URL];
            if (canOpen) {
                [[UIApplication sharedApplication] openURL:request.URL];
            }
            return;
        }
        decisionHandler(WKNavigationActionPolicyAllow);
    }
    decisionHandler(WKNavigationActionPolicyAllow);
}
[request setValue:@"account.test.com://" forHTTPHeaderField:@"Referer"];

说明:account.test.com为微信后台注册二级域名(可以找服务端人员要),
一级域名也可以,其中一级域名格式www.xxx.com,二级域名格式xxx.xxx.com
redirect_url出现在第二步骤的请求拦截URL中,此URL前缀为‘https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb’,
查看此URL中的redirect_url,修改为‘redirect_url=account.test.com://’,//后可以添加自定义内容
选中‘TARGETS’一栏,在‘info’中的‘URL Types’添加一项,URL Schemes 填写‘account.test.com’
AppDelegate中实现
// iOS 9.0
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options {
    if ([url.absoluteString containsString:@"account.test.com://"]) {
        [[NSNotificationCenter defaultCenter] postNotificationName:@"test" object:url];
    }
    return YES;
}

WebViewController中实现
在viewDidLoad中监听
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(payResult:) name:@"test" object:nil];

- (void)payResult:(NSNotification *)noti {
    // 可以先调用一次goback 解决weixin:pay出现的白屏问题
    // [self backClick];
    
    //https://www.baidu.com
    //http://192.168.1.14:9871/default/index
    NSURL *newUrl = [NSURL URLWithString:@"https://www.baidu.com"];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:newUrl];
    [request setValue:@"account.test.com://" forHTTPHeaderField:@"Referer"];
    [_webView loadRequest:request];
}
上一篇下一篇

猜你喜欢

热点阅读