• 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

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

  • 相关阅读:
    【WEBI专题】解决在交叉表中计算占比、偏差、率的问题
    前导零的问题(增加/删除)
    在SAP BW中使用ABAP
    如何组织维度
    BEx Query Designer中的变量及其增强
    《魔幻手机》经典台词摘录
    今天发现了VISTA系统的一个BUG
    Online Tools And Sofrware Directory Entry
    [转载]博客园通过Word 2007发布随笔
    为你的程序增加记忆功能
  • 原文地址:https://www.cnblogs.com/liuwenqiang/p/5621975.html
Copyright © 2020-2023  润新知