IOS H5支付调起微信支付宝客户端问题总结

                            IOS H5支付调起微信支付宝客户端问题总结



    很早之前公司的支付功能,通过H5去支付宝和微信支付,开始使用的是UIwebView来加载h5页面,当初只有支付宝网页支付形式,所以没有考虑到那么多,现在新增微信支付后发现不在info.plist中添加Alipay和weixin的白名单压根调不起客户端,折腾了好久,终于算是解决了,但是仍然不理想,下面记录下这个坎坷的过程。

    加载web页ios下目前提供了两种框架,UIWebView和WKWebView,经过反复测试,发现在WKWebView下在ios9系统上不能调起微信支付客户端,因此,暂时放弃WKWebView(虽然很倾向于使用它)。下边说下使用UIWebView,并不需要添加白名单即可。

    创建加载UIWebView就不多说了,这里主要说下打开支付宝和微信客户端的处理

    使用UIWebView调用支付宝支付很简单,只要在- (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType{}协议方法中检测当前request的url是否可以打开客户端,即可

    对于微信需要检测当前的request的url.scheme是否是weixin://,如果是的检测是否设置了Referer,否则先设置  Referer,如果当前scheme不是weixin://,像支付宝一样拉起客户端即可,微信支付还需要注意一点,就是支付完成和返回后如果下单url携带了回调页地址的话,微信会自动跳转到浏览器(这个地方出了设置scheme下的域名外如果还有其他方法的欢迎提供意见),同样返回应用内后也会展示改回调页,所以这个就需要服务器做下处理,如果需要进行交互,这里也不说了,网上有很多文档,下面附上代码


- (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType {

    NSURL*url = [requestURL];

    NSString *newUrl = url.absoluteString;

    if ([url.scheme isEqualToString:@"weixin://"]) {

        NSDictionary *headers = [request allHTTPHeaderFields];

        BOOLhasReferer = [headersobjectForKey:@"Referer"] !=nil;

        if(hasReferer){

            if(![newUrlhasPrefix:@"http"]) {

                UIApplication *application = [UIApplication sharedApplication];

                if([applicationrespondsToSelector:@selector(openURL:options:completionHandler:)]) {

                    [applicationopenURL:request.URLoptions:@{}completionHandler:^(BOOLsuccess) {


                    }];

                }else{

                    if([applicationcanOpenURL:request.URL]) {

                        [applicationopenURL:request.URL];

                    }

                }

            }else{

                NSLog(@"===================false");

            }

            returnYES;

        }else{

            NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];

            [requestsetHTTPMethod:@"GET"];

            [requestsetValue:@"xxx.xxx.xx" HTTPHeaderField:@"Referer"];

            [self.myWebViewloadRequest:request];

        }

        returnYES;

    }else{

        if(![newUrlhasPrefix:@"http"]) {

            UIApplication *application = [UIApplication sharedApplication];

            if([applicationrespondsToSelector:@selector(openURL:options:completionHandler:)]) {

                [applicationopenURL:request.URLoptions:@{}completionHandler:^(BOOLsuccess) {


                }];

            }else{

                if([applicationcanOpenURL:request.URL]) {

                    [applicationopenURL:request.URL];

                }

            }

        }else{

            NSLog(@"===================false");

        }

        returnYES;

    }

    return YES;

}


    第一次写文章,有错误的地方还请指出来,大家一块进步啊~

你可能感兴趣的:(IOS H5支付调起微信支付宝客户端问题总结)