由于公司的業務需要,為了節省申請開通微信支付的時間和人力,公司決定使用微信h5支付。這樣即節省了時間,同時以后所有的APP都能使用h5支付,既方便又快捷。
但是真正做的時候問題來了,當你支付成功之后或者是取消支付的時候會跳轉到Safari瀏覽器,這就很尷尬了,完全無用戶體驗啊。當時看著Android可以直接返回到APP,心里瞬間不爽了。開始埋怨蘋果公司了,但是由于公司的業務必須要做h5,沒辦法開始找辦法解決。
首先你在Xcode中,選擇你的工程設置項,選中“TARGETS”一欄,在“info”標簽欄的“LSApplicationQueriesSchemes“添加weixin
然后你通過統一下單后臺會從微信拿到這么個鏈接https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb?prepay_id=wx20180115115052bedf091fba0369993002&package=2975002856給你
進入微信查了一下,發現需要設置Referer這個請求頭的參數,當然微信也給出了例子微信h5支付其他常見錯誤。針對于這個問題在網上搜索了一下發現有專門針對于微信h5支付設置Referer的文章iOSwebView設置Referer,在這里我給大家貼一下代碼吧!
#pragma mark - MajordomoWKWebViewDelegate
-(void)webView:(WKWebView*)webView decidePolicyForNavigationAction:(WKNavigationAction*)navigationAction decisionHandler:(void(^)(WKNavigationActionPolicy))decisionHandler
{
? ? NSString *url = navigationAction.request.URL.absoluteString;
? ? if ([url containsString:@"https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb?"] || [url rangeOfString:@"https://wx.tenpay.com"].location != NSNotFound) {
#warning 鏈接不要拼接redirect_url,如果拼接了還是會返回到瀏覽器的
? ? ? ? //這里把webView設置成一個像素點,主要是不影響操作和界面,主要的作用是設置referer和調起微信
? ? ? ? WebChatPayH5VIew*h5View = [[WebChatPayH5VIewalloc]initWithFrame:CGRectMake(0,0,1,1)];
? ? ? ? //url是沒有拼接redirect_url微信h5支付鏈接
? ? ? ? [h5ViewloadingURL:url withIsWebChatURL:NO];
? ? ? ? [self.viewaddSubview:h5View];
? ? ? ? decisionHandler(WKNavigationActionPolicyCancel);
? ? ? ? return;
? ? }
#warning todo -處理支付寶h5支付返回問題
? ? NSString *urlStr = [navigationAction.request.URL.absoluteString stringByRemovingPercentEncoding];
? ? DLOG(@"urlStr == %@",urlStr);
? ? NSLog(@"當前加載的webView? decidePolicyForNavigationAction:\n%@",webView.URL.absoluteString);
? ? if([urlStrhasPrefix:@"alipayqr://"] || [urlStrisStartWithString:@"alipay"] || [urlStrhasPrefix:@"alipay://"]) {
?? ? ? NSMutableString* tmpUrlStr = urlStr.mutableCopy;
? ? ? ? if([urlStrcontainsString:@"fromAppUrlScheme"]) {
? ? ? ? ? ? NSDictionary* tmpDic = [selfdictionaryWithUrlString:tmpUrlStr];
? ? ? ? ? ? DLOG(@"tmpDic == %@",tmpDic);
? ? ? ? ? ? NSString* tmpValue = [tmpDicvalueForKey:@"fromAppUrlScheme"];
? ? ? ? ? ? tmpUrlStr = [[tmpUrlStrstringByReplacingOccurrencesOfString:tmpValue withString:@"panda"] mutableCopy];
? ? ? ? ? ? DLOG(@"tmpUrlStr == %@",tmpUrlStr);
? ? ? ? ? ? tmpUrlStr = [[tmpUrlStrstringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding] mutableCopy];
? ? ? ? }
? ? ? ? NSURL * newURl = [NSURL URLWithString:tmpUrlStr];//navigationAction.request.URL;//[NSURL URLWithString:urlStr];//
? ? ? ? [[UIApplication sharedApplication]openURL:newURl];
? ? }
? ? //如果是跳轉一個新頁面
? ? if(navigationAction.targetFrame==nil) {
? ? ? ? [webViewloadRequest:navigationAction.request];
? ? }
? ? decisionHandler(WKNavigationActionPolicyAllow);
? ? self.loadUrl= webView.URL.absoluteString;
}
-(NSDictionary*)dictionaryWithUrlString:(NSString*)urlStr
{
? ? if(urlStr && urlStr.length&& [urlStrrangeOfString:@"?"].length==1) {
? ? ? ? NSArray *array = [urlStr componentsSeparatedByString:@"?"];
? ? ? ? if(array && array.count==2) {
? ? ? ? ? ? NSString*paramsStr = array[1];
? ? ? ? ? ? if(paramsStr.length) {
? ? ? ? ? ? ? ? //paramsStr解析出來的數據:{"soeNote":"電壓高超標,當前值:390.78V,大于上上限值:350.0V","name":"電壓"}
? ? ? ? ? ? ? ? NSData *jsonData = [paramsStr dataUsingEncoding:NSUTF8StringEncoding];
? ? ? ? ? ? ? ? NSDictionary *responseDic = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableLeaves? error:nil];
? ? ? ? ? ? ? ? DLOG(@"responseDic == %@",responseDic);
? ? ? ? ? ? ? ? returnresponseDic;
? ? ? ? ? ? }else{
? ? ? ? ? ? ? ? returnnil;
? ? ? ? ? ? }
? ? ? ? }else{
? ? ? ? ? ? returnnil;
? ? ? ? }
? ? }else{
? ? ? ? returnnil;
? ? }
}
###############################
?WebChatPayH5VIew?
#pragma mark - UIWebViewDelegate
- (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType {
? ? NSURL*url = [requestURL];
? ? NSString *newUrl = url.absoluteString;
? ? if(!self.isLoading) {
? ? ? ? if ([newUrl rangeOfString:@"weixin://wap/pay"].location != NSNotFound) {
? ? ? ? ? ? NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];
? ? ? ? ? ? [self.myWebViewloadRequest:request];
? ? ? ? ? ? self.isLoading=YES;
? ? ? ? ? ? returnNO;
? ? ? ? }
? ? }else{
? ? ? ? if ([newUrl rangeOfString:@"weixin://wap/pay"].location != NSNotFound) {
? ? ? ? ? ? self.myWebView=nil;
? ? ? ? ? ? UIWebView *web = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, 1, 1)];
? ? ? ? ? ? [selfaddSubview:web];
? ? ? ? ? ? NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];
? ? ? ? ? ? [webloadRequest:request];
//? ? ? ? ? ? [[self getCurrentVC] showhide];
? ? ? ? ? ? returnYES;
? ? ? ? }
? ? }
? ? NSDictionary *headers = [request allHTTPHeaderFields];
? ? BOOLhasReferer = [headersobjectForKey:@"Referer"] !=nil;
? ? if(hasReferer) {
? ? ? ? returnYES;
? ? }else{
? ? ? ? // relaunch with a modified request
? ? ? ? dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
? ? ? ? ? ? dispatch_async(dispatch_get_main_queue(), ^{
? ? ? ? ? ? ? ? NSURL*url = [requestURL];
? ? ? ? ? ? ? ? NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];
? ? ? ? ? ? ? ? //設置授權域名?就是你們商戶申請H5時提交的授權域名.
? ? ? ? ? ? ? ? [requestsetValue:@"channel.vk7201.com://" forHTTPHeaderField:@"Referer"];//www.aglhz.com://
? ? ? ? ? ? ? ? [self.myWebView loadRequest:request];//http://channel.vk7201.com/front/register/index.html://
? ? ? ? ? ? });
? ? ? ? });
? ? ? ? returnNO;
? ? }
}
走到這一步,你就可以加載webView進行支付了,但是問題來了,不論是支付成功還是取消支付之后他都會跳轉到Safari瀏覽器,而且打開的內容是就是你設置Referer時的授權域名http://www.xxx.com,這個家伙就是我們的公司的主頁。
那么,怎么辦呢,最后我們經過協商,只要能支付,不管支付成功或者取消支付,只要停留在微信界面就可以了,然后讓用戶點擊右上角手動返回APP,這個是沒有辦法的辦法了。然后Android那個哥們給我生成了一個weixin://wap/pay?prepayid%3Dwx201801151450335872c8f41a0452242290&package=122735683&noncestr=1515999038&sign=0b3590852e847b336e6f0187a0f56ab1這樣的鏈接,這個鏈接是通過攔截webView訪問獲取的,然后我試了一下,可以支付,也停留在了微信,于是我高高興興的去嘗試了一下。
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
通過webView的代理方法來獲取到這個鏈接,然后進行支付,發現還是一樣的會跳轉到Safari瀏覽器,當時瞬間懵逼了,怎么會這個樣子呢,不信邪的我又讓Android那個哥們攔截一個鏈接給我,嘗試一下不會跳轉瀏覽器,我又試了一下自己的攔截的鏈接還是會跳轉到Safari瀏覽器。我突然明白了這個是我設置了Referer,不管是用https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb?prepay_id=wx20180115115052bedf091fba0369993002&package=2975002856還是攔截的weixin://wap/pay?prepayid%3Dwx201801151450335872c8f41a0452242290&package=122735683&noncestr=1515999038&sign=0b3590852e847b336e6f0187a0f56ab1進行支付都是不行的,他都會跳轉到Safari。
我當時想要不用TFHpple解析HTML內容吧,但是仔細一想不行的,因為頭部沒有Referer,無法解析。最后實在沒辦法了,都準備放棄了,突然想到了設置scheme,既然我可以Safari可以打開APP,那么我這肯定也能做的。于是我又信心滿滿的開始我的實驗了。
首先要設置scheme,假如scheme設置xxxx,那么你在Safari輸入xxxx://就可以打開APP了。做到這就全部明白了,只要設置好Referer和我的scheme對應就行了,然后我開始實驗:
Referer設置:http://www.xxx.com ?scheme設置:http://www.xxx.com發現不行
我突然間發現是不是只要是帶有h5的授權的域名就可以呢,于是我把公司的一個鏈接www.aglhz.com/sub_property_ysq/m/html/introduction.html設置成Referer之后我發現我還是能支付的,我擦,突然之間發現了一個新的大陸啊,太激動了,然后為了確保準確性進行了各種嘗試,發現只要帶有域名的都可以,然后我又進行了一個嘗試:就是把http://去掉直接把Referer設置成:www.xxx.com,然后也是能支付的。這樣就全部OK了,我把Referer設置成:www.xxx.com://這個樣式的然后把scheme設置成:www.xxx.com這樣的話支付成功或者取消支付都可以直接返回到APP了。
所以h5支付最終返回APP的解決方案是:把Referer設置成:www.xxx.com://?scheme設置成:www.xxx.com就可以直接返回APP了。
當然目前還沒有解決多個APP同時使用同一個授權域名時,怎么返回APP的問題,多個APP使用h5支付的話會導致返回錯亂的問題,如果哪位大神知道解決辦法的話可以告訴我一下,謝謝!
同樣你如果有多個APP被同一家客戶使用的話,客戶也同意用戶點擊左上角手動返回的話你可以這樣設置Referer: ?www.xxx.com/test://,這樣的話你支付成功會直接停留在微信,不會造成返回APP錯亂的問題。
由于大家都在問微信h5支付返回的問題,所以抽空寫了一個demo,針對的是webVIew和WKWebVIewdemo地址。喜歡的朋友給個star。
如果有多個APP運用到h5支付的話,返回的Scheme設置是一個問題,在這里我給大家提供一篇文章,是解決多個APP返回的問題iOS實現微信外部H5支付完成后返回原APP(多APP也可實現)
微信審核通過需要3至5個工作日。
我們假設支付域名填寫的 ?aaa.cn,注意是頂級域名,不是二級或三級的子域名。
服務器端通過統一下單接口從微信拿到支付跳轉鏈接(https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb?prepay_id=wx20180115115052bedf091fba0369993002&package=2975002856),稱為mweb_url,有效期為5分鐘。
由于這里是APP調起支付,不是網頁H5發起支付,所以這里mweb_url值不需要再拼接上redirect_url參數。
然后移動端進行請求mweb_url,就會調起微信APP支付。
可能會出現以下問題:
“出現商家參數格式有誤,請聯系商家解決”
說明在請求mweb_url時referer為空導致,設置上就可以,這里我們設置最先在商戶后臺注冊的aaa.cn的一個多級子域名,比如:b.aaa.cn。
如果不是設置商戶后臺注冊的頂級域名的多級子域名,比如:b.ccc.cn。
就會出現“商家存在未配置的參數,請聯系商家解決”異常。
那就把ccc.cn注冊到商戶后臺就可以解決了。
到目前為止,你就可能正常支付了,但支付成功后,并不能正常跳回原APP,嚴重影響了用戶體驗。
解決方案:把referer設置成:b.aaa.cn://,scheme設置成:b.aaa.cn就可以直接返回APP了。
如是你只有一款APP使用此支付方式,那就可以到此為止了。
如果你有兩款以上APP(比如X1,X2,X3),并都把referer設置成:b.aaa.cn://,scheme設置成:b.aaa.cn。
用戶只安裝了其中一款APP(X1),此時支付能夠成功,并能轉回原APP,一點問題沒有。如果同時安裝了(X1,X2),就會發現支付能夠成功,但成功后頁面靜止,不能跳回原APP了,也嚴重影響了用戶體驗。
想到的第一個解決方案就是更改referer與scheme。
APPX1X2X3
refererb.aaa.cn/x1://b.aaa.cn/x2://b.aaa.cn/x3://
schemeb.aaa.cn/x1b.aaa.cn/x2b.aaa.cn/x3
通過測試發現不起作用。在網上搜索了很久也沒有找到解決方案,感覺只能妥協了,犧牲點用戶體驗,讓用戶點擊左上角返回原APP。
突然靈光一閃,微信商戶后臺即然讓我們注冊頂級域名,那是不是只要把referer與scheme設置成注冊的頂級域名的多級子域名就可以了呢,如下:
APPX1X2X3
refererb1.aaa.cn://b2.aaa.cn://b3.aaa.cn://
schemeb1.aaa.cnb2.aaa.cnb3.aaa.cn
通過測試,完美運行。理論上這個解決方案可以支持無數個APP,也同時解決了微信開放平臺APP支付的限制個數。
//支付寶h5支付返回頁面
schemeStr,這個關鍵字讓我眼前一亮。
手機網站支付轉Native支付:支付寶的意思是,我們提供了一個SDK,你接了之后就可以很方便的實現H5收銀臺(即在web上輸入支付寶賬號密碼支付)到支付寶APP收銀臺的過渡。
如果你是一個"正規"APP開發者,至此已經可以解決你的問題了。按照支付寶文檔接支付寶SDK即可,就能實現H5支付回調APP了。
下載了支付寶的Demo,試了下確實可以跳回APP。
樓主琢磨著,既然SDK能實現這個功能,說明支付寶還是支持的H5支付完成后返回APP功能的,并不是向文檔上說的,"在iOS系統中,喚起支付寶App支付完成后,不會自動回到瀏覽器或商戶APP。用戶可手工切回到瀏覽器或商戶APP",只是支付寶不愿意公開而已。
/** * 支付接口
?* *@paramorderStr 訂單信息?
*@paramschemeStr ?調用支付的app注冊在info.plist中的scheme?
*@paramcompletionBlock 支付結果回調Block,用于wap支付結果回調(非跳轉錢包支付) */
- (void)payOrder:(NSString *)orderStr fromScheme:(NSString *)schemeStr callback:(CompletionBlock)completionBlock;
最終打開支付寶APP都會走?[UIApplicationsharedApplication] openURL:]
#import
#import
@implementationUIApplication(TrackTimer)
+ (void)load{staticdispatch_once_toneToken;
dispatch_once(&oneToken, ^{?
?SEL mySelector =NSSelectorFromString(@"my_openURL:");
?SEL orginalSelector =NSSelectorFromString(@"openURL:");?
?Method myMethod = class_getInstanceMethod([selfclass], mySelector);
?Method orginalMethod = class_getInstanceMethod([selfclass], orginalSelector);
BOOLdidAddMethod = class_addMethod([selfclass], orginalSelector, method_getImplementation(myMethod), method_getTypeEncoding(myMethod));
If(didAddMethod) {
?class_replaceMethod([selfclass], mySelector, method_getImplementation(orginalMethod), method_getTypeEncoding(orginalMethod));
?}else{?
?method_exchangeImplementations(myMethod, orginalMethod);?
?}
?});
}
- (void)my_openURL:(NSURL*)url{
NSLog(@"%@",url);
?[selfmy_openURL:url];
}
打印結果
alipaymatrixbwf0cml3://alipayclient/?%7B%0A%20%20%22fromAppUrlScheme%22%20%3A%20%22alisdkdemo%22%2C%0A%20%20%22requestType%22%20%3A%20%22SafePay%22%2C%0A%20%20%22dataString%22%20%3A%20%22trade_no%3D%5C%222018041921001001270586523089%5C%22%26pay_phase_id%3D%5C%22%5C%22%26biz_type%3D%5C%22trade%5C%22%26biz_sub_type%3D%5C%22TRADE%5C%22%26app_name%3D%5C%22tb%5C%22%26extern_token%3D%5C%221fc77c67c70ef70d58e2bf7c513d91a5%5C%22%26appenv%3D%5C%22%5C%22%26pay_channel_id%3D%5C%22alipay_sdk%5C%22%26bizcontext%3D%5C%22%7B%5C%22av%5C%22%3A%5C%221%5C%22%2C%5C%22sc%5C%22%3A%5C%22h5tonative%5C%22%2C%5C%22ty%5C%22%3A%5C%22ios_lite%5C%22%2C%5C%22appkey%5C%22%3A%5C%222014052600006128%5C%22%2C%5C%22sv%5C%22%3A%5C%22h.a.3.5.3%5C%22%2C%5C%22an%5C%22%3A%5C%22com.antfin.AliSDKDemo%5C%22%7D%5C%22%22%0A%7D
URLDecode
alipaymatrixbwf0cml3://alipayclient/?{
"fromAppUrlScheme" : "alisdkdemo",
"requestType" : "SafePay",
"dataString" : "trade_no="2018041921001001270586523089"&pay_phase_id=""&biz_type="trade"&biz_sub_type="TRADE"&app_name="tb"&extern_token="1fc77c67c70ef70d58e2bf7c513d91a5"&appenv=""&pay_channel_id="alipay_sdk"&bizcontext="{"av":"1","sc":"h5tonative","ty":"ios_lite","appkey":"2014052600006128","sv":"h.a.3.5.3","an":"com.antfin.AliSDKDemo"}""
}
為什么前面會有一點亂碼,alipaymatrixbwf0cml3,不管它了。fromAppUrlScheme,是不是很驚喜。
URLDecode以后(部分字段我做了屏蔽)
alipay://alipayclient/?{"dataString":"h5_route_token="xxxxxxxxxxxxx"&is_h5_route="true"","requestType":"SafePay","fromAppUrlScheme":"alipays"}
也有fromAppUrlScheme這個參數,而且默認是支付寶APP的URLScheme:alipays。
對比一下發現,SDK中傳入的schemeStr參數對應就是alipay:// 中的 fromAppUrlScheme字段。
由此樓主猜測,在 alipay:// 打開支付寶時,傳入 fromAppUrlScheme,支付結束后就會跳到對應的APP。
最終,樓主在自己的項目中驗證了上述猜測。
總結下吧
最終解決方案
方案一
接支付寶提供的SDK,schemeStr參數傳入自己APP的URLScheme即可。 具體的手機網站支付轉Native支付
方案二
不需要接SDK,不需要添加支付寶白名單,webView攔截alipay://alipayclient請求,追加或修改參數 fromAppUrlScheme為你自己的URLScheme值(這一步可沒那么簡單,自己動手吧,偷笑),生成新的NSURL,然后用 [[UIApplication sharedApplication] openURL:] 打開即可。
2018.5.24更新(上面看懂了下面這段可以不用看)
總有人私信我問我怎么追加fromAppUrlScheme。可能是我說的"webView攔截",讓初學者不明白吧,簡單提一下。
在webView"發起請求的代理方法"里面攔截請求的URL,即如果請求是alipay://alipayclient開頭的,說明這個請求就跳轉支付寶的請求。
替換里面fromAppUrlScheme的值為你自己的scheme值。(當然如果更嚴謹的話,應該是判斷fromAppUrlScheme這個key是否存在,存在則替換其值,不存在則追加)。用替換好的字符串生成一個NSURL,用[[UIApplication sharedApplication] openURL:newURL]跳轉支付寶。代理方法返回NO,即終止這次請求。
應該是判斷fromAppUrlScheme這個key是否存在,存在則替換其值,不存在則追加
代碼如下:
?NSString *urlStr = [navigationAction.request.URL.absoluteString stringByRemovingPercentEncoding];
? ? DLOG(@"urlStr == %@",urlStr);
? ? NSLog(@"當前加載的webView? decidePolicyForNavigationAction:\n%@",webView.URL.absoluteString);
? ? if([urlStrhasPrefix:@"alipayqr://"] || [urlStrisStartWithString:@"alipay"] || [urlStrhasPrefix:@"alipay://"]) {
?? ? ? NSMutableString* tmpUrlStr = urlStr.mutableCopy;
? ? ? ? if([urlStrcontainsString:@"fromAppUrlScheme"]) {
? ? ? ? ? ? NSDictionary* tmpDic = [selfdictionaryWithUrlString:tmpUrlStr];
? ? ? ? ? ? DLOG(@"tmpDic == %@",tmpDic);
? ? ? ? ? ? NSString* tmpValue = [tmpDicvalueForKey:@"fromAppUrlScheme"];
? ? ? ? ? ? tmpUrlStr = [[tmpUrlStrstringByReplacingOccurrencesOfString:tmpValue withString:@"panda"] mutableCopy];
? ? ? ? ? ? DLOG(@"tmpUrlStr == %@",tmpUrlStr);
? ? ? ? ? ? tmpUrlStr = [[tmpUrlStrstringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding] mutableCopy];
? ? ? ? }
? ? ? ? NSURL * newURl = [NSURL URLWithString:tmpUrlStr];//navigationAction.request.URL;//[NSURL URLWithString:urlStr];//
? ? ? ? [[UIApplication sharedApplication]openURL:newURl];
? ? }
-(NSDictionary*)dictionaryWithUrlString:(NSString*)urlStr
{
? ? if(urlStr && urlStr.length&& [urlStrrangeOfString:@"?"].length==1) {
? ? ? ? NSArray *array = [urlStr componentsSeparatedByString:@"?"];
? ? ? ? if(array && array.count==2) {
? ? ? ? ? ? NSString*paramsStr = array[1];
? ? ? ? ? ? if(paramsStr.length) {
? ? ? ? ? ? ? ? //paramsStr解析出來的數據:{"soeNote":"電壓高超標,當前值:390.78V,大于上上限值:350.0V","name":"電壓"}
? ? ? ? ? ? ? ? NSData *jsonData = [paramsStr dataUsingEncoding:NSUTF8StringEncoding];
? ? ? ? ? ? ? ? NSDictionary *responseDic = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableLeaves? error:nil];
? ? ? ? ? ? ? ? DLOG(@"responseDic == %@",responseDic);
? ? ? ? ? ? ? ? returnresponseDic;
? ? ? ? ? ? }else{
? ? ? ? ? ? ? ? returnnil;
? ? ? ? ? ? }
? ? ? ? }else{
? ? ? ? ? ? returnnil;
? ? ? ? }
? ? }else{
? ? ? ? returnnil;
? ? }
}
作者:CocoaKier
鏈接:http://www.lxweimin.com/p/0d8dd04fe94e