iOS-支付宝支付总结

前言:

最近闲着没事做,就自学了一下支付宝支付功能,刚开始以为支付宝集成挺简单的,结果看了一堆文章,说是很简单,但真正做起来就发现没那么容易,(主要是加密签名那里比较繁琐,笔者也没有细弄,都是拿官方现成的)。还有官方文档比较旧,部分网址的内容比较乱,但还是很有帮助。下面就简单分享一下笔者如何集成支付宝和遇到的问题。

支付宝SDK&官方Demo: https://doc.open.alipay.com/docs/doc.htm?spm=a219a.7629140.0.0.pTICXm&treeId=54&articleId=104509&docType=1
支付宝官方集成流程详解:
https://doc.open.alipay.com/docs/doc.htm?spm=a219a.7629140.0.0.Jus8WX&treeId=59&articleId=103676&docType=1

首先,建议开发者先把开发文档仔仔细细看一遍,这样能减少很多不必要的问题,否则你只会越看越乱,浪费时间。开发文档、开发文档、开发文档,重要的事情一定要说三遍!!!


支付宝集成的基本流程:

1.向支付宝申请,与支付宝”签约” 成为支付宝的”商户”, 签约完成后, 支付宝会提供一些必要的数据给我们(商户ID-partner,帐号ID-支付宝帐号)
注意:签约成为支付宝商户,需要提供公司营业执照
http://act.life.alipay.com/shopping/before/help/index.html
https://b.alipay.com
2.获取相应的“公钥”和“私钥”文件(加密签名用)
https://doc.open.alipay.com/doc2/detail?treeId=44&articleId=103242&docType=1
3.下载支付宝SDK(里面并没有传说中的开发文档,需要其他地方找或者看网页上的)
4.生成订单信息,签名加密
5.调用支付宝客户端,由支付宝客户端跟支付宝安全服务器打交道
支付完毕后,支付宝客户端会自动跳回到原来的应用程序


支付宝集成的支付流程概述:

iOS-支付宝支付总结_第1张图片

iOS-支付宝支付总结_第2张图片

1.用户选好了商品后,点击提交订单(一般是这样),选择使用支付宝付款。
2.手机客户端(你做的APP)把用户选择的商品的信息传给你们后台服务器。
3.后台的服务器将各种数据拼接签名后生成一个签名后的字符串,回传到客户端APP上。
4.用户点击确认支付按钮,调用手机支付宝客户端(在你手机上装的那个),利用后台传过来的那个参数调起支付宝,让支付宝客户端传给他们服务器交互,进行付款。(这一步是支付宝自己完成的,安全性高)
5.支付宝的服务器将支付的结果(可能成功也可能不成功)返回给手机支付宝客户端和你们公司的后台服务器。
6.你们公司后台服务器收到后一般是更新下数据信息(这个咱们不用管),手机支付宝客户端会显示一下支付成功,咱们的客户端也可以显示一个订单支付成功之类的东西(就像在手机12306订票,用支付宝支付后支付宝客户端会说一次支付成功,12306也会说一次支付成功,咱们就像12306客户端一样,需要再说一次订单支付成功)。

以上就是支付的过程,而我们客户端需要做的就是

1.调用支付宝支付接口
2.处理支付宝返回的支付结果

调用支付接口

1.在调用支付宝支付接口前,我们需要先生成一个订单,文档中描述时,是将这步也放在客户端来做了,但这个最好是 放在服务器端来做,后台生成订单然后拼接,签名,然后服务器端直接给客户端传一个加密签名过的参数就可以了,这样比较安全,官方demo上放在客户端生成订单并且签名是因为没有服务给你用啊,所以就客户端上生成了~~~
2.我做的时候,为了安全,生成订单,拼接字符串,签名,都是在服务器上做的,所有的订单信息,商户信息等都掌握在自己的手中,这样的话APP端就不怕被拦截数据,并且调用起来也就特别简单了,只需要调用支付的接口,打开支付宝APP客户端进行支付就行了,没有用户的手机上没有安装支付宝客户端的话会调用网页来支付,也是一样的。
3.如果只需要发送订单和处理支付返回结果,只需要添加AlipaySDK.bundle和AlipaySDK.framework这两个就行了,在下载的SDK中,快捷支付方法是这个:

-(void)payOrder:(NSString *)orderStr fromScheme:(NSString *)schemeStr callback:(CompletionBlock)completionBlock;

在支付的按钮中,试用支付宝这个类,再调用这个方法就行啦!如下如:

iOS-支付宝支付总结_第3张图片

在调用支付宝接口的时候,我们需要两个参数
orderString:是一个订单的字符串,由后台拼接生成的,还需要签名的
appScheme:是在info.plist注册的scheme

处理支付宝返回的支付结果

在AppDelegate里处理返回结果的方法:

-(BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString *,id> *)options

具体代码:

iOS-支付宝支付总结_第4张图片

签名验证

1.首先,RSA只是一种算法,所以你可以使用任何一种开源的、或者自己去实现这个算法来实现签名和验证的目的。
2.在整个流程当中,因为涉及到了RSA公钥、私钥的生产,RSA的签名、验证签名,SHA1值的计算,base64和URL编码,所以支付宝用了一个开源的代码来统一解决这些问题,就是openssl
3.但是订单签名应该用私钥,把私钥放到app里其实本身就不安全,因为你的app是分发到用户手里的,私钥应该放在自己的手里,分发出去的应该是公钥。所以私钥最好是放在自己的服务器上,订单加密这个工作放在服务器端来做,服务器将包含签名的订单信息返回给app,app再通过SDK发送给支付宝,这样会更安全些;而且服务器也能掌握所有的订单状况,如果你非要将私钥集成到app里,那可以参考官方SDK的Demo


支付宝集成的具体步骤:

1.在工程的根目录下新建一个AliPaySDK文件夹,把官方SDK包中的以下文件拖到文件夹里,方便管理,然后导入到项目工程里。

iOS-支付宝支付总结_第5张图片

2.点击项目名,在Build Phases选项卡的Link Binary With Libraries中,增加以下依赖库。

iOS-支付宝支付总结_第6张图片

3.如果你的app基于9.0编译,那么为了适配iOS9.0中的App Transport Security(ATS)对http的限制,这里需要对支付宝的请求地址alipay.com、alipayobjects.com做例外,在app对应的info.plist中添加如下配置(文中以XML格式描述)。

  <key>NSAppTransportSecuritykey>
  <dict>
      <key>NSAllowsArbitraryLoadskey>
      <true/>
  dict>

4.如果要在某个文件中使用支付宝的开发包类库,需增加引用头文件。

#import 

5.点击项目名称,点击”Info”选项卡,在URL types里面添加一项,Identifier可以不填,URL Schemes必须和appScheme的值相同,用于支付宝处理回到应用的事件,”AliPayDemo”来自于文件”ViewController.m”的NSString *appScheme = @”AliPayDemo”。
注意:
1.这里的URL Schemes中输入的AliPayDemo,为测试demo,实际商户的app中要填写独立的scheme,建议跟商户的app有一定的标示度,要做到和其他的商户app不重复,否则可能会导致支付宝返回的结果无法正确跳回商户app。
2.定义的返回types,不能带下画线,建议字母或者字母+数字。

iOS-支付宝支付总结_第7张图片


支付宝集成中所出现的问题:

1.编译项目时,出现以下报错:”Unknown type name ‘NSString’”或者”Unknown type name ‘NSData’”等不识别常见类的问题。

iOS-支付宝支付总结_第8张图片

原因:缺少Foundation类库和UIKit类库,支付宝Demo中之所以没有出现此错误,是因为在.pch文件中导入过这些类库。

解决办法:只需要在出现错误的文件中导入这些类库即可,也可以在.pch文件中添加。

#import 
#import 

2.编译项目时,出现以下报错:Cannot find interface declaration for ‘NSObject’, superclass of ‘Base64’。

iOS-支付宝支付总结_第9张图片

解决办法:在报错的文件中添加Foundation框架。

3.编译项目时,出现以下报错:’openssl/asn1.h’ file not found。

iOS-支付宝支付总结_第10张图片

解决办法:点击项目名称,点击”Build Settings”选项卡,在搜索框中,以关键字”search”搜索,对”Header Search Paths”增加头文件路径:$(SRCROOT)/项目名称/文件所在路径。

iOS-支付宝支付总结_第11张图片

4.编译项目时,出现以下报错 :”OBJC_CLASS$_Product”, referenced from: objc-class-ref in ViewController.o。

iOS-支付宝支付总结_第12张图片

原因:官方Demo中将Product的定义写在了ViewControler.h中所致。

iOS-支付宝支付总结_第13张图片

解决办法:新建Product类,将ViewController中的代码拷贝过去即可。

iOS-支付宝支付总结_第14张图片


尾巴:

上面就是笔者对支付宝集成的一个总结和所遇到的问题,如果不懂可自行下载官方Demo,链接在文章的开头;或者参考笔者的Demo,基本和官方一样,只是多了一些注释。最后若遇到其他问题欢迎和楼主分享评论。

笔者Demo的GitHub地址:https://github.com/Scorpio27/AliPayDemo

以上部分概述内容出自以下博客的链接,以此感谢!!!

http://www.jianshu.com/p/b88f87a552a1

http://www.jianshu.com/p/fe56e122663e

你可能感兴趣的:(iOS)