下载:
https://doc.open.alipay.com/doc2/detail?treeId=54&articleId=103419&docType=1web
文档:
压缩包里应该有两个压缩文档
<支付宝钱包支付接口开发包2.0标准版>
<支付宝钱包支付接口开发包2.0标准版接入与使用规则>
iOS 相关内容能够直接看第一个文档,第二个文档名字和里面写的不同,内容实际上是一个附录;
文档里面多个平台都涉及到了,内容有些杂乱。算法
下面我用几幅图来给你们展现一下客户端调起支付的过程:安全
1.买家在手机应用中购买商品或者是服务服务器
2.买家选择支付方式网络
3.进入支付宝收银台进行付款app
4.支付成功工具
5.交易完成,买家能够查看交易信息加密
在调用支付以前,将商品数据信息生成待签名的字符串,信息包括:url
{code
}
如何声明密钥请看文档:
http://doc.open.alipay.com/doc2/detail?treeId=58&articleId=103242&docType=1
1.安装OpenSSL工具
2.RSA私钥及公钥生成
RSA加密算法除了能够加解密外,还能够用来作签名校验。简单的说,RSA会生成一个私钥和一个公钥,私钥你应该独自保管,公钥你能够分发出去。作签名验证时,你能够用私钥对须要传输的数据作签名加密,生成一个签名值,以后分发数据,接收方经过公钥对签名值作校验,若是一致则认为数据无篡改.
具体到支付宝使用RSA作签名验证,就是在生产订单的时候,须要使用私钥生成签名值;在处理返回的支付结果时,须要使用公钥验证返回结果是否被篡改了。具体须要对哪些值,怎么样生成签名,对哪些值作签名验证,能够在第一个文档中找找,后面我会简单提一下,但仍是以文档或实践为准吧。
订单签名:
上面说了,订单签名应该使用私钥,可是把私钥放在app里实际上是不安全的,由于你的app是分发到用户手里的,私钥应该放在你的手里,分发出去的应该是公钥。因此私钥最好是放在本身的服务器上,订单加密这个工做放在服务器来作,服务器将包含签名的订单信息返回给app,app再经过SDK发送给支付宝,这样会更安全一些;并且服务器也能掌握全部的订单情况。
若是你非要将私钥集成到app里,那能够参考SDK的demo,由于这个demo就是在app本地经过私钥作的订单签名。
支付结果签名验证
上面的回调block提到了返回的内容,返回的支付结果中的result字段里是带有订单信息和签名信息的,因此签名验证就是须要这个字段的值。
文档中有一个这个字段的例子,实际结果没有换行,我换一行便于阅读:
partner=”2088101568358171”&seller_id=”xxx@alipay.com”&out_trade_no=”0819145412-6177”&subject= &sign_type=”RSA” &sign=”hkFZr+zE9499nuqDNLZEF7W75RFFPsly876QuRSeN8WMaUgcdR00IKy5ZyBJ4eldhoJ/2zghqrD4E2G2mNjs3aE”
这个签名当中分为三部分
第一部分是订单信息,每一个字段的具体含义能够再文档里找;
中间sign_type 是签名所用的算法,文档中提到,目前只是支持RSA;
最后的sign就是签名值。
验证的步骤以下:
首先把订单信息和签名值分别提取出来(SDK中并无给进行处理)
订单信息就是sign_type的连字符&以前的全部字符串 签名值是sign后面双引导的内容,注意签名的结尾也是 = ,因此不要用split字符串的方法提取
支付SDK
若是只须要发送订单和处理支付返回结果,只须要添加AlipaySDK.bundle 和 Alipay.framework 就好了。
发送订单的方法:
此时须要注意:
若是手机内没有安装支付宝的app,会直接展示支付宝web支付页面,经过callback返回支付结果;
若是手机内安装了支付宝的app,会跳转到支付宝的app支付,而后经过openUrl的回调返回支付结果.
支付宝的SDK只给了一个处理返回结果的方法,而不会像其余的第三方SDK提供一个处理openUrl的方法,因此你须要经过demo或者在第二个文档里找处处理openUrl的方式:
if ([url.host isEqualToString:@”safepay”]) {
[[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
}]; }
SDK也提供了一个处理openUrl返回结果的方法
两个回调block都统必定义为typedef void(^CompletionBlock)(NSDictionary *resultDic);
返回了一个字典,可是SDK里彻底没有提示有哪些Key.
咱们来看一下resultStatus 状态码分别代码什么意思,这个是在文档中没有的
9000 订单支付成功
8000 正在处理中
4000 订单支付失败
6001 用户中途取消
6002 网络链接出错
memo 提示信息, 好比说状态码为 6001时,memo就是“用户中途取消的意思”,可是咱们在开发中绝对不能依赖于这个信息,若是未安装支付宝的app,采用网页支付时,取消时状态码是 6001,但这个memo是空的。
result 订单信息,以及签名验证信息.若是你不想作签名验证,这个字段能够忽略不计了。