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支付,不会反回在appDelegate
的application:openURL
方法.
本地签名:
先拖入实现加密的文件与模型:

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

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

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

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

添加SDK和静态库:

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

到这里应该已经可以运行程序了.
如果还是出现了编译错误等问题,导入框架不全与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 = @"";
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 == )
{
/*
*用公钥验证签名 严格验证请使用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:@""])
{
//用户取消
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;
}
最后记得把这里写了:

NSString *appScheme = @"alisdkdemo"
代码 网页上申请的 图片上那里填写的保持一致.
补充: 如果要用swift
来调用支付宝SDK 最好把支付的与回调的逻辑单独建立工具类传递数据便好,从流程上本身无太大区别稍微注意的是在swift
中 AlipaySDK.h
有可能因为语言环境问题出现缺少引入类的情况,少什么补什么就好,其他也一样.
原文链接:http://www.jianshu.com/p/2b9bbfcb7ec4
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
IOS开发支付宝集成的更多相关文章
- IOS开发支付宝集成思路
一般情况下支付功能的交互流程 比如我们去某个APP去支付一个产品,流程为:1.用户点击支付->2.客户端请求服务器用户支付->3.服务器接收请求生成金额订单等要给第三方支付的一切信息,并生 ...
- 李洪强iOS开发支付集成之支付宝支付
iOS开发支付集成之支付宝支付 下载支付宝SDK 首先是开发包下载,还是比较难发现的,网上以前文章中的链接都打不开,我找了好久才找到的.最新的地址在这里(注意的是下载出来的SDK包里面并没有传说中的开 ...
- iOS中支付宝集成
iOS中支付宝集成 如今各种的App中都使用了三方支付的功能,现在将我在使用支付宝支付集成过程的心得分享一下,希望对大家都能有所帮助 要集成一个支付宝支付过程的环境,大致需要: 1>公司:先与支 ...
- 李洪强iOS开发支付集成之银联支付
iOS开发支付集成之银联支付 银联官网在这里,这里能下载SDK或者是看文档.最新的版本写的简单了很多,看文档一直做下去基本上就没问题了. 首先,SDK在这里下载,里面包含需要的库文件和详细的文档. 银 ...
- 李洪强iOS开发支付集成之微信支付
iOS开发支付集成之微信支付 微信支付也是需要签名的,也跟支付宝一样,可以在客户端签名,也可以在后台签名(当然,为了安全还是推荐在服务器上做签名,逻辑也比较好理解). 1 - 集成前首先要看看文档 开 ...
- iOS开发支付集成之支付宝支付
项目中要用到支付功能,需要支付宝,微信,银联三大支付,所以打算总结一下,写两篇文章,方便以后的查阅, 大家在做的时候也能稍微参考下,用到的地方避免再次被坑.这是第二篇支付宝集成,第一篇银联支付在这里. ...
- IOS开发--支付宝支付
前言:继上次<IOS开发--微信支付>以来,一直没有太多时间,更新总结详细支付这样的长篇大论,很抱歉.今天,推出支付宝支付的详细流程. 1.开始下载和查看支付宝支付的Demo. 我们直接进 ...
- iOS开发支付集成之微信支付
这一篇是<iOS开发之支付>这一部分的继支付宝支付集成,银联支付集成第三篇,微信支付.在集成的时候建议都要去下载最新版的SDK,因为我知道的前不久支付宝,银联都更新了一次,微信的不太清楚更 ...
- iOS开发中集成Reveal
[转]http://blog.devzeng.com/blog/ios-reveal-integrating.html 配置方式一简介有效. Reveal 是一个界面调试工具.使用Reveal,我们可 ...
随机推荐
- 1、图解Oracle Logminer配置使用
LogMiner配置使用手册 1 Logminer简介 1.1 LogMiner介绍 Oracle LogMiner 是Oracle公司从产品8i以后提供的一个实际非常有用的分析工具,使用该工具可以轻 ...
- Microsoft Visual Studio 2013 VSTS单元测试指南
安装vs2013时并未安装VSTS工具包,所以在工具栏:工具->拓展和更新 进行下载安装 vs13已经用了两年了,相比于之前老师推荐的vc6.0感觉要强出很多,刚上手时感觉比较困难,在使用一 ...
- [Python]同是新手的我,分享一些经验
本来想分享一些知识,但是发现,写着写着,感觉分享一些经验,或许会少让大家走一些弯路,索性就把标题一改. 我不是教给大家些什么,我没有资格,我也是摸着石头过河,我只是本着分享的精神,在这里分享自己的东西 ...
- Android 学习笔记之Volley(七)实现Json数据加载和解析...
学习内容: 1.使用Volley实现异步加载Json数据... Volley的第二大请求就是通过发送请求异步实现Json数据信息的加载,加载Json数据有两种方式,一种是通过获取Json对象,然后 ...
- HT图形组件设计之道(一)
HT for Web简称HT提供了涵盖通用组件.2D拓扑图形组件以及3D引擎的一站式解决方案,正如Hightopo官网所表达的我们希望提供:Everything you need to create ...
- Python+Selenium进行UI自动化测试项目中,常用的小技巧4:日志打印,longging模块(控制台和文件同时输出)
在前段时间,为了给项目中加入日志功能,就想到了 logging 模块,百度logging一大推,都是各种复制的,并没有找到自己想要的结果:我的目的很简单,就是:在把日志写入文件的同时在控制台输出,更加 ...
- js跳转页面方法大全
js跳转页面方法大全<span id="tiao">3</span><a href="javascript:countDown"& ...
- 如何弹出一定的大小的web窗体?
如何弹出一定的大小的web窗体? 摘自: http://blog.163.com/hweibin126@126/blog/static/17044246920108413348344/ 一.wind ...
- C#怎样处理xml文件的大于号和小于号等常用符号(xml符号引发的程序错误)
在程序中由xml配置而成的sql语句要转换为C#支持的sql语句 <settings> <select> a.*</select> <from> (se ...
- [moka同学摘录]iptables防火墙规则的添加、删除、修改、保存
文章来源:http://www.splaybow.com/post/iptables-rule-add-delete-modify-save.html 本文介绍iptables这个Linux下最强大的 ...