专栏首页移动端周边技术扩展解决H5微信支付返回跳转问题

解决H5微信支付返回跳转问题

使用iOS打开微信支付页面需要设置webview的Referer

Referer一般为http://www.xxx.com或者直接www.xxx.com

在Info中URL Type添加该Referer为打开自己app的scheme

嗯,就这样结束!!!

打开微信可能遇到的坑,需添加这个代理,实现部分内容

- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {
    
    NSDictionary *referDict = [[NSUserDefaults standardUserDefaults] objectForKey:@"loadUrlWithRefer"];
    
    if (![ICTools isObjEmpty:referDict]) {
        NSString *url = referDict[@"url"];
        NSString *refer = referDict[@"refer"];
        NSDictionary *headers = [navigationAction.request allHTTPHeaderFields];
        NSString * referer = [headers objectForKey:@"Referer"];
        BOOL isRightReferer = [referer isEqualToString:refer];
        if (isRightReferer) {
            decisionHandler(WKNavigationActionPolicyAllow);
        } else {
            decisionHandler(WKNavigationActionPolicyCancel);

            if ([url isEqualToString:[navigationAction.request.URL absoluteString]]) {
                NSMutableDictionary * muDict = [[NSMutableDictionary alloc] initWithDictionary:headers];
                [muDict setObject:refer forKey:@"Referer"];
                dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
                    dispatch_async(dispatch_get_main_queue(), ^{
                        NSURL *url = [navigationAction.request URL];
                        NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:60.0];
                        request.allHTTPHeaderFields = muDict;
                        [webView loadRequest:request];
                    });
                });
            }
            [[NSUserDefaults standardUserDefaults] removeObjectForKey:@"loadUrlWithRefer"];// 使用完成后移除
        }
    } else {
        NSURL *url = navigationAction.request.URL;
        ICLog(@"decidePolicyForNavigationAction :%@", [url scheme]);
        NSString *scheme = [url scheme];
        if ([scheme isEqualToString:kTGJSBridgeProtocolScheme]) {// 自定义scheme用于js于native交互使用,正常h5支付可忽略
            [self dispatchNotification:[url absoluteString] fromWebView:webView];
        }  else {
            //forward
            if (![scheme isEqualToString:@"https"] && ![scheme isEqualToString:@"http"]) {
                [[UIApplication sharedApplication] openURL:url];
            }
        }
        decisionHandler(WKNavigationActionPolicyAllow);
    }
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 快速排序

    程序员不务正业
  • iOS11 UIBarButtonItem无法偏移问题坑

    程序员不务正业
  • Vue.js学习笔记(2)

    程序员不务正业
  • python循环综合运用

    循环很重要,计算机很蠢,唯一的优势就是按照指令不停的执行,所以决定在说一下。 break语句,用在循环体中,迫使循环立即终止,即跳出所在循环体,继续执行循环体后...

    东风冷雪
  • Spark和Scala当中的collect方法的用法和例子

    collect: 收集一个弹性分布式数据集的所有元素到一个数组中,这样便于我们观察,毕竟分布式数据集比较抽象。Spark的collect方法,是Action类型...

    马克java社区
  • Ruby测试小代码[计算50以内的素数]

    算法思想 判断某一个数,能不能被比他平方根小的素数整除。 首先看看代码 $arr = [] $arr[0] = 2 def add_prime(n) 3...

    用户1154259
  • 算法面试经常需要你手写的三个排序算法(Python语言)

    五分钟学算法
  • 查找数组元素位置

    用户1749219
  • Leetcode 300. 最长上升子序列

    申请等长的临时数组 arr,用于保存每个位置上对应的最长上升序列长度,则计算 arr[i] 时,需要遍历前 i 个位置,取 nums 值小于 nums[i] 的...

    zhipingChen
  • javascript数组去重的N种方法

    这段代码使用了循环嵌套,首先循环遍历数组中每一项,然后用每一项和当前项后面的数组元素比对,相同的话,将其从数组中删除,依次循环完成,达到去重目的。

    挥刀北上

扫码关注云+社区

领取腾讯云代金券