zoukankan      html  css  js  c++  java
  • 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("支付失败")
                            })
  • 相关阅读:
    ubuntu: 环境搭建
    [转]unable to resolve superclass of 的奇怪问题和一种解决方法!
    [转]如何利用ndk-stack工具查看so库的调用堆栈【代码示例】?
    [转]TCP、UDP数据包大小的确定
    [转]教大家如何打造使用Tcpview(tcp查看器
    [转]帐号登录事件(事件编号与描述)
    [转]一个基于完成端口的TCP Server Framework,浅析IOCP
    [转]宏的高级使用--##,__VA_ARGS__, __FILE__, __FUNCTION__等
    mysql5.5 Replication 主从同步
    [转]adb pull Permission denied及no such file错误
  • 原文地址:https://www.cnblogs.com/vlucht/p/11147540.html
Copyright © 2011-2022 走看看