记录支付跳转相关代码

421 阅读1分钟
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {

  NSURLRequest *request        = navigationAction.request;
  // decode for all URL to avoid url contains some special character so that it wasn't load.
  NSString     *absoluteString = [navigationAction.request.URL.absoluteString stringByRemovingPercentEncoding];

// 跳转到本地某宝App
if ([absoluteString hasPrefix:@"alipays://"] || [absoluteString hasPrefix:@"alipay://"]) {
    NSURL *openedURL = navigationAction.request.URL;

    NSString *prefixString = @"alipay://alipayclient/?";
    NSString *urlString = [[self xh_URLDecodedString:absoluteString] stringByReplacingOccurrencesOfString:@"alipays" withString:@"geelytrip"];
    ;
    if ([urlString hasPrefix:prefixString]) {
        NSRange rang = [urlString rangeOfString:prefixString];
        NSString *subString = [urlString substringFromIndex:rang.length];
        NSString *encodedString = [prefixString stringByAppendingString:[self xh_URLEncodedString:subString]];
        openedURL = [NSURL URLWithString:encodedString];
    }

    BOOL isSucc = [[UIApplication sharedApplication] openURL:openedURL];
    if (!isSucc) {
        UIAlertController *alertVC = [UIAlertController alertControllerWithTitle:@"提示" message:@"您未安装支付宝,请安装后重试" preferredStyle:UIAlertControllerStyleAlert];
        UIAlertAction *sureAction = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
            [self.navigationController popViewControllerAnimated:YES];
        }];
        [alertVC addAction:sureAction];
        [self presentViewController:alertVC animated:YES completion:nil];

        decisionHandler(WKNavigationActionPolicyCancel);
        return;
    }
    decisionHandler(WKNavigationActionPolicyCancel);
    return;
}

if ([absoluteString hasPrefix:@"https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb"]) { // 处理微信支付
    // 注意,此处须与H5沟通好去掉redirectUrl参数
    NSDictionary *header = navigationAction.request.allHTTPHeaderFields;
		// 商户域名:可尝试在域名前加"a.商户域名",某打车平台尝试过
    if (header[@"Referer"] && [header[@"Referer"] isEqualToString:@"商户域名://"]) { // 如果已经设置过referer
        // 允许跳转
        decisionHandler(WKNavigationActionPolicyAllow);
        return;
    } else {
        // 设置referer
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

            dispatch_async(dispatch_get_main_queue(), ^{
                NSURL *url = [navigationAction.request URL];
                NSString     *absoluteString = request.URL.absoluteString;
                NSString *redirectUrl = request.URL.absoluteString;
                if ([absoluteString containsString:@"redirect_url="]) {
                    NSRange redirectRange = [absoluteString rangeOfString:@"redirect_url"];
                    redirectUrl = [[absoluteString substringToIndex:redirectRange.location-1] stringByAppendingString:@""];
                }else {
                    redirectUrl = [absoluteString stringByAppendingString:@""];
                }
                self.reurl = redirectUrl;
                NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:redirectUrl] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];
                [request setHTTPMethod:@"GET"];
                [request setValue:@"商户域名://" forHTTPHeaderField: @"Referer"];
                [self.webView loadRequest:request];
            });
        });
        decisionHandler(WKNavigationActionPolicyCancel);
        return;
    }
}
NSURL *url = navigationAction.request.URL;
// 微信支付协议
if ([url.scheme isEqualToString:@"weixin"]) {
    if ([url.host isEqualToString:@"wap"]) {
        if ([url.relativePath isEqualToString:@"/pay"]) {
            if ([[UIApplication sharedApplication] canOpenURL:url]) {
                [[UIApplication sharedApplication] openURL:url];
            }
        }
    }
    decisionHandler(WKNavigationActionPolicyAllow);
    return;
}

// 允许跳转
decisionHandler(WKNavigationActionPolicyAllow);

}

- (NSString *)xh_URLDecodedString:(NSString *)urlString
{
    NSString *string = urlString;
    NSString *decodedString=(__bridge_transfer NSString *)CFURLCreateStringByReplacingPercentEscapesUsingEncoding(NULL, (__bridge CFStringRef)string, CFSTR(""), CFStringConvertNSStringEncodingToEncoding(NSUTF8StringEncoding));
    return decodedString;
}

- (NSString *)xh_URLEncodedString:(NSString *)urlString
{
    NSString *string = urlString;
    NSString *encodedString = (NSString *) CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,
                                                                                                     (CFStringRef)string,
                                                                                                     NULL,
                                                                                                     (CFStringRef)@"!*'();:@&=+$,/?%#[]",
                                                                                                     kCFStringEncodingUTF8));
    return encodedString;
}