Swift调用微信支付宝SDK(Swift4.0)

  1.第一步在程序入口注册微信  (支付宝不需要)

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    //向微信终端程序注册第三方应用
     WXApi.registerApp(WX_APPID)
}

   2.微信支付管理类客户端只负责调用(支付信息什么的都是服务器完成的)

import UIKit
//微信appid
let WX_APPID=""
//AppSecret
let SECRET=""
//微信
class WXApiManager:NSObject,WXApiDelegate {
    static let shared = WXApiManager()
    // 用于弹出警报视图,显示成功或失败的信息()
    private weak var sender:BaseViewController! //(UIViewController)
    // 支付成功的闭包
    private var paySuccessClosure: (() -> Void)?
    // 支付失败的闭包
    private var payFailClosure: (() -> Void)?
    //登录成功
    private var loginSuccessClosure:((_ code:String) -> Void)?
    //登录失败
    private var loginFailClosure:(() -> Void)?
    // 外部用这个方法调起微信支付
    func payAlertController(_ sender:BaseViewController,
                            request:PayReq,
                            paySuccess: @escaping () -> Void,
                            payFail:@escaping () -> Void) {
        // sender 是调用这个方法的控制器,
        // 用于提示用户微信支付结果,可以根据自己需求是否要此参数。
        self.sender = sender
        self.paySuccessClosure = paySuccess
        self.payFailClosure = payFail
        if checkWXInstallAndSupport(){//检查用户是否安装微信
            WXApi.send(request)
        }
    }
    //外部用这个方法调起微信登录
    func login(_ sender:BaseViewController,loginSuccess: @escaping ( _ code:String) -> Void,
               loginFail:@escaping () -> Void){
        // sender 是调用这个方法的控制器,
        // 用于提示用户微信支付结果,可以根据自己需求是否要此参数。
        self.sender = sender
        self.loginSuccessClosure = loginSuccess
        self.loginFailClosure = loginFail
        if checkWXInstallAndSupport(){
            let req=SendAuthReq()
            req.scope="snsapi_userinfo"
            req.state="app"
            WXApi.send(req)
        }
    }
    
}
extension WXApiManager {
    func onResp(_ resp: BaseResp!) {
        if resp is PayResp {//支付
            if resp.errCode == 0 {
                self.paySuccessClosure?()
            }else{
                self.payFailClosure?()
            }
        }else if resp is SendAuthResp{//登录结果
            let authResp = resp as! SendAuthResp
            var strMsg: String
            if authResp.errCode == 0{
                strMsg="微信授权成功"
            }else{
                switch authResp.errCode{
                case -4:
                    strMsg="您拒绝使用微信登录"
                    break
                case -2:
                    strMsg="您取消了微信登录"
                    break
                default:
                    strMsg="微信登录失败"
                    break
                }
            }
            UIAlertController.showAlertYes(sender, title: "授权结果", message: strMsg, okButtonTitle:"确定", okHandler: { (alert) in
                if authResp.errCode == 0 {
                    self.loginSuccessClosure?(authResp.code)
                    
                }else{
                    self.loginFailClosure?()
                }
            })
        }
    }
}

extension WXApiManager {
    // 检查用户是否已经安装微信并且有支付功能
    private func checkWXInstallAndSupport() -> Bool {
        if !WXApi.isWXAppInstalled() {
            ///这里的弹窗是我写的扩展方法
            UIAlertController.showAlertYes(sender,title:"", message: "微信未安装", okButtonTitle:"确定")
            return false
        }
        if !WXApi.isWXAppSupport() {
            ///这里的弹窗是我写的扩展方法
            UIAlertController.showAlertYes(sender,title:"", message: "当前微信版本不支持支付", okButtonTitle:"确定")
            return false
        }
        return true
    }
}

3. 支付宝管理类客户端只负责调用(支付信息什么的都是服务器完成的)

//支付宝
class AliPayManager:NSObject{
    static let shared = AliPayManager()
    // 用于弹出警报视图,显示成功或失败的信息
    fileprivate weak var sender: UIViewController!
    // 支付成功的闭包
    fileprivate var paySuccessClosure: (() -> Void)?
    // 支付失败的闭包
    fileprivate var payFailClosure: (() -> Void)?
    ///登录成功的闭包
    fileprivate var loginSuccessClosure:((_ auth_code:String) -> Void)?
    ///登录失败的闭包
    fileprivate var loginFailClosure:(() -> Void)?
    // 外部用这个方法调起支付支付
    func payAlertController(_ sender: UIViewController,
                            request:String,
                            paySuccess: @escaping () -> Void,
                            payFail:@escaping () -> Void) {
        // sender 是调用这个方法的控制器,
        self.sender = sender
        //用于提示用户支付宝支付结果,可以根据自己需求是否要此参数。
        self.paySuccessClosure = paySuccess
        self.payFailClosure = payFail
        AlipaySDK.defaultService().payOrder(request, fromScheme:"这里是URL Types配置的URLShcemes",callback:nil)
    }
    //外部用这个方法调起支付宝登录
    func login(_ sender:BaseViewController,withInfo:String,loginSuccess: @escaping (_ str:String) -> Void,loginFail:@escaping () -> Void){
        // sender 是调用这个方法的控制器,
        // 用于提示用户微信支付结果,可以根据自己需求是否要此参数。
        self.sender = sender
        self.loginSuccessClosure = loginSuccess
        self.loginFailClosure = loginFail
        AlipaySDK.defaultService().auth_V2(withInfo:withInfo, fromScheme:"这里是URL Types配置的URLSchemes", callback:nil)
    }
    ///授权回调
    func showAuth_V2Result(result:NSDictionary){
        //        9000    请求处理成功
        //        4000    系统异常
        //        6001    用户中途取消
        //        6002    网络连接出错
        let returnCode:String = result["resultStatus"] as! String
        var returnMsg:String = ""
        switch  returnCode{
        case "6001":
            returnMsg = "用户中途取消"
            break
        case "6002":
            returnMsg = "网络连接出错"
            break
        case "4000":
            returnMsg = "系统异常"
            break
        case "9000":
            returnMsg = "授权成功"
            break
        default:
            returnMsg = "系统异常"
            break
        }
        UIAlertController.showAlertYes(sender, title: "授权结果", message: returnMsg, okButtonTitle:"确定", okHandler: { (alert) in
            if returnCode == "9000" {
                let r=result["result"] as! String
                self.loginSuccessClosure?(r)
                
            }else{
                self.loginFailClosure?()
            }
        })
    }
    //传入回调参数
    func showResult(result:NSDictionary){
        //        9000    订单支付成功
        //        8000    正在处理中
        //        4000    订单支付失败
        //        6001    用户中途取消
        //        6002    网络连接出错
        let returnCode:String = result["resultStatus"] as! String
//        var returnMsg:String = ""
//        switch  returnCode{
//        case "6001":
//            returnMsg = "用户中途取消"
//            break
//        case "6002":
//            returnMsg = "网络连接出错"
//            break
//        case "8000":
//            returnMsg = "正在处理中"
//            break
//        case "4000":
//            returnMsg = "订单支付失败"
//            break
//        case "9000":
//            returnMsg = "支付成功"
//            break
//        default:
//            returnMsg = "订单支付失败"
//            break
//        }
//        UIAlertController.showAlertYes(sender, title: "支付结果", message: returnMsg, okButtonTitle:"确定", okHandler: { (alert) in
//            if returnCode == "9000" {
//                self.paySuccessClosure?()
//
//            }else{
//                self.payFailClosure?()
//            }
//        })
        if returnCode == "9000" {
            self.paySuccessClosure?()
            
        }else{
            self.payFailClosure?()
        }
    }
}

4.在AppDelegate中回调

// MARK: - 支付回调
extension AppDelegate{
    // iOS 8 及以下请用这个
    func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {
        if url.host == "safepay"{//支付宝
            //支付回调
            AlipaySDK.defaultService().processOrder(withPaymentResult: url, standbyCallback:{ (resultDic) in
                if resultDic != nil{
                    AliPayManager.shared.showResult(result:resultDic! as NSDictionary)
                }
            })
            //授权回调
            AlipaySDK.defaultService().processAuth_V2Result(url, standbyCallback: { (resultDic) in
                if resultDic != nil{
                    AliPayManager.shared.showAuth_V2Result(result:resultDic! as NSDictionary)
                }
            })
            return true
        }else{//微信
            return WXApi.handleOpen(url, delegate:WXApiManager.shared)
        }
        
    }
    // iOS 9 以上请用这个
    func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any]) -> Bool {
        if url.host == "safepay"{//支付宝
            //支付回调
            AlipaySDK.defaultService().processOrder(withPaymentResult: url, standbyCallback:{ (resultDic) in
                if resultDic != nil{
                    AliPayManager.shared.showResult(result:resultDic! as NSDictionary)
                }
            })
            //授权回调
            AlipaySDK.defaultService().processAuth_V2Result(url, standbyCallback: { (resultDic) in
                if resultDic != nil{
                    AliPayManager.shared.showAuth_V2Result(result:resultDic! as NSDictionary)
                }
            })
            return true
        }else{//微信
            return WXApi.handleOpen(url,delegate:WXApiManager.shared)
        }
    }
}

 5.支付调用 这里拿数据是用SwiftyJSON

1.微信支付
///从服务器拿到生成好的请求参数 
let charge=json["charge"]
let req=PayReq()
req.timeStamp=charge["timestamp"].uInt32Value
req.partnerId=charge["partnerid"].stringValue
req.package=charge["package"].stringValue
req.nonceStr=charge["noncestr"].stringValue
req.sign=charge["sign"].stringValue
req.prepayId=charge["prepayid"].stringValue
WXApiManager.shared.payAlertController(self, request: req, paySuccess: {
                           print("支付成功")
                        }, payFail: {
                            print("支付失败")
                        })
2.支付宝支付
///从服务器拿到生成好的请求参数 
let orderString=json["charge"]["orderString"].stringValue
                        AliPayManager.shared.payAlertController(self, request:orderString, paySuccess: {
                            print("支付成功")
                        }, payFail: {
                            print("支付失败")
                        })
原文地址:https://www.cnblogs.com/vlucht/p/11147540.html