# RZPayManager **Repository Path**: reyzhang/RZPayManager ## Basic Information - **Project Name**: RZPayManager - **Description**: 支付组件, 统一支付接口。 封装了支付宝,微信,银联,为移动支付提供便捷接入。 - **Primary Language**: Objective-C - **License**: MIT - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-05-17 - **Last Updated**: 2022-01-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: 支付组件 ## README # RZPayManager ## 介绍 RZPayManager是对时下各第三方支付平台的整合,将支付的调用简单化,组件化。 目前支持的第三方支付平台有: 1. 微信支付 2. 支付宝支付 ## 安装 可以通过cocopods来安装,将如下代码加入到你的Podfile文件中 ``` pod 'RZPayManager' ``` ## 使用 ``` //1. 设置URL Scheme,用于支付完成后的回调 PayConfig *config = [PayConfig config]; config.appScheme = @"your scheme"; //2. 注册支付平台 [PayConfig registPlatforms:^(PaySDKRegister * _Nonnull platformsRegister) { //注册微信支付 [platformsRegister setupWeChatWithAppId:@"wx_appid" appSecret:@"wx_appSecret" universalLink:@"wx_universalLink"]; }]; ``` PayConfig类是支付配置类(单例对象),提供支付需要的配置信息 发起支付请求,离不开去业务方获取支付数据。 为了让组件不藕合获取业务数据的请求处理,在设计时使用了面向协议的方式进行隔离。 PayDataPrepareProtocol 协议 ``` @protocol PayDataPrepareProtocol @property (nonatomic,strong) NSDictionary *requestParams; @required - (void)getPayData:(void(^)(id result, NSError *error))block; @end ``` 以微信支付为例, 在发起微信支付请求后,需要向服务器端请求支付的数据,再交由支付组件完成支付。所以获取支付数据的类,需要实现PayDataPrepareProtocol这个协议 ``` @interface WXPrepareData : NSObject @end ``` ``` @implementation WXPrepareData @synthesize requestParams; - (void)getPayData:(void (^)(id, NSError *))block { //发起网络请求,并返回数据 [[ServerManger getInstance] OrderOrderPayOrderId:self.requestParams[@"orderId"] payType:@"2" payAmount:self.requestParams[@"payAmount"] Success:^(BOOL Success,NSDictionary *dic) { !block ?: block(dic,nil); } failure:^(NSError *error) { !block ?: block(nil,error); }]; } ``` 这个获取支付数据的类在添加完以后,需要注册一下才可以被组件使用 ``` //添加微信 获取预支付信息的协议 [config appendPrepayDataStrategy:[WXPrepareData class] withPayType:PayTypeForWXPay]; ``` 如上的处理,都是支付发起前的配置,可以在应用启动后来设置。 完整代码: ``` //1. 设置URL Scheme,用于支付完成后的回调 PayConfig *config = [PayConfig config]; config.appScheme = @"your scheme"; //2. 注册支付平台 [PayConfig registPlatforms:^(PaySDKRegister * _Nonnull platformsRegister) { //注册微信支付 [platformsRegister setupWeChatWithAppId:@"wx_appid" appSecret:@"wx_appSecret" universalLink:@"wx_universalLink"]; }]; //3. 注册支付数据获取策略 [config appendPrepayDataStrategy:[WXPrepareData class] withPayType:PayTypeForWXPay]; ``` 支付组件的调用就简单了, 使用代码如下: ``` self.payManager = [[RZPayManager alloc] initWithPayType:self.payType delegate:self]; self.payManager.fromVC = self; self.payManager.requestParams = @{@"orderId":self.model.orderId,@"payAmount":@"0.0"}; [self.payManager startPay]; ``` 注意: RZPayManager对象在使用时,要声明为局部变量或用属性, 不然对象可能会因为被提前释放而接收不到支付回调 ## 处理支付回调 支付组件在成功或失败后会回调url来返回支付结果, 在AppDelegate的代理方法中拦截并处理 ``` - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { [RZPayManager parseCallbackUrl:url]; return YES; } -(BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary *)options{ [RZPayManager parseCallbackUrl:url]; return YES; } - (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url { [RZPayManager parseCallbackUrl:url]; return YES; } ```