上一个项目当中有用到支付宝的支付功能,但现在这个项目里因为集成了阿里百川的SDK,不能再简单的ctrl+c,然后ctrl+v,所以期间遇到一些小问题,配合后台(司马同学)一起把支付宝的功能给完成,在此做个简单的分享。
1.集成支付宝的方法
- 首先,回顾一下上一个项目中支付宝集成的图文方法,从官方支付宝开放平台下载所需的文件,解压支付宝钱包支付接口开发包2.0标准版(iOS 15.0.2),整理相关文件,如下图:

- 把必须的文件(AlipaySDK)导入工程中,如下图:


- 在此,默认你的工程已经适配过9.0,下面就直接上代码:
1 2 3 4
| #import "Order.h" #import "DataSigner.h" #import <AlipaySDK/AlipaySDK.h>
|
- 生成订单描述并对商户私钥签名,然后拼接参数唤起支付宝
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| - (void)zhifubaoPayMethod { [MBProgressHUD showMessage:@"正在跳转支付宝"];
Order *order = [[Order alloc] init]; order.partner = PartnerID; order.seller = SellerID; order.tradeNO = self.gold_sn; order.productName = self.shopName; order.productDescription = @"消费金额"; order.amount = self.payCount; order.notifyURL = @"http://www.ccuuu.com"; #warning order.service = 一定不能为空 order.service = @"mobile.securitypay.pay";
NSString *appScheme = @"1:5maidan";
NSString *orderSpec = [order description];
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下载流程)。

1
| #import <AlipaySDK/AlipaySDK.h>
|
- 唤起支付宝的方法,第一步:发送订单的基本信息到后台,请求RSA签名
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| -(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) {
if ([responseObject[@"status"] intValue] == 200) { _RSAString = responseObject[@"url"];
[weakSelf wakeUpZhifubaoWithRSAString:_RSAString withButton:button]; } else { [SVProgressHUD showErrorWithStatus:@"获取RSA失败" maskType:SVProgressHUDMaskTypeGradient]; } } failure:^(NSError *error) { LXLog(@"%@",error); }]; }
|
第二步:唤起支付宝的方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| - (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格式编辑,现在重新生成一遍,顺便复习了一下。