IOS 技巧功能案例学无止境上海恩美路演

iOS应用之支付宝集成总结

2016-04-06  本文已影响701人  华之曦

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

1.集成支付宝的方法

需要导入工程中的相关文件 工程中导入的支付宝SDK相关文件 AlipaySDK所需的依赖
// 导入头文件
#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后,唤起支付宝的方法

iOS阿里百川SDK示例
#import <AlipaySDK/AlipaySDK.h>
-(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格式编辑,现在重新生成一遍,顺便复习了一下。

上一篇下一篇

猜你喜欢

热点阅读