支付宝支付集成步骤和流程
1 简述
-
简单说就三个步骤:
1.生成订单(可以在客户端生成,也可以在服务器端生成) 2.调用支付宝支付接口,发送订单 3.处理支付宝返回的支付结果
2.关于签名校验
- 按理说,这些步骤完全够了,但是有一个安全性问题,你肯定不希望你接收的支付结果被截获修改,所以,这就需要在生成订单和处理支付结果的时候做一个安全性校验
- 生成订单时对数据签名,收到支付结果时对数据进行签名校验,以校验数据是否被篡改过
- 支付宝目前只支持RSA加密方式做签名校验,RSA加密算法,除了可加解密之外,还可以做签名校验,简单地说,RSA会生成一个私钥和一个公钥,私钥你应该独自保管,公钥你可以分发出去。做签名验证时,你可以用私钥对需要传输的数据做签名加密,生成一个签名值,之后分发数据,接收方通过公钥对签名值做校验,如果一致则认为数据无篡改
- 具体到支付宝使用RSA做签名验证,就是在生产订单时,需要使用私钥生成签名值;在处理返回的支付结果时,需要使用公钥验证返回结果是否被篡改了
3.配置工程
3.1 导入SDK到工程中
3.2 添加系统静态依赖库
SystemConfiguration.framework
CoreTelephony.framework
QuartzCore.framework
CoreText.framework
CoreGraphics.framework
UIKit.framework
Foundation.framework
CFNetwork.framework
CoreMotion.framework
libc++.tbd
libz.tbd
3.3 修改SDK的路径
target-build setting-Header Search Paths
3.4 创建桥接文件
-
预编译头文件
#import <Foundation/Foundatio nh #import <UIKit/UIK.it.h>
-
支付宝头文件
支付宝头文件 #import "RSADataSigner.h" #import <AliPaySDK/AliPaySDK.h> #import "Order.h"
3.5 iOS9网络适配
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key><true/>
</dict>
3.6 设置应用Scheme
- 设置Scheme,方便支付宝客户端能够将支付结果返回,尽量保证Scheme唯一
3.7 支付的实现
ViewController.swift
- 实现支付需要用到的参数
支付参数 | 既定变量 |
---|---|
商户ID | partner |
账户ID | sellerID |
资金总额 | totalFee |
交易说明 | subject |
商品的具体描述 | body |
- 创建订单
// 创建订单
let order = Order()
// 商户id: 商户在支付宝签约时,支付宝为商户分配的唯一标识号(以2088开头的16位纯数字),订单支付金额将打入该账户,一个partner可以对应多个seller_id。
order.sellerID = seller
//订单号:商户网站商品对应的唯一订单号,是随机的(公司后台生成的)
order.outTradeNO = "20160923XXXX"
//资金总额:该笔订单的资金总额,单位为RMB(Yuan)。取值范围为[0.01,100000000.00],精确到小数点后两位
order.totalFee = "0.01"
//交易说明:
order.subject = "交易说明"
//商品的具体描述
order.body = "买的一部诺基亚手机"
- 验证
// 获取商品的所有属性
let orderDes = order.description
//使用私钥进行签名验证
let signer = CreateRSADataSigner(privateKey)
//打包签名信息,参数是商品描述
let singerStr = signer.signString(orderDes)
//拼接商品信息
/*
1.商品描述
2.签名信息
3.签名方式:RSA
*/
let orderStr = String(format: "%@&sign=\"%@\"&sign_type=\"%@\"", orderDes,singerStr,"RSA")
- 发起支付
参数 | 含义 |
---|---|
参数1 | 商品拼接信息 |
参数2 | url scheme(回调的唯一标示) |
参数3 | 支付完成之后的回调 |
if singerStr != nil {
AlipaySDK.defaultService().payOrder(orderStr, fromScheme: "AliPayDemo", callback: { (result) in
print("支付结果:\(result)")
})
}
-
支付完成后的结果
1.支付成功 2.支付失败 余额不足 网络问题 用户取消支付
在实际项目中,支付宝支付会跟公司自己的服务器交互
支付宝支付有客户端支付和h5支付两种方式。会自动判断当前设备上是否安装有支付宝客户端
AppDelegate.swift
- 处理客户端的回调
func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject) -> Bool {
AlipaySDK.defaultService().processOrderWithPaymentResult(url) { (result) in
print("回调结果:\(result)")
}
return true
}