iOS开发-处理H5拉起微信支付返回到Safari情况

项目中有一个情景是使用H5拉起微信支付,支付成功之后却返回到了safari,经过一番百度之后问题得以解决,记录如下(需要将xxxxxxxxxx替换成自己对应的内容)

注意:
1.拉起支付的url中不能包含redirectUrl参数,否则跳转Safiri并打开该参数对应的链接
2.必须设置Referer,格式为app的scheme + ://的形式
3.原理是利用sheme的形式打开app

2018-11-13更新:
近期发现如果Referer及Scheme 如果与微信支付域名不一致的话 会无法调起微信并提示'商家存在未配置的参数,请联系商家解决! ' ,遇到此类问题的小伙伴可以将Referer及scheme设置成与支付域名一致,然后尝试看问题是否解决

以WKWebview为例

- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {    
        if ([urlString hasPrefix:@"https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb"]) { // 处理微信支付
            // 注意,此处须与H5沟通好去掉redirectUrl参数
            NSDictionary *header = navigationAction.request.allHTTPHeaderFields;
            
            if (header[@"Referer"] && [header[@"Referer"] isEqualToString:@"xxxxxxxxxx://"]) { // 如果已经设置过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];
                        NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];
                        [request setHTTPMethod:@"GET"];
                        [request setValue:@"xxxxxxxxxx://" 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(WKNavigationActionPolicyCancel);
            return;
        }
        
        // 允许跳转
        decisionHandler(WKNavigationActionPolicyAllow);
}

然后在target中配置urlType,如下(注仅为xxxxxxxxx部分,不包含://):


tmp4f0f14ec.png

至此,问题解决

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容