怎么集成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("支付失敗") })
主要是做個記錄