支付寶支付集成步驟和流程
1 簡述
-
簡單說就三個步驟:
1.生成訂單(可以在客戶端生成啦膜,也可以在服務(wù)器端生成) 2.調(diào)用支付寶支付接口,發(fā)送訂單 3.處理支付寶返回的支付結(jié)果
2.關(guān)于簽名校驗
- 按理說,這些步驟完全夠了释移,但是有一個安全性問題旭愧,你肯定不希望你接收的支付結(jié)果被截獲修改,所以置逻,這就需要在生成訂單和處理支付結(jié)果的時候做一個安全性校驗
- 生成訂單時對數(shù)據(jù)簽名推沸,收到支付結(jié)果時對數(shù)據(jù)進(jìn)行簽名校驗,以校驗數(shù)據(jù)是否被篡改過
- 支付寶目前只支持RSA加密方式做簽名校驗券坞,RSA加密算法鬓催,除了可加解密之外,還可以做簽名校驗恨锚,簡單地說宇驾,RSA會生成一個私鑰和一個公鑰,私鑰你應(yīng)該獨(dú)自保管猴伶,公鑰你可以分發(fā)出去课舍。做簽名驗證時,你可以用私鑰對需要傳輸?shù)臄?shù)據(jù)做簽名加密他挎,生成一個簽名值筝尾,之后分發(fā)數(shù)據(jù),接收方通過公鑰對簽名值做校驗雇盖,如果一致則認(rèn)為數(shù)據(jù)無篡改
- 具體到支付寶使用RSA做簽名驗證忿等,就是在生產(chǎn)訂單時,需要使用私鑰生成簽名值崔挖;在處理返回的支付結(jié)果時贸街,需要使用公鑰驗證返回結(jié)果是否被篡改了
3.配置工程
3.1 導(dǎo)入SDK到工程中
3.2 添加系統(tǒng)靜態(tài)依賴庫
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 創(chuàng)建橋接文件
-
預(yù)編譯頭文件
#import <Foundation/Foundatio nh #import <UIKit/UIK.it.h>
-
支付寶頭文件
支付寶頭文件 #import "RSADataSigner.h" #import <AliPaySDK/AliPaySDK.h> #import "Order.h"
3.5 iOS9網(wǎng)絡(luò)適配
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key><true/>
</dict>
3.6 設(shè)置應(yīng)用Scheme
- 設(shè)置Scheme,方便支付寶客戶端能夠?qū)⒅Ц督Y(jié)果返回狸相,盡量保證Scheme唯一
3.7 支付的實(shí)現(xiàn)
ViewController.swift
- 實(shí)現(xiàn)支付需要用到的參數(shù)
支付參數(shù) | 既定變量 |
---|---|
商戶ID | partner |
賬戶ID | sellerID |
資金總額 | totalFee |
交易說明 | subject |
商品的具體描述 | body |
- 創(chuàng)建訂單
// 創(chuàng)建訂單
let order = Order()
// 商戶id: 商戶在支付寶簽約時薛匪,支付寶為商戶分配的唯一標(biāo)識號(以2088開頭的16位純數(shù)字),訂單支付金額將打入該賬戶脓鹃,一個partner可以對應(yīng)多個seller_id逸尖。
order.sellerID = seller
//訂單號:商戶網(wǎng)站商品對應(yīng)的唯一訂單號,是隨機(jī)的(公司后臺生成的)
order.outTradeNO = "20160923XXXX"
//資金總額:該筆訂單的資金總額,單位為RMB(Yuan)。取值范圍為[0.01娇跟,100000000.00]岩齿,精確到小數(shù)點(diǎn)后兩位
order.totalFee = "0.01"
//交易說明:
order.subject = "交易說明"
//商品的具體描述
order.body = "買的一部諾基亞手機(jī)"
- 驗證
// 獲取商品的所有屬性
let orderDes = order.description
//使用私鑰進(jìn)行簽名驗證
let signer = CreateRSADataSigner(privateKey)
//打包簽名信息,參數(shù)是商品描述
let singerStr = signer.signString(orderDes)
//拼接商品信息
/*
1.商品描述
2.簽名信息
3.簽名方式:RSA
*/
let orderStr = String(format: "%@&sign=\"%@\"&sign_type=\"%@\"", orderDes,singerStr,"RSA")
- 發(fā)起支付
參數(shù) | 含義 |
---|---|
參數(shù)1 | 商品拼接信息 |
參數(shù)2 | url scheme(回調(diào)的唯一標(biāo)示) |
參數(shù)3 | 支付完成之后的回調(diào) |
if singerStr != nil {
AlipaySDK.defaultService().payOrder(orderStr, fromScheme: "AliPayDemo", callback: { (result) in
print("支付結(jié)果:\(result)")
})
}
-
支付完成后的結(jié)果
1.支付成功 2.支付失敗 余額不足 網(wǎng)絡(luò)問題 用戶取消支付
在實(shí)際項目中,支付寶支付會跟公司自己的服務(wù)器交互
支付寶支付有客戶端支付和h5支付兩種方式苞俘。會自動判斷當(dāng)前設(shè)備上是否安裝有支付寶客戶端
AppDelegate.swift
- 處理客戶端的回調(diào)
func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject) -> Bool {
AlipaySDK.defaultService().processOrderWithPaymentResult(url) { (result) in
print("回調(diào)結(jié)果:\(result)")
}
return true
}