IOS唤起H5微信或支付宝收银台
一說支付,大多數(shù)人都會(huì)理解支付方式是下載微信和支付寶SDK進(jìn)行支付,但是其實(shí)還有其他的方式,就是H5調(diào)用系統(tǒng)支付寶和微信進(jìn)行支付。
H5支付可能很多人認(rèn)為是加載完頁面剩下的就是頁面完成即可,但是實(shí)際沒有那么簡單。
下面介紹一下H5調(diào)用支付寶和微信支付。
首先是支付寶,支付寶在支付這一塊是非常專業(yè)的他的代碼也是非常簡單的。既然是H5調(diào)用,那么就少不了網(wǎng)址攔截。這里加載頁面我是使用的WebView
這里說一下,這里微信和支付寶都是使用這個(gè)方法里進(jìn)行
- (BOOL) webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType) navigationType;首先是支付寶,這里我們要攔截包含下面的內(nèi)容的鏈接
alipay://alipayclient下面就是代碼了。
if([[request.URL absoluteString] containsString:@"alipay://alipayclient"]) {NSArray* urlBaseArr = [[request.URL absoluteString] componentsSeparatedByString:@"?"];NSString* urlBaseStr = urlBaseArr.firstObject;NSString* urlNeedDecode = urlBaseArr.lastObject;NSString* afterDecodeStr =[self URLDecodedString:urlNeedDecode];NSString* afterHandleStr = [afterDecodeStr stringByReplacingOccurrencesOfString:@"alipays" withString:@"設(shè)置的支付寶URLSchemes"];NSString* finalStr = [NSString stringWithFormat:@"%@?%@",urlBaseStr,[self URLEncodeString:afterHandleStr]];dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:finalStr]]) {[[UIApplication sharedApplication] openURL:[NSURL URLWithString:finalStr]];}});return NO;}下面是上面代碼中使用的兩個(gè)方法
// OC 做URLEncode的方法- (NSString *)URLEncodeString:(NSString*)str {NSString *unencodedString = str;NSString *encodedString = (NSString *) CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,(CFStringRef)unencodedString,NULL,(CFStringRef)@"!*'();:@&=+$,/?%#[]", kCFStringEncodingUTF8));return encodedString;}- (NSString*)URLDecodedString:(NSString*)str {NSString *decodedString=(__bridge_transfer NSString *)CFURLCreateStringByReplacingPercentEscapesUsingEncoding(NULL, (__bridge CFStringRef)str, CFSTR(""), CFStringConvertNSStringEncodingToEncoding(NSUTF8StringEncoding));return decodedString;}這樣在點(diǎn)擊支付寶支付的時(shí)候會(huì)直接調(diào)起支付寶完成支付,這里有一個(gè)重點(diǎn),就是URLSchemes,如果不設(shè)置,取消支付或者支付完成,會(huì)直接進(jìn)入safari瀏覽器,所以這里我們要設(shè)置一下
下來就是Appdelegate我們收到支付寶支付成功的回掉
// NOTE: 9.0以后使用新API接口- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options{NSString *urlStr = [NSString stringWithFormat:@"%@",url];if ([url.host isEqualToString:@"safepay"]) {// 支付跳轉(zhuǎn)支付寶錢包進(jìn)行支付,處理支付結(jié)果,此處發(fā)送通知,哪里需要接受通知處理,哪里就接受[[NSNotificationCenter defaultCenter]postNotificationName:@"AlipaySDK" object:nil userInfo:nil];}}到此設(shè)置完成
下面是微信,微信就比較麻煩,沒有支付寶簡單,廢話不多說直接上代碼
if ([[request.URL absoluteString] rangeOfString:@"https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb?"].location != NSNotFound) {//設(shè)置redirect_url,如果存在redirect_url,那么需要替換redirect_url對應(yīng)的值(替換內(nèi)容為,自已公司支付的網(wǎng)頁域名)NSString *redirect_url = @"&redirect_url=自已公司支付的網(wǎng)頁域名";NSString *newUrl = [NSString stringWithFormat:@"%@%@",absoluteUrl,redirect_url];//字符串進(jìn)行替換,讓回調(diào)之后返回自己的appnewUrl = [newUrl stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];NSLog(@"newUrl - - - - - - %@",newUrl);NSMutableURLRequest *newRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:newUrl]];NSDictionary *headers = [request allHTTPHeaderFields];BOOL hasReferer = [headers objectForKey:@"Referer"]!=nil;if (hasReferer) {return YES;} else {dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{dispatch_async(dispatch_get_main_queue(), ^{NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:newUrl] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];[request setHTTPMethod:@"GET"];[request setValue:@"自已公司支付的網(wǎng)頁域名://" forHTTPHeaderField: @"Referer"];[self.myWebView loadRequest:request];});});return NO;}}到此我們就能完成了微信支付,但是當(dāng)我們?nèi)∠蛘叻祷氐臅r(shí)候就會(huì)出現(xiàn)就會(huì)返回safari瀏覽器,無法返回自己的app,這里很多人就會(huì)懵,這里很多人都會(huì)去查閱資料,說是在wx.tenpay.com這個(gè)鏈接后面拼接redirect_url='公司域名'這個(gè)操作,這里我重點(diǎn)說一下redirect_url這個(gè)問題,如果在這個(gè)鏈接后面帶有redirect_url,那么redirect_url后面的更的跟的內(nèi)容直接替換為域名,如果沒有我們也不要去添加,本人實(shí)測加上也是會(huì)返回safari瀏覽器。
那我們要如何去設(shè)置內(nèi),我們要做的就是白名單,這個(gè)白名單就是我們從微信返回自己app的唯一表示,由于app是頁面支付所以我們這個(gè)唯一標(biāo)示URLSchemes必須為公司域名。這個(gè)域名必須指定形式如:www.baidu.com,與上面微信支付頁面的代碼塊的的域名對應(yīng)上。
當(dāng)然這里我們也需要設(shè)置URLSchemes
下來就是Appdelegate我們收到微信支付成功的回掉
if ([urlStr rangeOfString:@"自已公司支付的網(wǎng)頁域名"].location != NSNotFound) {//此處發(fā)送通知,哪里需要接受通知處理,哪里就接受[[NSNotificationCenter defaultCenter] postNotificationName:@"WeChatH5PayNotification" object:url.absoluteString];} 至此,H5支付完成。微信支付要比支付寶支付墨跡一點(diǎn),如果微信支付大家上述看不明白,我下面回復(fù)一個(gè)詳細(xì)鏈接,本人也是看完這個(gè)博客才調(diào)同的微信支付,并且還附有demo。
簡書地址:https://www.jianshu.com/p/90db7dfb075c
總結(jié)
以上是生活随笔為你收集整理的IOS唤起H5微信或支付宝收银台的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎么把Autocad绘制的图纸上清晰的图
- 下一篇: 《蛋仔派对》之玩转‘创意工坊’