美文网首页
iOS开发 - 支付宝/微信第三方支付工具类

iOS开发 - 支付宝/微信第三方支付工具类

作者: 阿唯不知道 | 来源:发表于2019-08-01 11:19 被阅读0次

    调用方式

    // 支付结果监听
    [YWPayHepler shareHelper].payResultBlock = ^(BOOL result, NSString * _Nonnull resultMsg) {
        NSLog(@"结果回调:%@ ---> %@", (result ? @"支付成功" : @"支付失败"), resultMsg);
    };
    

    YWPayHepler .h

    #import <Foundation/Foundation.h>
    
    #import <AlipaySDK/AlipaySDK.h>
    #import "WXApi.h"
    
    #define YWPayResultNotice           @"MGPayResultNotice"            // 支付结果通知
    
    NS_ASSUME_NONNULL_BEGIN
    
    @interface YWPayHepler : NSObject
    
    /** 回调 result支付结果状态(成功/失败) resultMsg支付结果消息 */
    @property (nonatomic, copy) void (^payResultBlock)(BOOL result, NSString *resultMsg);
    
    + (instancetype)shareHelper;
    
    /**
     支付宝支付
     拉起本地客户端支付成功后在[AppDelegate application:openURL:options:]中回调支付结果
    
     @param paySign     支付签名
     @param resultBlock 支付结果回调(H5网页支付回调)
     */
    + (void)aliPayOrderWithSign:(NSString *)paySign
                    resultBlock:(void (^)(NSDictionary *resultDic))resultBlock;
    @end
    

    YWPayHepler .m

    #import "YWPayHepler.h"
    
    static YWPayHepler *helper = nil;
    @implementation YWPayHepler
    
    + (instancetype)shareHelper
    {
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            helper = [[YWPayHepler alloc] init];
        });
        return helper;
    }
    
    - (id)init
    {
        self = [super init];
        if (self) {
            [self _initHelper];
        }
        return self;
    }
    
    - (void)dealloc
    {
        [[NSNotificationCenter defaultCenter] removeObserver:self];
    }
    
    #pragma mark - init
    - (void)_initHelper
    {
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(payResultHandleNotification:) name:YWPayResultNotice object:nil];
    }
    
    #pragma mark -- 支付回调(微信支付回调 & 支付宝支付回调)
    - (void)payResultHandleNotification:(NSNotification *)notification {
        
        BOOL result = NO;
        NSString *resultMsgStr = @"支付结果";
        
        //支付宝支付 - 回调(用userInfo)
        if (notification.userInfo) {
            // 支付结果解析
            NSInteger resultStatus = [notification.userInfo[@"resultStatus"] integerValue];
            switch (resultStatus) {
                case 9000:
                {
                    result = YES;
                    resultMsgStr = @"支付成功";
                    // 更新用户余额
                    [MGUserNetworkManager updateUserBalanceBlock:^(BOOL success) {}];
                }
                    break;
                case 4000:
                    resultMsgStr = @"支付失败";
                    break;
                case 6001:
                    resultMsgStr = @"用户中途取消支付";
                    break;
                case 6002:
                    resultMsgStr = @"支付失败 - 网络连接出错";
                    break;
                case 8000:
                    resultMsgStr = @"正在处理中";
                    break;
                default:
                    resultMsgStr = @"支付失败 - 未知原因";
                    break;
            }
            
        }
        
        //微信支付 - 回调(用object)
        if (notification.object) {
            //回调消息
            PayResp *payResp = notification.object;
            switch (payResp.errCode) {
                case WXSuccess:
                    result = YES;
                    resultMsgStr = @"支付成功";
                    break;
                case WXErrCodeCommon:
                    resultMsgStr = @"支付失败";//签名错误、未注册APPID、项目设置APPID不正确、注册的APPID与设置的不匹配、其他异常等
                    break;
                case WXErrCodeUserCancel:
                    resultMsgStr = @"支付取消";
                    break;
                case WXErrCodeSentFail:
                    resultMsgStr = @"发送失败";
                    break;
                case WXErrCodeUnsupport:
                    resultMsgStr = @"支付不支持";
                    break;
                case WXErrCodeAuthDeny:
                    resultMsgStr = @"支付授权失败";
                    break;
                default:
                    resultMsgStr = @"支付失败 - 未知原因";
                    break;
            }
        }
        
        // 弹窗支付结果
        [self showAlertWithResultMessage:resultMsgStr result:result];
    }
    
    #pragma mark - * * * * * private * * * * *
    
    - (void)showAlertWithResultMessage:(NSString *)msgStr result:(BOOL)result {
        
        UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"提示" message:msgStr preferredStyle:UIAlertControllerStyleAlert];
        UIAlertAction *okAction = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
            if (self.payResultBlock) {
                self.payResultBlock(result, msgStr);
            }
        }];
        [alertController addAction:okAction];
        UIWindow *window = [[UIApplication sharedApplication] keyWindow];
        UIViewController *rootViewController = window.rootViewController;
        [rootViewController presentViewController:alertController animated:YES completion:nil];
    }
    
    + (void)aliPayOrderWithSign:(NSString *)paySign resultBlock:(void (^)(NSDictionary * _Nonnull))resultBlock {
        // 拿着支付宝订单签名使用SDK发起支付
        [[AlipaySDK defaultService] payOrder:paySign fromScheme:YWPayURLScheme callback:resultBlock];
    }
    @end
    
    ### 其他demo参考
    /* 微信支付
    Log(@"微信支付签名信息 - %@",signDic);
    PayReq *request = [[PayReq alloc] init];
    request.partnerId = [signDic[@"partnerid"] mutableCopy];
    request.prepayId = [signDic[@"prepayid"] mutableCopy];
    request.package = [signDic[@"package"] mutableCopy];
    request.nonceStr = [signDic[@"noncestr"] mutableCopy];
    int ivalue = [[signDic[@"timestamp"] mutableCopy] intValue];
    request.timeStamp = ivalue;
    request.sign = [signDic[@"sign"] mutableCopy];
    
    if (![WXApi sendReq: request]) {
        NSLog(@"微信支付失败");
    } else {
        NSLog(@"微信操作请求成功(并非支付成功,成功后会在Appdelegate里面回调)");
    }
    */
    
    #pragma mark - * * * * * AppDelegate.m 中的支付回调 * * * * *
    // 只适用于iOS9以上,会优先走这个方法
    - (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString *, id> *)options {
    
        if ([url.host isEqualToString:@"safepay"]) {
            // 支付跳转支付宝钱包进行支付,处理支付结果
            [[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
                MGLog(@"支付跳转支付宝钱包进行支付,处理支付结果回调:result = %@",resultDic);
                [[NSNotificationCenter defaultCenter] postNotificationName:YWPayResultNotice object:nil userInfo:resultDic];
            }];
            return YES;
        }else if ([url.scheme isEqualToString:WX_KEY]) {
            // 微信支付回调处理(处理后走代理方法:- (void)onResp:(BaseResp *)resp)
            return [WXApi handleOpenURL:url delegate:self];
        }
        return YES;
    
    }
    
    // 微信回调处理
    - (void)onResp:(BaseResp *)resp {
        //微信支付回调
        PayResp *payResp = (PayResp *) resp;
        [[NSNotificationCenter defaultCenter] postNotificationName: YWPayResultNotice object:payResp userInfo:nil];
    }
    

    相关文章

      网友评论

          本文标题:iOS开发 - 支付宝/微信第三方支付工具类

          本文链接:https://www.haomeiwen.com/subject/tbxqdctx.html