IOS 13 Swift 5 接入支付寶支付 應用回調 不走 application 走 scene

第一步:到支付寶開放平臺下載最新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 接入支付寶支付,如有不足,請留言指出 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章