IOS开发支付宝集成

开发准备


1.首先新建项目,然后去官网下载最新的开发包:
http://doc.open.alipay.com/doc2/detail?treeId=59&articleId=103563&docType=1,
当然也可以用CocoaPods来下载不过用这个下载的话只会下载到单纯的客户端与网络服务请求的SDK不包含加密的那些代码,而有些公司是要把加密做到本地的所以选择哪种方式看开发者的习惯于公司需求.
2.下载后打开点击开发包可以打开更新日志来比对当前版本不要去一些非官网的地方下载SDK有可能不是最新版本会出现BUG
3.打开客户端开发包找到IOS对应的包文件解压得到开发包,包含1个framework文件一个bundle文件一个Demo文件夹

一般情况下支付功能的交互流程


比如我们去某个APP去支付一个产品,流程为:
1.用户点击支付->
2.客户端请求服务器用户支付->
3.服务器接收请求生成金额订单等要给第三方支付的一切信息,并生成回调参数传给客户端->
4.客户端接收信息(一般会再让用户确认支付或者干脆购买后是生成订单,然后才是付款)并将服务器给的信息分别传入SDK需要的参数中,调用SDK的支付方法->
5.由SDK向SDK自己的服务器发出支付请求,SDK自己的服务器接收支付请求处理成功后,给客户端本身与公司的后台都发送一条支付成功的消息,客户端与后台根据这条消息再做处理.

针对开发环境的一些设置


支付又分为2种情况本地签名,和服务器签名,我用到正好都是公司要求本地签,服务器的我就稍微说1点.

服务器签名:
/**
 *  支付接口
 *
 *  @param orderStr       订单信息
 *  @param schemeStr      调用支付的app注册在info.plist中的scheme
 *  @param compltionBlock 支付结果回调Block
 */
- (void)payOrder:(NSString *)orderStr
      fromScheme:(NSString *)schemeStr
        callback:(CompletionBlock)completionBlock;

服务器签名注意的是在callback:回调中要进行验签,就是把服务器给的订单签名信息在用公钥解密,比对订单细节,检查是否被他人篡改,并且如果是wap支付,不会反回在appDelegateapplication:openURL方法.

本地签名:

先拖入实现加密的文件与模型:

加密的文件.png

这时候会报错(补充一点: 有些朋友找不到NSString或者一些数据类型报错都是因为缺少Foundation头文件,可能我写的不太明白,有些朋友还是不太懂)大部分错误都是因为一些文件中在支付宝的Demo的Pch文件中统一添加的#import <Foundation/Foundation.h>,如果我们的项目中没有这一步,那么要么也建立pch要么单独添加上.

这时还会有一个错误:

路径找不到.png

注意这里的Header Search Paths 路径为空:

路径为空.png

打开电脑这个文件的所在地 双击Header Search Paths将电脑的文件拖入Header Search Paths会生成一个路径:

生成的路径.png

导入一来框架: 这个最好跟着Demo一个一个往里添加,也不要光看网上资料主要还是看Demo:

导入框架.png

添加SDK和静态库:


SDK静态库.png

报错:这个错误与另外一种说SDK不支持64位比较常见,都是把静态库或者SDK都删了重新导入就行了


错误信息.png
到这里应该已经可以运行程序了.
如果还是出现了编译错误等问题,导入框架不全与SDK静态库的路径错误比例比较大.
建议等能够运行程序后在进行开发.

正式开发

首先我们介绍一段代码:

  NSString *orderSpec = [order description];

将商品的信息添加为字符串order是一个对象,而description]是将这个对象的属性进行拼接返回一个字符串.

在介绍3个属性:

//合作商户ID。用签约支付宝账号登录ms.alipay.com后,在账户信息页面获取。
NSString *partner = @"";
//账户ID。用签约支付宝账号登录ms.alipay.com后,在账户信息页面获取。
NSString *seller = @"";
//商户私钥,自助生成
NSString *privateKey = @"";

这3个属性必须是个人或公司申请后才能得到的..我用的公司的就不写上了请自行填写.

//将商品信息赋予AlixPayOrder的成员变量
    Order *order = [[Order alloc] init];
    order.partner = partner;
    order.seller = seller;
    order.tradeNO = @"G111111111111"; //订单ID(由商家自行制定)
    order.productName = @"我的测试"; //商品标题
    order.productDescription = @"我的商品描述"; //商品描述
    order.amount = @"0.01"; //商品价格
    order.notifyURL =  @"http://www.xxx.com"; //回调URL
    
    order.service = @"mobile.securitypay.pay";
    order.paymentType = @"1";
    order.inputCharset = @"utf-8";
    order.itBPay = @"30m";
    order.showUrl = @"m.alipay.com";
    
    //应用注册scheme,在AlixPayDemo-Info.plist定义URL types
    NSString *appScheme = @"alisdkdemo";
    
    //将商品信息拼接成字符串
    NSString *orderSpec = [order description];
    NSLog(@"orderSpec = %@",orderSpec);
    
    //获取私钥并将商户信息签名,外部商户可以根据情况存放私钥和签名,只需要遵循RSA签名规范,并将签名字符串base64编码和UrlEncode
    id<DataSigner> signer = CreateRSADataSigner(privateKey);
    NSString *signedString = [signer signString:orderSpec];
    
    
    NSString *orderString = nil;

生成加密后的字符串 注意的是NSString *appScheme = @"alisdkdemo";这个值是从支付宝的商户地址中填写的,请保持一致.

最后处理结果:

if (signedString != nil) {
        orderString = [NSString stringWithFormat:@"%@&sign=\"%@\"&sign_type=\"%@\"",
                       orderSpec, signedString, @"RSA"];
        
        [[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary *resultDic) {
            
            //结果处理,其实就是取字典里面的内容,这个取字符串然后变个模型就好了 或者直接取不便模型,方法很多.
            NSLog(@"开始确认支付状态 %@",resultDic[@"resultStatus"]);
            AlixPayResult* resultModel = [AlixPayResult itemWithDictory:resultDic];
            if (resultModel)
            {
                //状态返回9000为成功
                if (resultModel.statusCode == 9000)
                {
                    /*
                     *用公钥验证签名 严格验证请使用result.resultString与result.signString验签
                     */
                    NSLog(@"支付宝交易成功");
                    
                    /*
                     *用公钥验证签名 严格验证请使用result.resultString与result.signString验签
                     */
                    
                    //交易成功
                    NSString* key = AlipayPubKey;//签约帐户后获取到的支付宝公钥
                    id<DataVerifier> verifier;
                    verifier = CreateRSADataVerifier(key);
                    
                    // 验证签名
                    if ([verifier verifyString:resultModel.resultString withSign:resultModel.signString])
                    {
                        //验证签名成功,交易结果无篡改
                        NSLog(@"验证成功");
                    }
                }
            }
            else if([resultDic[@"resultStatus"]isEqualToString:@"6001"])
            {
                               //用户取消
                NSLog(@"用户主动取消支付");
            }else
            {
               
            }
        }];
}

这里注意:if([resultDic[@"resultStatus"]isEqualToString:@"6001"])支付宝有BUG 这个6001 不要信,可以和公司商量下,是加个确认接口还是一定时间内检查后台,总之很有可能用户付钱成功,SDK通知你用户手动取消,这个BUG是在弱网状态下比较多.

然后记得在 AppDelegate里面加上如下代码:

//只要是调用手机上的支付宝客户端,在支付宝客户端操作完成返回自己的app时,都会调用这个方法,
- (BOOL)application:(UIApplication *)application
            openURL:(NSURL *)url
  sourceApplication:(NSString *)sourceApplication
         annotation:(id)annotation {
    //跳转支付宝钱包进行支付,需要将支付宝钱包的支付结果回传给SDK(这个是将支付宝客户端的支付结果传回给SDK)
    if ([url.host isEqualToString:@"safepay"]) {
        [[AlipaySDK defaultService]
         processOrderWithPaymentResult:url
         standbyCallback:^(NSDictionary *resultDic)
         {
             NSLog(@" ------result = %@",resultDic);//返回的支付结果
         }];
    }
    return YES;
}

最后记得把这里写了:

URL.Types.png

NSString *appScheme = @"alisdkdemo"代码 网页上申请的 图片上那里填写的保持一致.


补充: 如果要用swift来调用支付宝SDK 最好把支付的与回调的逻辑单独建立工具类传递数据便好,从流程上本身无太大区别稍微注意的是在swiftAlipaySDK.h有可能因为语言环境问题出现缺少引入类的情况,少什么补什么就好,其他也一样.

如有问题欢迎留言...

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容