「这是我参与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的方式进行支付的话, 仅仅是用于便捷操作, 而不是要说绕过苹果税的操作, 虽然这样确实可以实现这个目的, 但是如果被查到的话就是封号处理了, 所以大家还是不要这么操作.
如果大家对文章有什么疑问, 或者有什么新的想法, 评论区可以告诉我, 谢谢