iOS 支付宝 集成

现在不少app内都集成了支付宝功能

使用支付宝进行一个完整的支付功能,大致有以下步骤:

1>先与支付宝签约,获得商户ID(partner)和账号ID(seller)

(这个主要是公司的负责)

2>下载相应的公钥私钥文件(加密签名用)

3>下载支付宝SDK(登录网站:http://club.alipay.com/

里面提供了非常详细的文档、如何签约、如何获得公钥私钥、如何调用支付接口。

4>生成订单信息

5>调用支付宝客户端,由支付宝客户端跟支付宝安全服务器打交道

6>支付完毕后返回支付结果给商户客户端和服务器

SDK里有集成支付宝功能的一个Demo>  集成支付功能的具体操作方式,可以参考Demo

当第一次打开Demo时,可能会出现以下问题:

错误原因很简单,就是项目的部署版本设置太低了,从3.0改为4.3即可

要想集成支付功能,依赖以下文件夹的库文件(把这3个添加到你的客户端中)

调用支付接口可以参考AlixPayDemoViewController的下面方法

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

如何创建订单 ( 订单根据自己公司看是什么样的)

如何签名

如何调用支付接口

都在这个方法里面了

 1 //
 2 //选中商品调用支付宝快捷支付
 3 //
 4 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
 5 {
 6     /*
 7      *点击获取prodcut实例并初始化订单信息
 8      */
 9     Product *product = [_products objectAtIndex:indexPath.row];
10
11     /*
12      *商户的唯一的parnter和seller。
13      *本demo将parnter和seller信息存于(AlixPayDemo-Info.plist)中,外部商户可以考虑存于服务端或本地其他地方。
14      *签约后,支付宝会为每个商户分配一个唯一的 parnter 和 seller。
15      */
16     //如果partner和seller数据存于其他位置,请改写下面两行代码
17     NSString *partner = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"Partner"];
18     NSString *seller = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"Seller"];
19
20     //partner和seller获取失败,提示
21     if ([partner length] == 0 || [seller length] == 0)
22     {
23         UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示"
24                                                         message:@"缺少partner或者seller。"
25                                                        delegate:self
26                                               cancelButtonTitle:@"确定"
27                                               otherButtonTitles:nil];
28         [alert show];
29         [alert release];
30         return;
31     }
32
33     /*
34      *生成订单信息及签名
35      *由于demo的局限性,本demo中的公私钥存放在AlixPayDemo-Info.plist中,外部商户可以存放在服务端或本地其他地方。
36      */
37     //将商品信息赋予AlixPayOrder的成员变量
38     AlixPayOrder *order = [[AlixPayOrder alloc] init];
39     order.partner = partner;
40     order.seller = seller;
41     order.tradeNO = [self generateTradeNO]; //订单ID(由商家自行制定)
42     order.productName = product.subject; //商品标题
43     order.productDescription = product.body; //商品描述
44     order.amount = [NSString stringWithFormat:@"%.2f",product.price]; //商品价格
45     order.notifyURL =  @"http://www.xxx.com"; //回调URL
46
47     //应用注册scheme,在AlixPayDemo-Info.plist定义URL types,用于快捷支付成功后重新唤起商户应用
48     NSString *appScheme = @"AlixPayDemo";
49
50     //将商品信息拼接成字符串
51     NSString *orderSpec = [order description];
52     NSLog(@"orderSpec = %@",orderSpec);
53
54     //获取私钥并将商户信息签名,外部商户可以根据情况存放私钥和签名,只需要遵循RSA签名规范,并将签名字符串base64编码和UrlEncode
55     id<DataSigner> signer = CreateRSADataSigner([[NSBundle mainBundle] objectForInfoDictionaryKey:@"RSA private key"]);
56     NSString *signedString = [signer signString:orderSpec];
57
58     //将签名成功字符串格式化为订单字符串,请严格按照该格式
59     NSString *orderString = nil;
60     if (signedString != nil) {
61         orderString = [NSString stringWithFormat:@"%@&sign=\"%@\"&sign_type=\"%@\"",
62                                  orderSpec, signedString, @"RSA"];
63
64         //获取快捷支付单例并调用快捷支付接口
65         AlixPay * alixpay = [AlixPay shared];
66         int ret = [alixpay pay:orderString applicationScheme:appScheme];
67
68         if (ret == kSPErrorAlipayClientNotInstalled) {
69             UIAlertView * alertView = [[UIAlertView alloc] initWithTitle:@"提示"
70                                                                  message:@"您还没有安装支付宝快捷支付,请先安装。"
71                                                                 delegate:self
72                                                        cancelButtonTitle:@"确定"
73                                                        otherButtonTitles:nil];
74             [alertView setTag:123];
75             [alertView show];
76             [alertView release];
77         }
78         else if (ret == kSPErrorSignError) {
79             NSLog(@"签名错误!");
80         }
81
82     }
83
84     [tableView deselectRowAtIndexPath:indexPath animated:YES];
85 }

主要集成的关键就是下面几步:

//.封装订单模型
AlixPayOrder *order = [[AlixPayOrder alloc] init];
// 生成订单描述
NSString *orderSpec = [order description];

//2.签名
id<DataSigner> signer = CreateRSADataSigner(@“私钥key”);
// 传入订单描述 进行 签名
NSString *signedString = [signer signString:orderSpec];

//3.生成订单字符串
NSString *orderString = [NSString stringWithFormat:@"%@&sign=\"%@\"&sign_type=\"%@\"",
                         orderSpec, signedString, @"RSA"];

//4.调用支付接口
AlixPay * alixpay = [AlixPay shared];
// appScheme:商户自己的协议头
int ret = [alixpay pay:orderString applicationScheme:appScheme];

作者: 清澈Saup

出处:http://www.cnblogs.com/qingche/

本文版权归作者和博客园共有,欢迎转载,但必须保留此段声明,且在文章页面明显位置给出原文连接。

时间: 2024-08-12 12:18:14

iOS 支付宝 集成的相关文章

iOS支付宝集成详细流程

实现支付宝支付的准备工作: 1.向支付宝签约,成为支付宝的商户 签约完成后,支付宝会提供一些必要的数据给我们 商户ID:partner 账号ID:seller 即支付宝账号 签约需要营业执照 2.获取支付相关的  私钥和密钥,这两个东西为了数据安全 上面这几个东西只要签约成功就可以看到 3.下载支付宝的SDK 下载网址: http://doc.open.alipay.com/doc2/detail?treeId=59&articleId=103563&docType=1 上面部分是准备工作

ios支付宝集成各种血泪坑

1.私钥不能读取 read private data error 因为是先搞的安卓,所以前部分申请,上传公钥都是安卓那边的同事做了,于是我直接从同事那里拿了私钥和公钥. 不能读取怀疑过私钥没转pcks8,但是我自己在mac上转报错unable read data... 所以我以为这个是转过的所以不能再转.坑死了,直到后来我自己生成了一个私钥,转格式后可以过签名函数,发觉不太对.但是对应公钥的必须只有一个私钥. 后来问了支付宝的技术支持才知道,安卓的私钥不需要转pcks8,ios的才需要.这个我们

iOS支付宝集成时遇到的问题整理(1)

1.模拟器上运行正常,但是真机调试时报编译链接错误 :ld: '/Users/wangqipeng/Desktop/iOS支付宝官方文档/AlixPayDemo/libcrypto.a(bio_lib.o)' does not contain bitcode. You must rebuild it with bitcode enabled (Xcode setting ENABLE_BITCODE), obtain an updated library from the vendor, or

iOS支付宝集成后出现崩溃的调试总结

前两天的项目中 [[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary *resultDic) { NSLog(@"reslut = %@",resultDic); }];在运行到这的时候就崩溃了 就崩溃在这个函数,估计在支付宝的SDK里面崩溃,由于支付宝SDK封装了,所以崩溃在这个接口,当时有三个控制器有支付宝支付,其他的两个控制器没有崩溃现象 调试方法

IOS支付宝集成一系列问题

问题 解决 这个也是路径错误, 解决办法:在自己工程文件夹里建一个文件夹,随便起什么名字.把支付宝所需要的东西都拷贝进去,然后add files,然后找到TARGETS-Build Settings,在里面找到如下位置 把自己新建的文件夹拖动到这个框里面,再次运行就OK了,如果不行可以再多试几次 问题 如果遇到运行后报错,类似于以下提示信息: Cannot find interface declaration for 'NSObject', superclass of 'Base64' 解决 那

iOS开发:集成支付宝(遇见的坑和便捷撸代码)

开发iOS最重要的就是支付了,天朝之内最常用的就是支付宝了,下面就以自己的经历说明如何集成支付宝+遇见的坑. 首先,集成支付宝最好别使用Cocoapods,很多人都说使用起来很方便,可是我每次只要使用Cocoapods导入支付宝SDK,总是出现各种莫名其妙的错误,并且还每次都不一样,最终,我只能手动导入. 其实可以使用ping++和其他更为方便.如 http://winann.blog.51cto.com/4424329/1601654 https://www.pingxx.com/ 以自己集成

iOS app集成支付宝支付流程及后台php订单签名处理

iOS app集成支付宝支付流程 1: 开通支付宝商户 由公司去支付宝 https://b.alipay.com/order/serviceIndex.htm 签约支付宝开通支付宝商家: 2:商户支付宝开通无线支付功能 开通商户支付宝之后,虽然可以获取到应用使用的 key和id,如果如果不开通无线支付功能的话,会在app集成的时间 提示商户未开通无线支付功能的错误: 开通商户支付宝-无线支付功能,请在商户支付宝后台,按要求提供审核材料开通: 3:在商户支付宝后台下载SDK 在商户支付宝后台,即可

iOS开发之支付宝集成

项目中要用到支付功能,需要支付宝,微信,银联三大支付,所以打算总结一下,写两篇文章,方便以后的查阅, 大家在做的时候也能稍微参考下,用到的地方避免再次被坑.这是第二篇支付宝集成,第一篇银联支付在这里.本来要用那个ping++的神器,可以集成各种支付手段,异常的方便,但是考虑到安全性问题的话,支付的渠道还是不让第三方参与的好,不然会不安全,于是就苦逼地慢慢的一个一个集成了....这里就代理支付宝的集成过程: 刚开始以为支付宝集成还是比较简单的,看了几个文章,网上的各位大神也是各种秀操作,说集成很简

一步一步构建iOS持续集成:Jenkins+GitLab+蒲公英+FTP

什么是持续集成 持续集成是一种软件开发实践,即团队开发成员经常集成它们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成.每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误. 为什么使用持续集成 1.减少风险2.减少重复过程3.任何时间.任何地点生成可部署的软件4.增强项目的可见性 常用的持续集成工具 Jenkins CI Travis CI Hudson CI Circle CI 市面上的持续集成工具有很多,考虑到Jenkins的稳定性,