????????????????????????????IOS H5支付調(diào)起微信支付寶客戶端問題總結(jié)
????很早之前公司的支付功能,通過H5去支付寶和微信支付,開始使用的是UIwebView來加載h5頁面,當初只有支付寶網(wǎng)頁支付形式,所以沒有考慮到那么多,現(xiàn)在新增微信支付后發(fā)現(xiàn)不在info.plist中添加Alipay和weixin的白名單壓根調(diào)不起客戶端,折騰了好久,終于算是解決了,但是仍然不理想,下面記錄下這個坎坷的過程。
????加載web頁ios下目前提供了兩種框架,UIWebView和WKWebView,經(jīng)過反復測試,發(fā)現(xiàn)在WKWebView下在ios9系統(tǒng)上不能調(diào)起微信支付客戶端,因此,暫時放棄WKWebView(雖然很傾向于使用它)。下邊說下使用UIWebView,并不需要添加白名單即可。
????創(chuàng)建加載UIWebView就不多說了,這里主要說下打開支付寶和微信客戶端的處理
????使用UIWebView調(diào)用支付寶支付很簡單,只要在- (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType{}協(xié)議方法中檢測當前request的url是否可以打開客戶端,即可
????對于微信需要檢測當前的request的url.scheme是否是weixin://,如果是的檢測是否設置了Referer,否則先設置? Referer,如果當前scheme不是weixin://,像支付寶一樣拉起客戶端即可,微信支付還需要注意一點,就是支付完成和返回后如果下單url攜帶了回調(diào)頁地址的話,微信會自動跳轉(zhuǎn)到瀏覽器(這個地方出了設置scheme下的域名外如果還有其他方法的歡迎提供意見),同樣返回應用內(nèi)后也會展示改回調(diào)頁,所以這個就需要服務器做下處理,如果需要進行交互,這里也不說了,網(wǎng)上有很多文檔,下面附上代碼
- (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;
}
? ??第一次寫文章,有錯誤的地方還請指出來,大家一塊進步啊~