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添加进入项目

                      导入后效果为

IOS 13 Swift 5 接入支付宝支付 应用回调 不走 application 走 scene_第1张图片

                   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 中添加一个标识

IOS 13 Swift 5 接入支付宝支付 应用回调 不走 application 走 scene_第2张图片

              3.2、在 Info.plist 也添加一个 URL Types,内容和3.1一样(不加跳转到支付宝支付完成或者取消支付后就会留在支付宝应用)

IOS 13 Swift 5 接入支付宝支付 应用回调 不走 application 走 scene_第3张图片

第四步:可以代码实现支付了

               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) {
        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 接入支付宝支付,如有不足,请留言指出 

 

 

你可能感兴趣的:(IOS,ios,swift,xcode,iOS,13,swift,5)