iOS支付宝集成
使用cocopods安装
第一步:https://docs.open.alipay.com/54/104509来到这下载支付宝的示例Demo
image.png
第二步:打开示例Demo找到这几个文件拷贝放到桌面
Snip20180315_4.png
第三步:建一个Demo
3.1先把刚才拷贝出来的文件添加进工程
AlipaySDK.bundle
AlipaySDK.framework
3.2导入依赖库
Snip20180315_5.png
3.3把俩个.a文件加入库中
Snip20180315_6.png
3.4把openssl和Utils两个文件夹加入到项目中
这里注意要这样加入这两个文件
1025776-042b20e49de65d9b.gif
Snip20180315_7.png
否则容易报下面这个错误
Snip20180315_8.png
如果还是报这个错,那就这样
Snip20180315_9.png
3.4把下载的示例代码的几个文件拖入到项目中
Snip20180315_10.png
3.5.别忘记了把在info.plist中加上这个
Snip20180315_11.png
总于到代码了
1.在AppDelegate.m中导入头文件#import <AlipaySDK/AlipaySDK.h>添加如下代码
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { if ([url.host isEqualToString:@"safepay"]) { // 支付跳转支付宝钱包进行支付,处理支付结果 [[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) { NSLog(@"result = %@",resultDic); }]; // 授权跳转支付宝钱包进行支付,处理支付结果 [[AlipaySDK defaultService] processAuth_V2Result:url standbyCallback:^(NSDictionary *resultDic) { NSLog(@"result = %@",resultDic); // 解析 auth code NSString *result = resultDic[@"result"]; NSString *authCode = nil; if (result.length>0) { NSArray *resultArr = [result componentsSeparatedByString:@"&"]; for (NSString *subResult in resultArr) { if (subResult.length > 10 && [subResult hasPrefix:@"auth_code="]) { authCode = [subResult substringFromIndex:10]; break; } } } NSLog(@"授权结果 authCode = %@", authCode?:@""); }]; } return YES; } // NOTE: 9.0以后使用新API接口 - (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options { if ([url.host isEqualToString:@"safepay"]) { // 支付跳转支付宝钱包进行支付,处理支付结果 [[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) { NSLog(@"result = %@",resultDic); }]; // 授权跳转支付宝钱包进行支付,处理支付结果 [[AlipaySDK defaultService] processAuth_V2Result:url standbyCallback:^(NSDictionary *resultDic) { NSLog(@"result = %@",resultDic); // 解析 auth code NSString *result = resultDic[@"result"]; NSString *authCode = nil; if (result.length>0) { NSArray *resultArr = [result componentsSeparatedByString:@"&"]; for (NSString *subResult in resultArr) { if (subResult.length > 10 && [subResult hasPrefix:@"auth_code="]) { authCode = [subResult substringFromIndex:10]; break; } } } NSLog(@"授权结果 authCode = %@", authCode?:@""); }]; } return YES; }
在需要支付的地方
导入头文件
import <AlipaySDK/AlipaySDK.h>
这里的aliPay 就是调起支付宝支付
- (void)aliPay { NSString *appScheme = @"app.haha.2018.3.15"; // NOTE: 调用支付结果开始支付 [[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary *resultDic) { NSLog(@"reslut = %@",resultDic); }]; }
特别注意⚠️这里的appScheme要设置为一样,因为支付后,要回到原来的应用程序,必须要对应一样
Snip20180315_17.png
结果如下
Snip20180315_15.png
方式二:
第一步:
platform :ios, ’10.0’ #use_frameworks!个别需要用到它,比如reactiveCocoa def pods pod 'AlipaySDK-iOS' end target 'alipayDEMO' do pods end
第二步:把demo中下载的这个几个文件拖到到项目中
image.png
第三步:特别注意openssl这个文件的路径,容易报找不到这个头文件
image.png
第四步:注意添加URL Schemes
image.png
第五步:代码
在AppDelegate.h文件中导入头文件#import <AlipaySDK/AlipaySDK.h>
并添加如下代码
// NOTE: 9.0以后使用新API接口 - (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options { if ([url.host isEqualToString:@"safepay"]) { // 支付跳转支付宝钱包进行支付,处理支付结果 [[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) { NSLog(@"result = %@",resultDic); }]; // 授权跳转支付宝钱包进行支付,处理支付结果 [[AlipaySDK defaultService] processAuth_V2Result:url standbyCallback:^(NSDictionary *resultDic) { NSLog(@"result = %@",resultDic); // 解析 auth code NSString *result = resultDic[@"result"]; NSString *authCode = nil; if (result.length>0) { NSArray *resultArr = [result componentsSeparatedByString:@"&"]; for (NSString *subResult in resultArr) { if (subResult.length > 10 && [subResult hasPrefix:@"auth_code="]) { authCode = [subResult substringFromIndex:10]; break; } } } NSLog(@"授权结果 authCode = %@", authCode?:@""); }]; } return YES; }
在需要的地方添加支付或者添加预授权
UIButton *payBtn = [[UIButton alloc] init]; payBtn.frame = CGRectMake(10, 100, 100, 100); payBtn.backgroundColor = [UIColor redColor]; [payBtn setTitle:@"支付" forState:UIControlStateNormal]; [payBtn addTarget:self action:@selector(payBtnClick) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:payBtn]; UIButton *AuthBtn = [[UIButton alloc] init]; AuthBtn.frame = CGRectMake(200, 100, 100, 100); AuthBtn.backgroundColor = [UIColor redColor]; [AuthBtn setTitle:@"授权" forState:UIControlStateNormal]; [AuthBtn addTarget:self action:@selector(AuthBtnClick) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:AuthBtn]; } //支付 - (void)payBtnClick { NSString *appScheme = @"app.alipay.2020.6.12"; // NOTE: 调用支付结果开始支付 [[AlipaySDK defaultService] payOrder:@"111" fromScheme:appScheme callback:^(NSDictionary *resultDic) { NSLog(@"reslut = %@",resultDic); }]; } //预授权 - (void)AuthBtnClick { NSString *pid = @""; NSString *appID = @""; NSString *rsa2PrivateKey = @""; NSString *rsaPrivateKey = @""; //pid和appID获取失败,提示 if ([pid length] == 0 || [appID length] == 0 || ([rsa2PrivateKey length] == 0 && [rsaPrivateKey length] == 0)) { UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"提示" message:@"缺少pid或者appID或者私钥,请检查参数设置" preferredStyle:UIAlertControllerStyleAlert]; UIAlertAction *action = [UIAlertAction actionWithTitle:@"知道了" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action){ }]; [alert addAction:action]; [self presentViewController:alert animated:YES completion:^{ }]; return; } //生成 auth info 对象 APAuthInfo *authInfo = [APAuthInfo new]; authInfo.pid = pid; authInfo.appID = appID; //auth type NSString *authType = [[NSUserDefaults standardUserDefaults] objectForKey:@"authType"]; if (authType) { authInfo.authType = authType; } //应用注册scheme,在AlixPayDemo-Info.plist定义URL types NSString *appScheme = @"alipayDEMO"; // 将授权信息拼接成字符串 NSString *authInfoStr = [authInfo description]; NSLog(@"authInfoStr = %@",authInfoStr); // 获取私钥并将商户信息签名,外部商户可以根据情况存放私钥和签名,只需要遵循RSA签名规范,并将签名字符串base64编码和UrlEncode NSString *signedString = nil; APRSASigner* signer = [[APRSASigner alloc] initWithPrivateKey:((rsa2PrivateKey.length > 1)?rsa2PrivateKey:rsaPrivateKey)]; if ((rsa2PrivateKey.length > 1)) { signedString = [signer signString:authInfoStr withRSA2:YES]; } else { signedString = [signer signString:authInfoStr withRSA2:NO]; } // 将签名成功字符串格式化为订单字符串,请严格按照该格式 if (signedString.length > 0) { authInfoStr = [NSString stringWithFormat:@"%@&sign=%@&sign_type=%@", authInfoStr, signedString, ((rsa2PrivateKey.length > 1)?@"RSA2":@"RSA")]; [[AlipaySDK defaultService] auth_V2WithInfo:authInfoStr fromScheme:appScheme callback:^(NSDictionary *resultDic) { NSLog(@"result = %@",resultDic); // 解析 auth code NSString *result = resultDic[@"result"]; NSString *authCode = nil; if (result.length>0) { NSArray *resultArr = [result componentsSeparatedByString:@"&"]; for (NSString *subResult in resultArr) { if (subResult.length > 10 && [subResult hasPrefix:@"auth_code="]) { authCode = [subResult substringFromIndex:10]; break; } } } NSLog(@"授权结果 authCode = %@", authCode?:@""); }]; } }