iOS开发

iOS-快速集成支付宝支付、微信支付的管理类

2018-07-31  本文已影响101人  Simple_Code

一:封装支付宝支付

#import <Foundation/Foundation.h>

UIKIT_EXTERN NSNotificationName const XQPAliPaySuccessNotification;
UIKIT_EXTERN NSNotificationName const XQPAliPayFailNotification;

typedef void (^XQPAliPayCompletionBlock) (BOOL);

@interface XQPAliPayManager : NSObject
/*
 单利
 */
+ (instancetype)sharedInstance;


/**
 调起支付

 @param orderStr 后台签名字符串
 */
- (void)payOrder:(NSString *)orderStr;

/**
 *  支付接口
 *
 *  @param orderStr       订单信息
 *  @param completionBlock 支付结果回调Block,用于wap支付结果回调(非跳转钱包支付)
 */
- (void)payOrder:(NSString *)orderStr
        callback:(XQPAliPayCompletionBlock)completionBlock;


/**
 处理AppDelegate里面的回调

 @param url 回调的Url
 */
- (void)processOrderWithPaymentResult:(NSURL *)url;
@end
#import "XQPAliPayManager.h"
#import <AlipaySDK/AlipaySDK.h>

NSNotificationName const XQPAliPaySuccessNotification = @"XQPAliPaySuccessNotification";
NSNotificationName const XQPAliPayFailNotification = @"XQPAliPayFailNotification";

@implementation XQPAliPayManager

+ (instancetype)sharedInstance {
    static dispatch_once_t onceToken;
    static XQPAliPayManager *sharedInstance;
    dispatch_once(&onceToken, ^{
        sharedInstance = [[XQPAliPayManager alloc] init];
    });
    return sharedInstance;
}

#pragma mark - 跳转网页钱包支付
- (void)payOrder:(NSString *)orderStr {
    // NOTE: 调用支付结果开始支付
    [[AlipaySDK defaultService] payOrder:orderStr fromScheme:@"XQPParkingAliPay" callback:^(NSDictionary *resultDic) {
        NSLog(@"reslut = %@",resultDic);
        [self dealwithPayResult:resultDic];
    }];
}
- (void)payOrder:(NSString *)orderStr
        callback:(XQPAliPayCompletionBlock)completionBlock {
    // NOTE: 调用支付结果开始支付
    [[AlipaySDK defaultService] payOrder:orderStr fromScheme:@"XQPParkingAliPay" callback:^(NSDictionary *resultDic) {
        NSLog(@"reslut = %@",resultDic);
        completionBlock(resultDic);
    }];
}

#pragma mark - 跳转钱包支付
- (void)processOrderWithPaymentResult:(NSURL *)url {
    //跳转支付宝钱包进行支付,处理支付结果
    [[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
        NSLog(@"result = %@",resultDic);
        [self dealwithPayResult:resultDic];
    }];
}

// 处理支付结果
- (void)dealwithPayResult:(NSDictionary *)resultDic {
    int statusCode = [resultDic[@"resultStatus"]  intValue];
    if (statusCode == 9000 || statusCode == 8000){
        // 支付成功
        [[NSNotificationCenter defaultCenter] postNotificationName:XQPAliPaySuccessNotification object:nil userInfo:nil];
    } else  {
        // 交易失败
        [[NSNotificationCenter defaultCenter] postNotificationName:XQPAliPayFailNotification object:nil];
    }
}
@end

调起支付宝及其通知结果处理:

// 支付成功的回调
[XQPNotificationCenter addObserver:self selector:@selector(paySuccess:) name:XQPAliPaySuccessNotification object:nil];
// 支付失败的回调
[XQPNotificationCenter addObserver:self selector:@selector(payFail:) name:XQPAliPayFailNotification object:nil];
// 调起支付宝
[[XQPAliPayManager sharedInstance] payOrder:responseObject[@"result"][@"rechargeSign"]];

// 支付宝支付成功的通知
- (void)paySuccess:(NSNotification *)noti {
    [XQPNotificationCenter removeObserver:self];
}
// 支付宝支付失败的通知
- (void)payFail:(NSNotification *)noti {
    [XQPNotificationCenter removeObserver:self];
}

二:封装微信支付

#import <Foundation/Foundation.h>
#import "WXApi.h"

UIKIT_EXTERN NSNotificationName const XQPWeiXinPaySuccessNotification;
UIKIT_EXTERN NSNotificationName const XQPWeiXinPayFailNotification;

@protocol XQPApiManagerDelegate <NSObject>
@required
// 支付成功的代理
- (void)managerDidRecvPaymentResponse:(PayResp *)response;
@end

@interface XQPWeiXinPayManager : NSObject<WXApiDelegate>
/*
 单利
 */
+ (instancetype)sharedInstance;

/*
 调起微信支付
 */
- (void)weiXinPayWithDic:(NSDictionary *)wechatPayDic;

/*
 代理
 */
@property (nonatomic, assign) id<XQPApiManagerDelegate> delegate;

@end
#import "XQPWeiXinPayManager.h"

NSNotificationName const XQPWeiXinPaySuccessNotification = @"XQPWeiXinPaySuccessNotification";
NSNotificationName const XQPWeiXinPayFailNotification = @"XQPWeiXinPayFailNotification";

@interface XQPWeiXinPayManager()
@property(nonatomic, strong) NSDictionary *wechatPayDic;
@end
@implementation XQPWeiXinPayManager

+ (instancetype)sharedInstance {
    static dispatch_once_t onceToken;
    static XQPWeiXinPayManager *sharedInstance;
    dispatch_once(&onceToken, ^{
        sharedInstance = [[XQPWeiXinPayManager alloc] init];
    });
    return sharedInstance;
}

- (void)weiXinPayWithDic:(NSDictionary *)wechatPayDic {
    
    if (!XQPDictIsEmpty(wechatPayDic)) {
        self.wechatPayDic = wechatPayDic;
    }
    // 向微信注册您的APPID
    [WXApi registerApp:wechatPayDic[@"appid"]];
    PayReq *req = [[PayReq alloc] init];
    req.openID = [wechatPayDic objectForKey:@"appid"];
    req.partnerId = [wechatPayDic objectForKey:@"partnerid"];
    req.prepayId = [wechatPayDic objectForKey:@"prepayid"];
    req.package = [wechatPayDic objectForKey:@"packages"];
    req.nonceStr = [wechatPayDic objectForKey:@"noncestr"];
    req.timeStamp = [[wechatPayDic objectForKey:@"timestamp"] intValue];
    req.sign = [wechatPayDic objectForKey:@"sign"];
    [WXApi sendReq:req];
}

// 微信支付返回结果回调
- (void)onResp:(BaseResp *)resp {
    
    if ([resp isKindOfClass:[PayResp class]]) {
        PayResp *response = (PayResp *)resp;
        
        if (response.errCode == WXSuccess) {
            // 支付成功
            [[NSNotificationCenter defaultCenter] postNotificationName:XQPWeiXinPaySuccessNotification object:nil userInfo:nil];
        } else {
            // 支付失败
            [[NSNotificationCenter defaultCenter] postNotificationName:XQPWeiXinPayFailNotification object:nil userInfo:nil];
        }
    }
}
@end

调起微信及其通知结果处理:

// 微信成功的回调
[XQPNotificationCenter addObserver:self selector:@selector(paySuccess:) name:XQPWeiXinPaySuccessNotification object:nil];
// 微信失败的回调
[XQPNotificationCenter addObserver:self selector:@selector(payFail:) name:XQPWeiXinPayFailNotification object:nil];
// 调起微信支付
[[XQPWeiXinPayManager sharedInstance] weiXinPayWithDic:responseObject[@"result"]];

// 微信支付成功的通知
- (void)paySuccess:(NSNotification *)noti {
    [XQPNotificationCenter removeObserver:self];
}
// 微信支付失败的通知
- (void)payFail:(NSNotification *)noti {
    [XQPNotificationCenter removeObserver:self];
}

最后

微信和支付宝在Appdelegate里面回调的处理:

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
    if ([url.host isEqualToString:@"safepay"]) {//支付宝
        [[XQPAliPayManager sharedInstance] processOrderWithPaymentResult:url];
    }else if([url.host isEqualToString:@"pay"]){//微信 {
        [WXApi handleOpenURL:url delegate:[XQPWeiXinPayManager sharedInstance]];
    }
    return YES;
}

// NOTE: 9.0以后使用新API接口
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options {
    if ([url.host isEqualToString:@"safepay"]) {//支付宝
        [[XQPAliPayManager sharedInstance] processOrderWithPaymentResult:url];
    }else if([url.host isEqualToString:@"pay"]){//微信
        [WXApi handleOpenURL:url delegate:[XQPWeiXinPayManager sharedInstance]];
    }
    return YES;
}
上一篇下一篇

猜你喜欢

热点阅读