在支付這一塊,發現講支付集成的比較多,但是關於支付後回調處理的不多見,(當時因為這個問題懵逼了好久)就自己總結一下,
支付寶的回調想對來說比較簡單一些,因為支付寶的回調就在調起支付寶的那個方法中的block中,
NSString *orderString = nil; if (signedString != nil) {orderString = [NSString stringWithFormat:@"%@&sign=\"%@\"&sign_type=\"%@\"",orderSpec, signedString, @"RSA"]; [[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary *resultDic) { NSString * strTitle = [NSString stringWithFormat:@"支付結果"]; NSString *strMsg; //【callback處理支付結果】 if ([resultDic[@"resultStatus"] isEqualToString:@"9000"]) { strMsg = @"恭喜您,支付成功!"; }else if([resultDic[@"resultStatus"] isEqualToString:@"6001"]) { strMsg = @"已取消支付!"; }else{ strMsg = @"支付失敗!"; } UIAlertView *alert = [[UIAlertView alloc] initWithTitle:strTitle message:strMsg delegate:self cancelButtonTitle:@"確定" otherButtonTitles:nil, nil]; [alert show]; }]; }
上面我只對,成功,取消,失敗 三種狀態進行判斷,想仔細了解可以查看官方文檔。
首先,支付回調API的方法,這個方法中完全是按照官方文檔寫的,自己基本上不需要操作
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { //如果極簡開發包不可用,會跳轉支付寶錢包進行支付,需要將支付寶錢包的支付結果回傳給開發包 if ([url.host isEqualToString:@"safepay"]) { [[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) { //【由於在跳轉支付寶客戶端支付的過程中,商戶app在後台很可能被系統kill了,所以pay接口的callback就會失效,請商戶對standbyCallback返回的回調結果進行處理,就是在這個方法裡面處理跟callback一樣的邏輯】 }[[AlipaySDK defaultService] processAuthResult:url standbyCallback:^(NSDictionary *resultDic) { //【由於在跳轉支付寶客戶端支付的過程中,商戶app在後台很可能被系統kill了,所以pay接口的callback就會失效,請商戶對standbyCallback返回的回調結果進行處理,就是在這個方法裡面處理跟callback一樣的邏輯】 }]; } if ([sourceApplication isEqualToString:@"com.tencent.xin"]) { //微信支付回調 return [WXApi handleOpenURL:url delegate:self]; } //跳轉處理 BOOL result = [UMSocialSnsService handleOpenURL:url]; if (result == FALSE) { //調用其他SDK,例如支付寶SDK等 } return result; }
最後微信會調用下面這個方法,我是在這個方法中做的操作,由於這個方法是在AppDelegate中,如果在這裡跳轉到自己指定的頁面,有些困難,
於是就在這個方法中發通知到調起支付的頁面,再進行頁面跳轉操作。
//回調方法 -(void) onResp:(BaseResp*)resp { NSString *strMsg = [NSString stringWithFormat:@"errcode:%d", resp.errCode]; NSString *strTitle; if([resp isKindOfClass:[SendMessageToWXResp class]]) { strTitle = @"發送媒體消息結果"; } if([resp isKindOfClass:[PayResp class]]){ //支付返回結果,實際支付結果需要去微信服務器端查詢 strTitle = [NSString stringWithFormat:@"支付結果"]; switch (resp.errCode) { case WXSuccess:{ strMsg = @"恭喜您,支付成功!"; [MYNotificationCenter postNotificationName:@"weixinPaystatusSuccess" object:nil userInfo:@{@"status":@"success"}]; break; } case WXErrCodeUserCancel:{ strMsg = @"已取消支付!"; [MYNotificationCenter postNotificationName:@"weixinPaystatusSuccess" object:nil userInfo:@{@"status":@"cancle"}]; break; } default:{ strMsg = [NSString stringWithFormat:@"支付失敗 !"]; [MYNotificationCenter postNotificationName:@"weixinPaystatusSuccess" object:nil userInfo:@{@"status":@"cancle"}]; break; } } UIAlertView *alert = [[UIAlertView alloc] initWithTitle:strTitle message:strMsg delegate:self cancelButtonTitle:@"確定" otherButtonTitles:nil, nil]; [alert show]; } }
由於我們的取消和失敗,2種狀態的處理結果都是一樣的,所以就用了相同的通知。
由於在調起支付頁面,在調起前就已經注冊了通知,現在支付完後,就可以收到支付狀態的通知了。下面就很簡單了吧
最後在說一下,
由於我們的付款性質不一樣,所以就遇到了同樣的支付成功狀態,由於不同的支付類型要跳轉的頁面也是不同的,這就要求在AppDelegate中的那個處理方法中識別出,不同的支付類型,(如充值,購物等)但是這個方法是微信api回調的方法,它只返回成功,取消,失敗等狀態。那就只能是支付前做個識別標示,但是由於支付跳到api了,脫離了應用,這個識別標示又無法直接傳過來。我想的方法就是保存一個支付標示:
[[NSUserDefaults standardUserDefaults] setObject:@"CHONGZHI" forKey:@"PAYTYPE"];
在每個類型的支付調起方法中,保存一下不同的key,然後再那個
-(void) onResp:(BaseResp*)resp
就總結到這吧!希望能幫到一些還在迷茫的新手,如有什麼錯誤的地方請指出,謝謝!