[置顶] iOS支付(包括支付宝、微信、银联)封装
2017-11-04 09:56
666 查看
前言
最近在学习构架,感觉到构架的魅力,自己用构架思想封装了一个支付集合,欢迎使用!
开发环境
1、xcode 8以上
2、iOS 7.0以上
支付SDK的集成
1、支付宝
参照博客 支付宝支付集成 ,里面很详细这里就不多说了。
2、微信支付
参照博客 微信支付集成
3、银联支付
银联支付要比支付宝及微信要简单
参照 银联支付集成
工程目录结构
依赖库目录
工厂模式
1、代理统一抽象接口
#import <UIKit/UIKit.h>
#import "TXP_Charge.h"
#import "TXP_PayComplation.h"
//代理模式->目标接口:支付接口
@protocol TXP_IPay <NSObject>
-(void)payWithCharge:(TXP_Charge*)charge controller:(UIViewController*)controller scheme:(NSString*)scheme withComplation:(TXP_PayComplation)complation;
//业务方法二:需要处理支付结果回调(9.0以前回调)
- (BOOL)handleOpenURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication withComplation:(TXP_PayComplation)complation;
//业务方法三:需要处理支付结果回调(9.0以后回调)
- (BOOL)handleOpenURL:(NSURL *)url withComplation:(TXP_PayComplation)complation;
@end
2、支付宝具体实现类(需要遵守自己TXP_IPay的抽象协议)
@interface TXP_ALiPay ()
@property (nonatomic)TXP_PayComplation complation;
@end
@implementation TXP_ALiPay
- (instancetype)init{
self = [superinit];
if (self) {
}
return
self;
}
- (void)payWithCharge:(TXP_Charge*)charge controller:(UIViewController *)controller scheme:(NSString *)scheme withComplation:(TXP_PayComplation)complation{
if (complation) {
_complation = complation;
}
[[AlipaySDK defaultService]payOrder:charge.orderNofromScheme:scheme
callback:^(NSDictionary *resultDic) {
NSString * state = [NSStringstringWithFormat:@"%@",resultDic[@"resultStatus"]];
if ([state
isEqualToString:@"9000"]) {
_complation(STR_PAY_SUCCESS,nil);
}
else if ([stateisEqualToString:@"6001"])
{
_complation(nil,[TXP_PayErrorUtilscreate:TXP_PayErrorActivation]);
}else
{
_complation(nil,[TXP_PayErrorUtilscreate:TXP_PayErrorActivation]);
}
}];
}
//业务方法二:需要处理支付结果回调(9.0以前回调)
- (BOOL)handleOpenURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication withComplation:(TXP_PayComplation)complation{
if (complation) {
_complation = complation;
}
if ([url.hostisEqualToString:@"safepay"]) {
//跳转支付宝钱包进行支付,处理支付结果
[[AlipaySDKdefaultService]
processOrderWithPaymentResult:urlstandbyCallback:^(NSDictionary *resultDic) {
// NSLog(@"result = %@",resultDic);
NSString * state = [NSStringstringWithFormat:@"%@",resultDic[@"resultStatus"]];
if ([state
isEqualToString:@"9000"]) {
[[NSNotificationCenterdefaultCenter]
postNotificationName:@"judgePayStatu"object:self];
} else
if ([state isEqualToString:@"6001"]){
[[NSNotificationCenterdefaultCenter]
postNotificationName:@"cancelPayment"object:self];
}
}];
}
return
YES;
}
//业务方法三:需要处理支付结果回调(9.0以后回调)
- (BOOL)handleOpenURL:(NSURL *)url withComplation:(TXP_PayComplation)complation{
return [selfhandleOpenURL:url
sourceApplication:nilwithComplation:complation];
}
3、微信具体实现类(需要遵守自己TXP_IPay的抽象协议)
@interface
TXP_WxPay ()<WXApiDelegate>
@property (nonatomic)TXP_PayComplation complation;
@end
@implementation TXP_WxPay
- (instancetype)init{
self = [superinit];
if (self) {
BOOL isSuccess = [WXApiregisterApp:@"这里填写注册key"];
if (isSuccess) {
NSLog(@"注册成功!");
}
}
return
self;
}
//业务方法一:需要调用微信支付接口(唤醒微信支付)
-(void)payWithCharge:(TXP_Charge*)charge controller:(UIViewController*)controller scheme:(NSString*)scheme withComplation:(TXP_PayComplation)complation{
_complation = complation;
NSString* timeStamp = [NSStringstringWithFormat:@"%@",[charge.credentialobjectForKey:@"timestamp"]];
PayReq *request = [[PayReqalloc]
init];
request.partnerId = [charge.credentialobjectForKey:@"partnerid"];
request.prepayId= [charge.credentialobjectForKey:@"prepayid"];
request.package =
@"Sign=WXPay";
request.nonceStr= [charge.credentialobjectForKey:@"noncestr"];
request.timeStamp= [timeStamp
intValue];
request.sign= [charge.credentialobjectForKey:@"sign"];
[WXApi sendReq:request];
}
//业务方法二:需要处理支付结果回调(9.0以前回调)
- (BOOL)handleOpenURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication withComplation:(TXP_PayComplation)complation{
if (complation) {
_complation = complation;
}
return [WXApihandleOpenURL:url
delegate:self];
}
//业务方法三:需要处理支付结果回调(9.0以后回调)
- (BOOL)handleOpenURL:(NSURL *)url withComplation:(TXP_PayComplation)complation{
return [selfhandleOpenURL:url
sourceApplication:nilwithComplation:complation];
}
-(void)onResp:(BaseResp*)resp{
if ([resp isKindOfClass:[PayRespclass]]){
PayResp*response=(PayResp*)resp;
switch(response.errCode){
case WXSuccess:
_complation(STR_PAY_SUCCESS,nil);
break;
caseWXErrCodeCommon:
_complation(nil,[TXP_PayErrorUtilscreate:TXP_PayErrorUnknownError]);
break;
caseWXErrCodeUserCancel:
_complation(nil,[TXP_PayErrorUtilscreate:TXP_PayErrorCancelled]);
break;
default:
_complation(nil,[TXP_PayErrorUtilscreate:TXP_PayErrorCancelled]);
break;
}
}
}
4、银联具体实现类(需要遵守自己TXP_IPay的抽象协议)
@interface
TXP_UnionPay ()
@property (nonatomic)TXP_PayComplation complation;
@end
@implementation TXP_UnionPay
//业务方法一:需要调用银联支付接口(唤醒银联支付)
//银联支付请求处理
- (void)payWithCharge:(TXP_Charge*)charge controller:(UIViewController *)controller scheme:(NSString *)scheme withComplation:(TXP_PayComplation)complation{
_complation = complation;
dispatch_sync(dispatch_get_main_queue(), ^{
//需要支付凭证
NSString* tn = [charge.credentialobjectForKey:@"tn"];
NSString* unionPaymode = [charge.credentialobjectForKey:@"mode"];
BOOL isSuccess = [[UPPaymentControldefaultControl]
startPay:tnfromScheme:scheme
mode:unionPaymode
viewController:controller];
if (!isSuccess) {
_complation(nil,[TXP_PayErrorUtilscreate:TXP_PayErrorActivation]);
}
});
}
//银联支付回调
//业务方法二:需要处理支付结果回调(9.0以前回调)
- (BOOL)handleOpenURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication withComplation:(TXP_PayComplation)complation{
if (complation) {
_complation = complation;
}
[[UPPaymentControldefaultControl]
handlePaymentResult:urlcompleteBlock:^(NSString *code,NSDictionary
*data) {
if([code isEqualToString:@"success"]) {
//结果code为成功时,去商户后台查询一下确保交易是成功的再展示成功
complation(STR_PAY_SUCCESS,nil);
}else if([codeisEqualToString:@"fail"]) {
//交易失败
complation(nil,[TXP_PayErrorUtilscreate:TXP_PayErrorUnknownError]);
}else if([codeisEqualToString:@"cancel"]) {
//交易取消
complation(nil,[TXP_PayErrorUtilscreate:TXP_PayErrorCancelled]);
}
}];
return
YES;
}
//业务方法三:需要处理支付结果回调(9.0以后回调)
- (BOOL)handleOpenURL:(NSURL *)url withComplation:(TXP_PayComplation)complation{
return [selfhandleOpenURL:url
sourceApplication:nilwithComplation:complation];
}
@end
单例模式调用方法类
+(instancetype)sharedEngine{
static TXP_PayEngine* payEngine;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
payEngine = [[self
alloc] init];
});
return payEngine;
}
- (instancetype)init{
self = [superinit];
if (self) {
[selfregisterChannel];
}
return
self;
}
//注册支付渠道
-(void)registerChannel{
_channelDic =
@{PAY_UNIONPAY : [[TXP_UnionPayalloc]
init],
PAY_WXPAY : [[TXP_WxPayalloc]
init],
PAY_ALIPAY: [[TXP_ALiPayalloc]init]
};
}
//处理支付
-(void)payWithCharge:(TXP_Charge*)charge controller:(UIViewController*)controller scheme:(NSString*)scheme withComplation:(TXP_PayComplation)complation{
//验证Controller是否为空
if (controller ==
nil) {
complation(nil,[TXP_PayErrorUtilscreate:TXP_PayErrorViewControllerIsNil]);
return;
}
_channel = charge.channel;
id<TXP_IPay> pay = [_channelDicobjectForKey:charge.channel];
if (pay == nil) {
complation(nil,[TXP_PayErrorUtilscreate:TXP_PayErrorInvalidChannel]);
return;
}
[pay payWithCharge:charge
controller:controller scheme:scheme
withComplation:complation];
}
//处理回调
- (BOOL)handleOpenURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication withComplation:(TXP_PayComplation)complation{
return [[_channelDicobjectForKey:_channel]handleOpenURL:url
sourceApplication:sourceApplication
withComplation:complation];;
}
- (BOOL)handleOpenURL:(NSURL *)url withComplation:(TXP_PayComplation)complation{
return [[_channelDicobjectForKey:_channel]handleOpenURL:url
sourceApplication:nilwithComplation:complation];
}
调用测试
@implementation ViewController
- (void)viewDidLoad {
[superviewDidLoad];
ViewController *
__weak weakSelf = self;
TXP_Charge *charge = [[TXP_Chargealloc]init];//此model配置从服务器获得的参数
charge.channel =
PAY_ALIPAY; //支付类型
[[TXP_PayEnginesharedEngine]
payWithCharge:chargecontroller:weakSelf
scheme:@"TXPPayDemo"withComplation:^(NSString *result,TXP_PayError
*error) {
//回调
if (error) {
//出现了异常
NSLog(@"%@",[errorgetMsg]);
}else{
//支付成功
NSLog(@"支付成功!");
}
}];
}
AppDelegate类里只需一句代码
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {
return [[TXP_PayEnginesharedEngine]
handleOpenURL:urlwithComplation:nil];
}
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication
annotation:(id)annotation {
return [[TXP_PayEnginesharedEngine]
handleOpenURL:urlwithComplation:nil];
}
Git 上传demo
支付demo 有问题留言或者给我发邮件1269456913@qq.com
相关文章推荐
- iOS支付宝,微信,银联支付集成封装(上)
- iOS支付宝,微信,银联支付集成封装调用(下)
- iOS支付宝、微信、银联支付集成封装调用(下)
- iOS支付宝、微信、银联支付集成封装调用(上)
- iOS 支付 [支付宝、银联、微信]
- iOS 支付 [支付宝、银联、微信](转载)
- iOS 支付 [支付宝 银联 微信]
- iOS 支付 [支付宝、银联、微信]
- iOS 支付 [支付宝、银联、微信]
- iOS相关支付,支付宝,微信,银联
- iOS 支付 [支付宝、银联、微信]
- iOS 支付 [支付宝、银联、微信]
- iOS 支付 [支付宝、银联、微信]
- iOS支付[支付宝、银联、微信]
- iOS 支付 [支付宝、银联、微信]
- iOS 支付 [支付宝、银联、微信]
- iOS支付[支付宝、银联、微信]
- iOS 支付 [支付宝、银联、微信]
- IOS开发之—— iOS 支付 [支付宝、银联、微信]
- iOS 支付 [支付宝、银联、微信]