iOS WKWebView H5微信支付跳轉(zhuǎn)

iOS WKWebView H5微信支付跳轉(zhuǎn)


需求:iOS客戶端實現(xiàn)嵌入H5進(jìn)行微信支付跳轉(zhuǎn)到微信客戶端端朵,支付完成后再跳轉(zhuǎn)回我們的APP,解決WKWebView無法跳轉(zhuǎn)回APP的BUG.


閱讀前提:

  • 了解WKWebView基本初始化及使用
  • 了解如何利用URL Schemes進(jìn)行應(yīng)用間跳轉(zhuǎn)
  • 公司或個人已經(jīng)在微信后臺注冊了一級域名

GitHub地址(附代碼) : iOS WKWebView H5微信支付跳轉(zhuǎn)

簡書地址 : iOS WKWebView H5微信支付跳轉(zhuǎn)

博客地址 : iOS WKWebView H5微信支付跳轉(zhuǎn)

掘金地址 : iOS WKWebView H5微信支付跳轉(zhuǎn)


更新說明

2019.1.3

  • 首先對所有解析的URL進(jìn)行decode,因為服務(wù)器端可能進(jìn)行encode導(dǎo)致帶有redirect url部分無法被正確的加載
  • 修改替換redirect url參數(shù)方式,因為redirect url可能含有&等特殊字符燃箭,導(dǎo)致原先方法識別錯誤,當(dāng)然前提是必須把redirect url放到url的最后
  • 對一些服務(wù)器加載的特殊Url(非http/https開頭)進(jìn)行處理舍败,防止進(jìn)入到微信跳回后重定向地址的邏輯中.

注意:如對WKWebView基本的初始化代理方法不了解可自行百度谷歌招狸,解釋眾多,本文只針對了解基礎(chǔ)后實現(xiàn)邻薯。

1.在項目的Info.plist中添加一個URL Schemes(用于跳回我們項目)裙戏,如下圖所示

URL Schemes

其中我們只要關(guān)心URL Schemes中item的名字例如 xdx.xiaodongxie.cn

  • xdx 為前綴,可任意填寫
  • xiaodongxie.cn為你們公司在微信后臺注冊的一級域名

注意:xiaodongxie.cn一級域名不可隨意填寫厕诡,否則網(wǎng)頁將報錯:商家參數(shù)格式錯誤累榜,請聯(lián)系商家解決.

2.添加WKNavigationDelegate代理,并實現(xiàn)重定向代理方法

3.通過攔截微信鏈接以實現(xiàn)跳轉(zhuǎn)

3-1. 攔截微信支付地址

前綴https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb的網(wǎng)址灵嫌,該網(wǎng)址即為進(jìn)行微信支付

3-2. 解決完成微信支付后無法跳轉(zhuǎn)回APP

攔截后我們需要首先關(guān)注在原始地址中是否含有redirect_url=字符串壹罚,如果含有該字符串則說明你們后臺人員是利用該字符串在微信支付完成后跳轉(zhuǎn)到支付完成的界面.而我們也需要利用該字段以實現(xiàn)支付完成后跳轉(zhuǎn)回我們的APP.

  • 如果包含redirect_url=字段,我們需要先記住后臺重定向的地址寿羞,然后將其替換成我們配置好的URL schemes以實現(xiàn)跳轉(zhuǎn)回我們的APP.然后在跳轉(zhuǎn)回我們APP之后我們會手動再加載一次原先重定向的URL地址猖凛。
  • 如果不包含redirect_url=字段,我們只需要添加該字段到原始URL最后面即可

3-3. 使用[[UIApplication sharedApplication] openURL:request.URL];即可打開微信客戶端

注意

  • 我們需要判斷微信地址的同時判斷“redirect_url=xdx.%@://”,因為我們在第一次檢測到后會重新加載該地址绪穆,該地址中也含有 https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb辨泳,會形成循環(huán)沖突,所以判斷條件如下
  • 如我們項目中有支付完成的重定向地址玖院,我們可以在跳轉(zhuǎn)前即加載該地址菠红,否則我們在回到APP后會有明顯的加載過程,界面不友好
  • 一般跳轉(zhuǎn)到其他APP時难菌,地址不是以http或https開頭试溯,所以我們在最后的判斷中以此為依據(jù),但注意如果服務(wù)器端加載錯誤的地址可能會走入此邏輯,所以必須對特定的scheme進(jìn)行處理
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {
    
    NSURLRequest *request        = navigationAction.request;
    NSString     *scheme         = [request.URL scheme];
    // decode for all URL to avoid url contains some special character so that it wasn't load.
    NSString     *absoluteString = [navigationAction.request.URL.absoluteString stringByRemovingPercentEncoding];
    NSLog(@"Current URL is %@",absoluteString);
    
    static NSString *endPayRedirectURL = nil;
    
    // Wechat Pay, Note : modify redirect_url to resolve we couldn't return our app from wechat client.
    if ([absoluteString hasPrefix:@"https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb"] && ![absoluteString hasSuffix:[NSString stringWithFormat:@"redirect_url=xdx.%@://",CompanyFirstDomainByWeChatRegister]]) {
        decisionHandler(WKNavigationActionPolicyCancel);
        
#warning Note : The string "xiaodongxie.cn://" must be configured by wechat background. It must be your company first domin. You also should configure "URL types" in the Info.plist file.
        
        // 1. If the url contain "redirect_url" : We need to remember it to use our scheme replace it.
        // 2. If the url not contain "redirect_url" , We should add it so that we will could jump to our app.
        //  Note : 2. if the redirect_url is not last string, you should use correct strategy, because the redirect_url's value may contain some "&" special character so that my cut method may be incorrect.
        NSString *redirectUrl = nil;
        if ([absoluteString containsString:@"redirect_url="]) {
            NSRange redirectRange = [absoluteString rangeOfString:@"redirect_url"];
            endPayRedirectURL =  [absoluteString substringFromIndex:redirectRange.location+redirectRange.length+1];
            redirectUrl = [[absoluteString substringToIndex:redirectRange.location] stringByAppendingString:[NSString stringWithFormat:@"redirect_url=xdx.%@://",CompanyFirstDomainByWeChatRegister]];
        }else {
            redirectUrl = [absoluteString stringByAppendingString:[NSString stringWithFormat:@"&redirect_url=xdx.%@://",CompanyFirstDomainByWeChatRegister]];
        }
        
        NSMutableURLRequest *newRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:redirectUrl] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:XDX_URL_TIMEOUT];
        newRequest.allHTTPHeaderFields = request.allHTTPHeaderFields;
        newRequest.URL = [NSURL URLWithString:redirectUrl];
        [webView loadRequest:newRequest];
        return;
    }
    
    // Judge is whether to jump to other app.
    if (![scheme isEqualToString:@"https"] && ![scheme isEqualToString:@"http"]) {
        decisionHandler(WKNavigationActionPolicyCancel);
        if ([scheme isEqualToString:@"weixin"]) {
            // The var endPayRedirectURL was our saved origin url's redirect address. We need to load it when we return from wechat client.
            if (endPayRedirectURL) {
                [webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:endPayRedirectURL] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:XDX_URL_TIMEOUT]];
            }
        }else if ([scheme isEqualToString:[NSString stringWithFormat:@"xdx.%@",CompanyFirstDomainByWeChatRegister]]) {
            
        }
        
        BOOL canOpen = [[UIApplication sharedApplication] canOpenURL:request.URL];
        if (canOpen) {
            [[UIApplication sharedApplication] openURL:request.URL];
        }
        return;
    }
    
    decisionHandler(WKNavigationActionPolicyAllow);
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末扔傅,一起剝皮案震驚了整個濱河市耍共,隨后出現(xiàn)的幾起案子烫饼,更是在濱河造成了極大的恐慌,老刑警劉巖试读,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件杠纵,死亡現(xiàn)場離奇詭異,居然都是意外死亡钩骇,警方通過查閱死者的電腦和手機(jī)比藻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來倘屹,“玉大人银亲,你說我怎么就攤上這事∨Τ祝” “怎么了务蝠?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長烛缔。 經(jīng)常有香客問我馏段,道長,這世上最難降的妖魔是什么践瓷? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任院喜,我火速辦了婚禮,結(jié)果婚禮上晕翠,老公的妹妹穿的比我還像新娘喷舀。我一直安慰自己,他們只是感情好淋肾,可當(dāng)我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布硫麻。 她就那樣靜靜地躺著,像睡著了一般巫员。 火紅的嫁衣襯著肌膚如雪庶香。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天简识,我揣著相機(jī)與錄音赶掖,去河邊找鬼。 笑死七扰,一個胖子當(dāng)著我的面吹牛奢赂,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播颈走,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼膳灶,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起轧钓,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤序厉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后毕箍,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體弛房,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年而柑,在試婚紗的時候發(fā)現(xiàn)自己被綠了文捶。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡媒咳,死狀恐怖粹排,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情涩澡,我是刑警寧澤顽耳,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站妙同,受9級特大地震影響斧抱,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜渐溶,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望弄抬。 院中可真熱鬧茎辐,春花似錦、人聲如沸掂恕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽懊亡。三九已至依啰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間店枣,已是汗流浹背速警。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留鸯两,地道東北人闷旧。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像钧唐,于是被迫代替她去往敵國和親忙灼。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容