RZPayManager是对时下各第三方支付平台的整合,将支付的调用简单化,组件化。 目前支持的第三方支付平台有:
- 微信支付
- 支付宝支付
- 银联
可以通过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 <NSObject>
@property (nonatomic,strong) NSDictionary *requestParams;
@required
- (void)getPayData:(void(^)(id result, NSError *error))block;
@end
以微信支付为例, 在发起微信支付请求后,需要向服务器端请求支付的数据,再交由支付组件完成支付。所以获取支付数据的类,需要实现PayDataPrepareProtocol这个协议
@interface WXPrepareData : NSObject<PayDataPrepareProtocol>
@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<NSString *,id> *)options{
[RZPayManager parseCallbackUrl:url];
return YES;
}
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {
[RZPayManager parseCallbackUrl:url];
return YES;
}