美文网首页
iOS支付宝集成

iOS支付宝集成

作者: feng1991 | 来源:发表于2017-02-23 17:02 被阅读0次

    首先要向支付宝申请, 与支付宝签约,获得appID(partner)和私钥(privateKey),这个一般都是公司做,直接找公司要。
    然后,下载支付宝SDK,下载地址
    下载好后,找到里面的AlipaySDK.bundle和AlipaySDK.framework拷贝到你的工程里面,

    254F72E5-D8FF-4557-982F-79DA11EE5A1D.png

    最好是创建一个文件夹单独放支付宝拷贝的文件。
    再找到AliSDKDemo文件夹里面的libcrypto.a和libssl.a两个拷贝到工程

    4DDE4C76-5AF5-4C51-8315-BEA16EFE6016.png

    再找到AliSDKDemo文件夹里面的AliSDKDemo文件夹里面的Order.h和Order.m文件,Util和openssl文件也拷贝到工程里面你创建的文件夹。

    7F332F70-3C5B-4405-8974-A5E47480ED3F.png

    打开你的viewController,先导入#import "Order.h"和#import<AlipaySDK/AlipaySDK.h>两个头文件,
    在viewDidLoad方法里面,添加下面代码

     //重要说明
        //这里只是为了方便直接向商户展示支付宝的整个支付流程;所以Demo中加签过程直接放在客户端完成;
        //真实App里,privateKey等数据严禁放在客户端,加签过程务必要放在服务端完成;
        //防止商户私密数据泄露,造成不必要的资金损失,及面临各种安全风险;
        /*============================================================================*/
        /*=======================需要填写商户app申请的===================================*/
        /*============================================================================*/
        NSString *appID = @"";
        
        // 如下私钥,rsa2PrivateKey 或者 rsaPrivateKey 只需要填入一个
        // 如果商户两个都设置了,优先使用 rsa2PrivateKey
        // rsa2PrivateKey 可以保证商户交易在更加安全的环境下进行,建议使用 rsa2PrivateKey
        // 获取 rsa2PrivateKey,建议使用支付宝提供的公私钥生成工具生成,
        // 工具地址:https://doc.open.alipay.com/docs/doc.htm?treeId=291&articleId=106097&docType=1
        NSString *rsa2PrivateKey = @"";
        NSString *rsaPrivateKey = @"";
        /*============================================================================*/
        /*============================================================================*/
        /*============================================================================*/
    
        
        /*
         *生成订单信息及签名
         */
        //将商品信息赋予AlixPayOrder的成员变量
        Order* order = [Order new];
        
        // NOTE: app_id设置
        order.app_id = appID;
        
        // NOTE: 支付接口名称
        order.method = @"alipay.trade.app.pay";
        
        // NOTE: 参数编码格式
        order.charset = @"utf-8";
        
        // NOTE: 当前时间点
        NSDateFormatter* formatter = [NSDateFormatter new];
        [formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
        order.timestamp = [formatter stringFromDate:[NSDate date]];
        
        // NOTE: 支付版本
        order.version = @"1.0";
        
        // NOTE: sign_type 根据商户设置的私钥来决定
        order.sign_type = (rsa2PrivateKey.length > 1)?@"RSA2":@"RSA";
        
        // NOTE: 商品数据
        order.biz_content = [BizContent new];
        order.biz_content.body = @"";//商品标题
        order.biz_content.subject = @"";//商品描述
        order.biz_content.out_trade_no = @""; //订单ID(由商家自行制定)
        order.biz_content.timeout_express = @"30m"; //超时时间设置
        order.biz_content.total_amount = [NSString stringWithFormat:@"%.2f", 0.01]; //商品价格
        
        //将商品信息拼接成字符串
        NSString *orderInfo = [order orderInfoEncoded:NO];
        NSString *orderInfoEncoded = [order orderInfoEncoded:YES];
        NSLog(@"orderSpec = %@",orderInfo);
    

    编译一下,你会发现报了很多的错


    C0278202-8313-4535-A1EE-AE3B3B4F7641.png

    不要怕,点开这个错误,进入到报错的地方,就是Base64.h里面加上一个#import <Foundation/Foundation.h>,


    B06D0B5B-C670-4BC0-AE78-A9E9DEDDBAA9.png
    再次编译会发现还有错误,
    6DB55E4B-C11C-40E0-831E-0C7CDA6F3B21.png

    再次点开这个错误,进入到openssl_wrapper.h里面,加入一个#import <Foundation/Foundation.h>


    F8725335-C1F1-4218-92FE-E8872A326DD8.png
    如果你的项目里面有PCH文件,直接在PCH文件里面导入#import <Foundation/Foundation.h>就行了。
    再吃编译,就只剩下一个错误了
    34901DF9-28D9-4671-A837-E0A173F0E910.png
    这个错误的解决方法就是找到Targets -> Build Settings 下的 Header Search Paths
    9DB86266-D5E5-400A-B5C2-B64CDD8F5A71.png
    找到 Header Search Paths后双击后面的空白框弹出一个方框
    E205B362-E208-4750-A2A3-56CF5C10DBE1.png

    点击+号就会出来一个输入框,在输入框里面输入$(SRCROOT)/你项目的名字/文件的绝对地址(就是放拷贝的支付宝文件的文件夹名)
    编译一下会报很多错误,这是没有添加依赖库,要添加下列依赖库
    其中,需要注意的是:
    如果是Xcode 7.0之后的版本,需要添加libc++.tbd、libz.tbd;
    如果是Xcode 7.0之前的版本,需要添加libc++.dylib、libz.dylib

    libz.tbd

    libc++.tbd

    QuartzCore.framework

    CoreText.framework

    CoreGraphics.framework

    UIKit.framework

    Foundation.framework

    CoreMotion.Framework

    CFNetwork.framework

    CoreTelephony.framework

    SystemConfiguration.framework

    284C1133-A3CA-482E-A8B8-4DCB5D59F0F6.png

    回到ViewController里面添加头文件#import "RSADataSigner.h",再在viewDidLoad里面添加下面代码

     // NOTE: 获取私钥并将商户信息签名,外部商户的加签过程请务必放在服务端,防止公私钥数据泄露;
        //       需要遵循RSA签名规范,并将签名字符串base64编码和UrlEncode
        NSString *signedString = nil;
        RSADataSigner* signer = [[RSADataSigner alloc] initWithPrivateKey:((rsa2PrivateKey.length > 1)?rsa2PrivateKey:rsaPrivateKey)];
        if ((rsa2PrivateKey.length > 1)) {
            signedString = [signer signString:orderInfo withRSA2:YES];
        } else {
            signedString = [signer signString:orderInfo withRSA2:NO];
        }
        
        // NOTE: 如果加签成功,则继续执行支付
        if (signedString != nil) {
            //应用注册scheme,在AliSDKDemo-Info.plist定义URL types
            NSString *appScheme = @"Alipay2";
            
            // NOTE: 将签名成功字符串格式化为订单字符串,请严格按照该格式
            NSString *orderString = [NSString stringWithFormat:@"%@&sign=%@",
                                     orderInfoEncoded, signedString];
            
            // NOTE: 调用支付结果开始支付
            [[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary *resultDic) {
                NSLog(@"reslut = %@",resultDic);
            }];
        }
    

    其中 NSString *appScheme = @"Alipay2";这个是你项目自己的名字,并且为了能够从支付宝跳转回自己的应用还要在Info.plist定义URL types

    296718E5-7BD2-4C24-92C9-4AFA4F5AB1DE.png

    点击➕号,将你的项目名字填进去进行了
    最后,进入AppDelegate.m里面导入#import <AlipaySDK/AlipaySDK.h>再添加下面代码

    - (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);
            }];
            
            // 授权跳转支付宝钱包进行支付,处理支付结果
            [[AlipaySDK defaultService] processAuth_V2Result:url standbyCallback:^(NSDictionary *resultDic) {
                NSLog(@"result = %@",resultDic);
                // 解析 auth code
                NSString *result = resultDic[@"result"];
                NSString *authCode = nil;
                if (result.length>0) {
                    NSArray *resultArr = [result componentsSeparatedByString:@"&"];
                    for (NSString *subResult in resultArr) {
                        if (subResult.length > 10 && [subResult hasPrefix:@"auth_code="]) {
                            authCode = [subResult substringFromIndex:10];
                            break;
                        }
                    }
                }
                NSLog(@"授权结果 authCode = %@", authCode?:@"");
            }];
        }
        return YES;
    }
    

    相关文章

      网友评论

          本文标题:iOS支付宝集成

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