iOS-WKWebView三方支付调用

763 阅读2分钟

「这是我参与11月更文挑战的第14天,活动详情查看:2021最后一次更文挑战

前言

众所周知苹果税是真的狠, 随便一个APP就要抽走30%, 虽然由于疫情的原因现在对个别经营情况不好的公司降低了抽成, 但是感觉还是一个周扒皮, 既然这么狠, 那么怎么能绕过这个抽成呢? 方法还是有点,但是不建议使用, 会有封号的风险. 这里仅做技术讨论

实现

我们如何实现在APP中通过WKWebView来唤起三方支付平台呢? 这里又分为 微信 支付宝 两大 平台.

首先需要在WKWebView的代理方法中,拦截要跳转的URL, 进行特殊的处理

- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {
    BOOL isIntercepted = [[AlipaySDK defaultService] payInterceptorWithUrl:urlStr fromScheme:@"cailemao" callback:^(NSDictionary *result) {
    // 处理支付结果
    NSLog(@"%@", result);
    // isProcessUrlPay 代表 支付宝已经处理该URL
    if ([result[@"isProcessUrlPay"] boolValue]) {
        // returnUrl 代表 第三方App需要跳转的成功页URL
        NSString* urlStr = result[@"returnUrl"];
        [wself loadWithUrlStr:urlStr];
    }
    }];
    if (isIntercepted) {
        decisionHandler(WKNavigationActionPolicyCancel);
        return;
    }

    if ([self someBao:urlScheme urlStr:urlStr]) {
        decisionHandler(WKNavigationActionPolicyCancel);
        return;
    }
    decisionHandler(WKNavigationActionPolicyAllow);
}

微信支付的处理

    //微信支付
    NSString *wxPre = @"https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb";
    if ([request.URL.absoluteString hasPrefix:wxPre] && ![request.URL.absoluteString containsString:[NSString stringWithFormat:@"%@://",urlSchemes]]) {
        NSArray * newUrl = [request.URL.absoluteString componentsSeparatedByString:@"redirect_url="];
        NSString * newStr = [NSString stringWithFormat:@"%@redirect_url=%@://%@",newUrl[0],urlSchemes,newUrl[1]];
        NSMutableURLRequest * newRequest = [[NSMutableURLRequest alloc]initWithURL:[NSURL URLWithString:newStr]];
        newRequest.allHTTPHeaderFields = request.allHTTPHeaderFields;
        [webView loadRequest:newRequest];
        decisionHandler(WKNavigationActionPolicyCancel);
        return;
    }

    if ([request.URL.scheme containsString:@"weixin"]) {
        if (@available(iOS 10.0, *)) {
            [UIApplication.sharedApplication openURL:request.URL options:@{} completionHandler:nil];
        } else {
            // Fallback on earlier versions
            [[UIApplication sharedApplication] openURL:request.URL];
        }
    }

支付宝的处理

- (BOOL)someBao:(NSString *)urlScheme urlStr:(NSString *)urlStr {
//    if ([urlStr hasPrefix:@"alipay://alipayclient/"]) {
//        NSLog(@"123");
//    }
    [[AlipaySDK defaultService] payInterceptorWithUrl:urlStr fromScheme:@"xxxx" callback:^(NSDictionary *resultDic) {
        NSLog(@"123");
    }];

    if ([urlStr hasPrefix:@"alipays://"] || [urlStr hasPrefix:@"alipay://"]) {
        NSURL* alipayURL = [self changeURLSchemeStr:urlStr];
        [[UIApplication sharedApplication] openURL:alipayURL options:@{UIApplicationOpenURLOptionUniversalLinksOnly: @NO} completionHandler:nil];
        return true;
    }
    return false;
}

- (NSURL*)changeURLSchemeStr:(NSString*)urlStr{
    NSString* tmpUrlStr = urlStr;
    if([urlStr containsString:@"fromAppUrlScheme"]) {
        tmpUrlStr = [tmpUrlStr stringByRemovingPercentEncoding];
        NSDictionary* tmpDic = [self dictionaryWithUrlString:tmpUrlStr];
        NSMutableDictionary *tmp = [NSMutableDictionary dictionaryWithDictionary:tmpDic];
        tmp[@"fromAppUrlScheme"] = @"xxxx";
        NSString* tmpValue = [tmpDic valueForKey:@"fromAppUrlScheme"];
        tmpUrlStr = [[tmpUrlStr stringByReplacingOccurrencesOfString:tmpValue withString:@"xxxx"] mutableCopy];
        tmpUrlStr = [[tmpUrlStr stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]] mutableCopy];
    }
    NSURL * newURl = [NSURL URLWithString:tmpUrlStr];
    return newURl;
}

- (NSDictionary*)dictionaryWithUrlString:(NSString*)urlStr{
    if(urlStr && urlStr.length && [urlStr rangeOfString:@"?"].length==1) {
        NSArray *array = [urlStr componentsSeparatedByString:@"?"];
        if(array && array.count==2) {
            NSString*paramsStr = array[1];
            if(paramsStr.length) {
                NSString* paramterStr = [paramsStr stringByRemovingPercentEncoding];
                NSData *jsonData = [paramterStr dataUsingEncoding:NSUTF8StringEncoding];
                NSDictionary *responseDic = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableLeaves error:nil];
                return responseDic;
            }
        }
    }
    return nil;
}

总结

使用h5的方式进行支付的话, 仅仅是用于便捷操作, 而不是要说绕过苹果税的操作, 虽然这样确实可以实现这个目的, 但是如果被查到的话就是封号处理了, 所以大家还是不要这么操作.

如果大家对文章有什么疑问, 或者有什么新的想法, 评论区可以告诉我, 谢谢