iOS 微信和支付寶關於回調處理


在支付這一塊,發現講支付集成的比較多,但是關於支付后回調處理的不多見,(當時因為這個問題懵逼了好久)就自己總結一下,

1.支付寶回調

  支付寶的回調想對來說比較簡單一些,因為支付寶的回調就在調起支付寶的那個方法中的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]; }]; }

上面我只對,成功,取消,失敗 三種狀態進行判斷,想仔細了解可以查看官方文檔。

2.微信支付的回調

  首先,支付回調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

 

就總結到這吧!希望能幫到一些還在迷茫的新手,如有什么錯誤的地方請指出,謝謝!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM