关于使用WKWebView调起微信、支付宝客户端进行支付

  • 最近公司项目的一个需求,需要在没有导入微信SDK和支付宝SDK的情况下调起相应的客户端进行支付。

废话不多说,直接来干货:

  1. 首先,为了能调起微信和支付宝客户端,需要在项目中添加对应的白名单:
image.png
LSApplicationQueriesSchemes
    
        alipay
        alipayshare
        weixin
        wechat
    
  1. 进行WKWebView的配置:
  • 先设置好WKNavigationDelegate
_webView.navigationDelegate = self;
  • (重点) 然后实现代理方法:
#pragma mark - WKNavigationDelegate
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {
    WKNavigationActionPolicy actionPolicy = WKNavigationActionPolicyAllow;
    NSString *urlString = navigationAction.request.URL.absoluteString;
    urlString = [urlString stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    
    //微信
    if ([urlString containsString:@"weixin://wap/pay?"]) {
        actionPolicy = WKNavigationActionPolicyCancel;
        
        //判断是否安装的微信
        BOOL isInstalled = [[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"weixin://"]];
        if (!isInstalled) {
            UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"提示" message:@"未检测到微信客户端,请安装后重试!" preferredStyle:UIAlertControllerStyleAlert];
            [alert addAction:[UIAlertAction actionWithTitle:@"知道了" style:UIAlertActionStyleDefault handler:nil]];
            UIViewController *vc = [PublicTool getCurrentVC];//这里是我工具类中,获取当前试图控制器的方法,可自行替换
            [vc presentViewController:alert animated:YES completion:nil];
            
            //这句是必须加上的,不然会异常
            decisionHandler(actionPolicy);
            return;
        }
        
        //解决wkwebview weixin://无法打开微信客户端的处理
        NSURL *url = [NSURL URLWithString:urlString];
        if ([[UIApplication sharedApplication] respondsToSelector:@selector(openURL:options:completionHandler:)]) {
            if (@available(iOS 10.0,*)) {
                [[UIApplication sharedApplication] openURL:url options:@{UIApplicationOpenURLOptionUniversalLinksOnly: @NO} completionHandler:^(BOOL success) {
                }];
            }
            else {
                [[UIApplication sharedApplication] openURL:url];
            }
        } else {
            [[UIApplication sharedApplication] openURL:webView.URL];
        }
    }
    
    //支付宝
    if ([urlString containsString:@"alipay://alipayclient/?"]) {
        BOOL isInstalled = [[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"alipay://alipayclient/?"]];
        if (!isInstalled) {
            UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"提示" message:@"未检测到支付宝客户端,请安装后重试!" preferredStyle:UIAlertControllerStyleAlert];
            [alert addAction:[UIAlertAction actionWithTitle:@"知道了" style:UIAlertActionStyleDefault handler:nil]];
            UIViewController *vc = [PublicTool getCurrentVC];
            [vc presentViewController:alert animated:YES completion:nil];
            
            //这句是必须加上的,不然会异常
            decisionHandler(actionPolicy);
            return;
        }
        
        if ([[UIApplication sharedApplication] respondsToSelector:@selector(openURL:options:completionHandler:)]) {
            NSString *dataStr = [urlString substringFromIndex:23];
            NSMutableString *mString = [[NSMutableString alloc] init];
            [mString appendString:@"alipay://alipayclient/?"];
            //url进行编码
            [mString appendString:[self encodeString:dataStr]];
            NSURL *url = [NSURL URLWithString:mString];
            
            if (@available(iOS 10.0,*)) {
                [[UIApplication sharedApplication] openURL:url options:@{UIApplicationOpenURLOptionUniversalLinksOnly: @NO} completionHandler:^(BOOL success) {
                }];
            }
            else {
                [[UIApplication sharedApplication] openURL:url];
            }
        } else {
            [[UIApplication sharedApplication] openURL:webView.URL];
        }
    }
    
    //这句是必须加上的,不然会异常
    decisionHandler(actionPolicy);
}
  • 下面是对应的urlencode方法:
#pragma mark - Utils
- (NSString *)encodeString:(NSString *)unencodedString {
    NSString *encodedString = (NSString *)
    CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,
                                                              (CFStringRef)unencodedString,
                                                              NULL,
                                                              (CFStringRef)@"!*'();:@&=+$,/?%#[]",
                                                              kCFStringEncodingUTF8));
    return encodedString;
}

最后说明一下,本人发帖仅为记录,方便以后再做类似功能。
分享出来是希望能帮助更多开发的童靴。
所以,杠精请绕道,谢谢。

你可能感兴趣的:(关于使用WKWebView调起微信、支付宝客户端进行支付)