iOS应用之支付宝集成总结

作者: 华之曦 | 来源:发表于2016-04-06 18:48 被阅读701次

    上一个项目当中有用到支付宝的支付功能,但现在这个项目里因为集成了阿里百川的SDK,不能再简单的ctrl+c,然后ctrl+v,所以期间遇到一些小问题,配合后台(司马同学)一起把支付宝的功能给完成,在此做个简单的分享。(注:现为md格式编辑)

    1.集成支付宝的方法

    • 首先,回顾一下上一个项目中支付宝集成的图文方法,从官方支付宝开放平台下载所需的文件,解压支付宝钱包支付接口开发包2.0标准版(iOS 15.0.2),整理相关文件,如下图:
    需要导入工程中的相关文件
    • 把必须的文件(AlipaySDK)导入工程中,如下图:
    工程中导入的支付宝SDK相关文件
    • 然后按照官方文档导入相应的依赖,如图:
    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下载流程)。
    iOS阿里百川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格式编辑,现在重新生成一遍,顺便复习了一下。

    相关文章

      网友评论

        本文标题:iOS应用之支付宝集成总结

        本文链接:https://www.haomeiwen.com/subject/kkdmlttx.html