上一个项目当中有用到支付宝的支付功能,但现在这个项目里因为集成了阿里百川的SDK,不能再简单的ctrl+c,然后ctrl+v,所以期间遇到一些小问题,配合后台(司马同学)一起把支付宝的功能给完成,在此做个简单的分享。(注:现为md格式编辑)
1.集成支付宝的方法
- 首先,回顾一下上一个项目中支付宝集成的图文方法,从官方支付宝开放平台下载所需的文件,解压支付宝钱包支付接口开发包2.0标准版(iOS 15.0.2),整理相关文件,如下图:
- 把必须的文件(AlipaySDK)导入工程中,如下图:
- 然后按照官方文档导入相应的依赖,如图:
- 在此,默认你的工程已经适配过9.0,下面就直接上代码:
// 导入头文件
#import "Order.h"
#import "DataSigner.h"
#import <AlipaySDK/AlipaySDK.h>
- 生成订单描述并对商户私钥签名,然后拼接参数唤起支付宝
- (void)zhifubaoPayMethod {
[MBProgressHUD showMessage:@"正在跳转支付宝"];
//将商品信息赋予AlixPayOrder的成员变量
Order *order = [[Order alloc] init];
order.partner = PartnerID;
order.seller = SellerID;
order.tradeNO = self.gold_sn; //订单ID(由商家自行制定)
order.productName = self.shopName; //商品标题
order.productDescription = @"消费金额"; //商品描述
order.amount = self.payCount; //商品价格
order.notifyURL = @"http://www.ccuuu.com"; //回调URL
#warning order.service = 一定不能为空
order.service = @"mobile.securitypay.pay";
NSString *appScheme = @"1:5maidan";
//将商品信息拼接成字符串
NSString *orderSpec = [order description];
//获取私钥并将商户信息签名,外部商户可以根据情况存放私钥和签名,只需要遵循RSA签名规范,并将签名字符串base64编码和UrlEncode
id<DataSigner> signer = CreateRSADataSigner(PartnerPrivKey);
//将签名成功字符串格式化为订单字符串,请严格按照该格式
NSString *signedString = [signer signString:orderSpec];
NSString *orderString = nil;
if (signedString != nil) {
orderString = [NSString stringWithFormat:@"%@&sign=\"%@\"&sign_type=\"%@\"",
orderSpec, signedString, @"RSA"];
[[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary *resultDic) {
LXLog(@"reslut = %@",resultDic);
if ([resultDic[@"resultStatus"] intValue] == 9000) {
// 第三方支付结果处理
[self pay_success];
} else {
[MBProgressHUD showError:@"支付失败"];
}
}];
}
}
至此,希望已经可以正常唤起支付宝。
2.集成阿里百川SDK后,唤起支付宝的方法
- 首先,当前的项目当中集成的是阿里百川SDK,故而想到本来就是淘宝下面的一个附属产品,里面肯定会有唤起支付宝支付的功能,果不其然支付宝要用的AlipaySDK.bundle和AlipaySDK.framework两个文件都有,直接上图,(百川SDK下载流程)。
- 在需要唤起支付宝支付的类中导入头文件。
#import <AlipaySDK/AlipaySDK.h>
- 唤起支付宝的方法,第一步:发送订单的基本信息到后台,请求RSA签名
-(void)becomeVIPBtnClick:(UIButton *)button {
//价格显示
if (button.tag == 2) {
NSString *str = _jinKaPriceLbl.text;
NSRange range = [str rangeOfString:@"元"];
_amount = [str substringToIndex:range.location];
} else {
NSString *str = _baiJinPriceLbl.text;
NSRange range = [str rangeOfString:@"元"];
_amount = [str substringToIndex:range.location];
}
NSString *tradeNO = [self generateTradeNO];
NSString *urlStr = [NSString stringWithFormat:@"%@/home/cc/buy_card", SERVERURL];
NSMutableDictionary *params = [NSMutableDictionary dictionary];
params[@"subject"] = @"XXX";
params[@"total_fee"] = _amount;
params[@"out_trade_no"] = tradeNO;
__weak typeof(self) weakSelf = self;
[HttpTool POST:urlStr parameters:params success:^(id responseObject) {
// LXLog(@"%@", responseObject);
if ([responseObject[@"status"] intValue] == 200) {
_RSAString = responseObject[@"url"];
[weakSelf wakeUpZhifubaoWithRSAString:_RSAString withButton:button];
} else {
[SVProgressHUD showErrorWithStatus:@"获取RSA失败" maskType:SVProgressHUDMaskTypeGradient];
}
} failure:^(NSError *error) {
LXLog(@"%@",error);
}];
}
第二步:唤起支付宝的方法
- (void)wakeUpZhifubaoWithRSAString:(NSString *)RSAString withButton:(UIButton *)sender{
NSString *appScheme = @"YourScheme";
__weak typeof(self) weakSelf = self;
if (RSAString) {
//跳转支付宝
[[AlipaySDK defaultService] payOrder:RSAString fromScheme:appScheme callback:^(NSDictionary *resultDic) {
LXLog(@"reslut = %@",resultDic);
if ([resultDic[@"resultStatus"] intValue] == 9000) {
// 第三方支付结果处理
[weakSelf pay_success:sender];
} else if ([resultDic[@"resultStatus"] intValue] == 8000) {
[SVProgressHUD showErrorWithStatus:@"正在处理中" maskType:SVProgressHUDMaskTypeGradient];
} else if ([resultDic[@"resultStatus"] intValue] == 4000) {
[SVProgressHUD showErrorWithStatus:@"订单支付失败" maskType:SVProgressHUDMaskTypeGradient];
} else if ([resultDic[@"resultStatus"] intValue] == 6001) {
[SVProgressHUD showErrorWithStatus:@"用户中途取消" maskType:SVProgressHUDMaskTypeGradient];
} else if ([resultDic[@"resultStatus"] intValue] == 6002) {
[SVProgressHUD showErrorWithStatus:@"网络连接出错" maskType:SVProgressHUDMaskTypeGradient];
} else {
[SVProgressHUD showErrorWithStatus:@"未知错误" maskType:SVProgressHUDMaskTypeGradient];
}
}];
}
}
3.总结
1.引用支付宝开放平台官方的意思,商户在接入的过程中,对于订单的签名行为需发生在服务端(私钥需要妥善保管),切忌将私钥落在客户端进行签名。
2.难点:商户私钥、支付宝公钥生成,以及导入相关依赖库。
注:此次的发布的不是以MD格式编辑,现在重新生成一遍,顺便复习了一下。