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;

}

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

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐