Swift調用微信支付寶SDK(Swift4.0)


怎么集成SDK自行百度

  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("支付失敗")
                        })

 主要是做個記錄

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM