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;
}
第一次写文章,有错误的地方还请指出来,大家一块进步啊~