集成SDK(開放平臺地址https://docs.open.alipay.com/204/105295/)
怎么集成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("支付失敗")
? ? ? ? ? ? ? ? ? ? ? ? })