集成支付宝支付功能

作者: 程序猿界的cai渣渣 | 来源:发表于2017-02-28 18:32 被阅读685次

    作为iOS开发者,虽然泡沫的式的发展并不是我们想看到的,但是,就目前来看看,我们的能力和经验依旧很重要!!(突然发现这是完全不搭边的两句话....)在很多时候我们所被问到的就是:做过支付吗?做过地图吗?做过视频吗?做过流媒体吗?做过通讯吗?使用过融云吗?使用过环信吗?使用过网易云信吗?会做游戏吗?懂得socket吗?懂得HTTP、TCP/IP、UDP吗?知道多线程吗?会使用NSOperation、GCD、NSThread吗?知道各种dispath_XXX吗?......木有!!!不会!!OK,你可以回去了......即使是在任何情况下,我们都应该积极的去学习,去面对问题,哪怕是我们的付出没有回报,那你就赶紧跳槽!!或者,继续提高自己,你的优秀会潜意识的散发出来,别人也会看在眼里,嫉在心里。
    言归正传,下面是支付宝的集成:

    一、首先介绍产品流程:(开发者可以看文档,十分详细,比微信强太多了)

    《支付宝开放品台文档中心》
    总的来说分为两种情况:
    (1)用户已安装支付宝支付流程。已经安装app后,可以直接调起app进行支付。输入密码,完成支付。

    用户已安装支付宝支付流程

    (2)用户未安装支付宝支付流程。未安装app,则需要调起h5界面进行支付。需要:输入校验码->选择支付方式->输入支付密码->完成支付。

    用户未安装支付宝支付流程 未添加银行卡 添加银行卡
    二、第一步:务必在开放平台创建一个应用

    《App支付接入指引》
    (1)创建应用。
    (2)配置应用。
    (3)设计。
    (4)开发。
    (5)调试应用。
    (6)上线应用。

    三、App支付快速接入。

    《支付快速接入》

    注意

    此处问题是有两个版本:9.0之前、9.0之后。
    老版本的样式:

    老版本

    第一步:创建应用并获取APPID
    第二步:配置密钥
    第三步:搭建和配置开发环境
    需要集成客户端SDK。
    第四步:调用接口
    注意事项:


    注意事项
    其他的具体看开发文档,一步一步的进行设置即可。
    在下载的SDK(demo)中有两个文件夹、AlipaySDK.bundle、AlipaySDK.framework,这些东西需要导入到工程中。至于Order,则是模拟后台支付“生成订单信息及签名”而使用的。

    上代码:

    //app_id设置(is:partner)
    NSString *appID = @"2017010304820705"; 
    //这是第二种生成私钥的方法
    NSString *rsa2PrivateKey = @"";
    //这是第一种生成方法
    NSString *rsaPrivateKey = @"";
    
    官方文档建议使 rsa2,因为比较安全。私钥生成有两个:1024、2048。同学们可以使用文档提供的生成器进行操作。如果 rsa2 没有或者输出为 null 时候,就说明生成错误,这时候可以使用 rsaPrivateKey 进行签名。
    /**
     *  生成订单信息及签名
     */
    Order *order = [Order new];
    //
    order.app_id = appID;
    //支付接口名称
    order.method = @"alipay.trade.app.pay";
    //参数编码格
    order.charset = @"utf-8";
    //设置时间
    NSDateFormatter *formatter= [NSDateFormatter new];
    [formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
    //请求发送的时间
    order.timestamp = [formatter stringFromDate:[NSDate date]];
    //请求调用的接口版本,固定为:1.0
    order.version = @"1.0";
    //签名类型
    order.sign_type = (rsa2PrivateKey.length > 1)?@"RSA2":@"RSA";
    //商品数据
    order.biz_content = [BizContent new];
    //(非必填项)商品描述
    order.biz_content.body = @"此物只应天上有,人间哪得几回闻";
    //商品的标题/交易标题/订单标题/订单关键字等。
    order.biz_content.subject = @"一只草泥马";
    #warning 订单号方法如下:generateTradeNO
    //商户网站唯一订单号
    order.biz_content.out_trade_no = [self generateTradeNO];
    /**  
     *  该笔订单允许的最晚付款时间,逾期将关闭交易。
     *
     *  取值范围:1m~15d m-分钟,h-小时,d-天,1c-当天(1c-当天的情况下,无论交易何时创建,都在0点关闭)
     *  该参数数值不接受小数点, 如1.5h,可转换为90m。
     */
    order.biz_content.timeout_express = @"30m";
    //订单总金额,单位为元,精确到小数点后两位,取值范围[0.01,100000000]
    order.biz_content.total_amount = [NSString stringWithFormat:@"%.2f", 0.01];
    /**
     *  获取订单信息串(将商品信息拼接成字符串)
     *
     *   bEncoded 订单信息串中的各个value是否encode
     *   非encode订单信息串,用于生成签名
     *   encode订单信息串 + 签名,用于最终的支付请求订单信息串
     */
    NSString *orderInfo = [order orderInfoEncoded:NO];
    //
    NSString *orderinfoEncoded = [order orderInfoEncoded:YES];
    //
    NSLog(@"商品信息:%@", orderInfo);
    // NOTE: 获取私钥并将商户信息签名,外部商户的加签过程请务必放在服务端,防止公私钥数据泄露;
    //       需要遵循RSA签名规范,并将签名字符串base64编码和UrlEncode
    NSString *singedString = nil;           
    

    签名代码如下:

    #warning 这是新版本的签名
    RSADataSigner *singer = [[RSADataSigner alloc] initWithPrivateKey:((rsa2PrivateKey.length > 1) ? rsa2PrivateKey : rsaPrivateKey)];
    //
    if (rsa2PrivateKey.length > 1) {
        singedString = [singer signString:orderInfo withRSA2:YES];
    }else {
        singedString = [singer signString:orderInfo withRSA2:NO];
    }
    // NOTE: 如果加签成功,则继续执行支付
    if (singedString != nil) {
        //应用注册scheme,在AliSDKDemo-Info.plist定义URL types
        NSString *appScheme = @"Payone";
        //将签名成功字符串格式化为订单字符串,务必严格按照格式
        NSString *orderString = [NSString stringWithFormat:@"%@&sign=%@", orderinfoEncoded, singedString];
        // NOTE: 调用支付结果开始支付
        [[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary *resultDic) {
            NSLog(@"开始支付:%@", resultDic);
        }];
    }
    
    
    #warning 这是老版本的签名
    //获取私钥并将商户信息签名,外部商户可以根据情况存放私钥和签名,只需要遵循RSA签名规范,并将签名字符串base64编码和UrlEncode
    id<DataSigner> signer = CreateRSADataSigner(privateKey);
    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) {
            NSLog(@"reslut = %@",resultDic);
        }];
    }
    

    订单号生成方法:
    - (NSString *)generateTradeN {
    static int kNumber = 15;
    NSString *sourceStr = @"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    NSMutableString *resultStr = [[NSMutableString alloc] init];
    srand((unsigned)time(0));
    for (int i = 0; i < kNumber; i++) {
    unsigned index = rand() % [sourceStr length];
    NSString *oneStr = [sourceStr substringWithRange:NSMakeRange(index, 1)];
    [resultStr appendString:oneStr];
    }
    return resultStr;
    }
    支付:AppDelegate

    - (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);
            }];
        }
        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);
            }];
        }
        return YES;
    }
    
    四、为了可以跳回app,需要设置appScheme
    应用注册scheme,在AliSDKDemo-Info.plist定义URL types

    appScheme = @"Payone";

    scheme
    scheme与代码中的一定要一致才可以。(第一个是支付宝的,第二个是微信的)
    总结:大多数东西是不需要客户端进行设置和存储的。所以,同学们集成之后即可根据需要进行开发啦。

    大多数都是demo和文档的东西。另外,遇到的错误信息,忘记截图保存了.....
    只提供简单的集成方法,错误请指正。

    相关文章

      网友评论

        本文标题:集成支付宝支付功能

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