第一步:到支付寶開放平臺下載最新SDK代碼
這裏用到的是 15.7.4 版本
第二步:導入到項目中
2.1、在Xcode項目中,File -》 Add Files to "項目名稱" ,找到剛剛下載的支付寶SDK
2.2、安照下圖操作
勾選Copy items if needed,選擇AlipaySDK.framework,點擊add添加,再重複第一步將AlipaySDK.bundle添加進入項目
導入後效果爲
2.3、導入必要架包。在項目General - > Framework,Libraries,and Embedded Content下添加如下架包
libc++.tbd
libz.tbd
SystemConfiguration.framework
CoreTelephony.framework
QuartzCore.framework
CoreText.framework
CoreGraphics.framework
UIKit.framework
Foundation.framework
CFNetwork.framework
CoreMotion.framework
第三步:scheme
應用間通信用scheme,調起支付寶支付回調標識
3.1、在Info -》 URL Types 中添加一個標識
3.2、在 Info.plist 也添加一個 URL Types,內容和3.1一樣(不加跳轉到支付寶支付完成或者取消支付後就會留在支付寶應用)
第四步:可以代碼實現支付了
4.1、調起支付寶支付
注意,這裏的回調只是針對網頁的回調,支付寶應用支付回調不會走這裏
//支付寶支付
func AliplayFunc(information:String){
//information-支付訂單信息字串-請求後臺返回的
//"調用支付的app註冊在info.plist中的scheme 第三步"
AlipaySDK.defaultService()?.payOrder(information, fromScheme: "註冊在info.plist中的scheme", callback: { (resultDic) in
//print("-------- = \(resultDic)");
print(resultDic)
if let Alipayjson = resultDic as NSDictionary?{
let resultStatus = Alipayjson.value(forKey: "resultStatus") as! String
if resultStatus == "9000"{
//支付成功處理
print("支付成功")
}else if resultStatus == "8000" {
print("正在處理中")
self.navigationController?.popViewController(animated: true)
}else if resultStatus == "4000" {
print("訂單支付失敗");
self.navigationController?.popViewController(animated: true)
}else if resultStatus == "6001" {
print("用戶中途取消")
self.navigationController?.popViewController(animated: true)
}else if resultStatus == "6002" {
print("網絡連接出錯")
self.navigationController?.popViewController(animated: true)
}
}
})
}
4.2、實現支付寶應用支付回調
在IOS 13之前,這個回調可以寫在 AppDelegate 的 application 中:
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
if (url.host! as String) == "safepay" {
AlipaySDK.defaultService().processOrder(withPaymentResult: url){
value in
let code = value!
let resultStatus = code["resultStatus"] as!String
var content = ""
switch resultStatus {
case "9000":
content = "支付成功"
NotificationCenter.default.post(name: NSNotification.Name(rawValue: "aliPaySucceess"), object: content)
case "8000":
content = "訂單正在處理中"
NotificationCenter.default.post(name: NSNotification.Name(rawValue: "aliPayUnknowStatus"), object: content)
case "4000":
content = "支付失敗"
NotificationCenter.default.post(name: NSNotification.Name(rawValue: "aliPayDefeat"), object: content)
case "5000":
content = "重複請求"
NotificationCenter.default.post(name: NSNotification.Name(rawValue: "aliPayDefeat"), object: content)
case "6001":
content = "中途取消"
NotificationCenter.default.post(name: NSNotification.Name(rawValue: "aliPayDefeat"), object: content)
case "6002":
content = "網絡連接出錯"
NotificationCenter.default.post(name: NSNotification.Name(rawValue: "aliPayDefault"), object: content)
case "6004":
content = "支付結果未知"
NotificationCenter.default.post(name: NSNotification.Name(rawValue: "aliPayUnknowStatus"), object: content)
default:
content = "支付失敗"
NotificationCenter.default.post(name: NSNotification.Name(rawValue: "aliPayDefeat"), object: content)
break
}
}
}
return true
}
4.3、IOS 13之後,發現回調不會走 application 了,而是走 SceneDelegate 的 scene 方法,如下:
func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
print("scene7")
print(URLContexts.first?.url)
if let context = URLContexts.first {
var options = [UIApplication.OpenURLOptionsKey: Any]()
options[.sourceApplication] = context.options.sourceApplication
options[.annotation] = context.options.annotation
options[.openInPlace] = context.options.openInPlace
if ((URLContexts.first?.url.host!)! as String) == "safepay" {
AlipaySDK.defaultService()?.processOrder(withPaymentResult: context.url, standbyCallback: { (resultDic:[AnyHashable : Any]?) in
var content = ""
if let Alipayjson = resultDic as NSDictionary?{
let resultStatus = Alipayjson.value(forKey: "resultStatus") as! String
switch resultStatus {
case "9000":
content = "支付成功"
NotificationCenter.default.post(name: NSNotification.Name(rawValue: "aliPaySucceess"), object: content)
case "8000":
content = "訂單正在處理中"
NotificationCenter.default.post(name: NSNotification.Name(rawValue: "aliPayUnknowStatus"), object: content)
case "4000":
content = "支付失敗"
NotificationCenter.default.post(name: NSNotification.Name(rawValue: "aliPayDefeat"), object: content)
case "5000":
content = "重複請求"
NotificationCenter.default.post(name: NSNotification.Name(rawValue: "aliPayDefeat"), object: content)
case "6001":
content = "中途取消"
NotificationCenter.default.post(name: NSNotification.Name(rawValue: "aliPayDefeat"), object: content)
case "6002":
content = "網絡連接出錯"
NotificationCenter.default.post(name: NSNotification.Name(rawValue: "aliPayDefault"), object: content)
case "6004":
content = "支付結果未知"
NotificationCenter.default.post(name: NSNotification.Name(rawValue: "aliPayUnknowStatus"), object: content)
default:
content = "支付失敗"
NotificationCenter.default.post(name: NSNotification.Name(rawValue: "aliPayDefeat"), object: content)
break
}
print("\(content) \(resultStatus)")
}
})
}
}
}
4.4、實現了4.2或4.3之後,就能夠獲取到同步的回調數據了,從上面的代碼中可以看到,獲取到結果之後,通過通知中心通知界面。
4.4.1、發送通知,如上4.2和4.3,獲取結果之後發送通知給界面
NotificationCenter.default.post(name: NSNotification.Name(rawValue: "aliPayDefeat"), object: content)
4.4.2、接收通知,在相關界面接收通知
//支付寶支付獲取通知-失敗的通知
NotificationCenter.default.addObserver(self, selector: #selector(self.aliPayDefeat(notification:)), name: Notification.Name("aliPayDefeat"), object: nil)
//支付寶支付獲取通知-成功的通知
NotificationCenter.default.addObserver(self, selector: #selector(self.aliPaySucceess(notification:)), name: Notification.Name("aliPaySucceess"), object: nil)
4.4.3、接收通知時定義了方法處理通知數據
#selector(self.aliPayDefeat(notification:))
#selector(self.aliPaySucceess(notification:))
@objc func aliPayDefeat(notification: Notification){
print(notification.name)
print("支付失敗")
}
@objc func aliPaySucceess(notification: Notification){
print(notification.name)
print("支付成功")
}
以上就是最新實現的 ios 接入支付寶支付,如有不足,請留言指出