您的位置:首页 - 教程 - IOS - 正文
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

 

就总结到这吧!希望能帮到一些还在迷茫的新手,如有什么错误的地方请指出,谢谢!


评论:
  • 2016-11-11 10:56 你可以通过回调URL
  • 2016-11-11 10:57 商品描述来区分