//
|
// YYPaymentManager.swift
|
// YYBase
|
//
|
// Created by alvin_y on 2020/7/2.
|
// Copyright © 2020 yangwang. All rights reserved.
|
//
|
|
import Foundation
|
enum YYPaymentResult {
|
case success
|
case cancel
|
case failure(Error)
|
}
|
|
private protocol YYPaymentManagerDelegate: AnyObject {
|
|
func paymentManager(_ paymentManager: YYPaymentManager, didReceivePayment result: YYPaymentResult)
|
}
|
class YYPaymentManager: NSObject {
|
|
/// 支付单例
|
static let shared = YYPaymentManager()
|
|
private override init() {}
|
|
private weak var delegate: YYPaymentManagerDelegate?
|
|
private var alipay_appScheme: String?
|
|
/// 微信AppID
|
private var weChat_appID: String?
|
|
private var didReceivePaymentInfos: ((_ result: YYPaymentResult) -> Void)?
|
|
}
|
|
extension YYPaymentManager {
|
|
/// 配置支付宝AppScheme
|
///
|
/// - Parameter appScheme: 支付宝AppScheme
|
func configuredAlipay(appScheme: String) {
|
|
alipay_appScheme = appScheme
|
}
|
|
/// 配置微信AppID
|
///
|
/// - Parameter appID: 微信AppID
|
func configuredWeChat(appID: String) {
|
|
weChat_appID = appID
|
WXApi.registerApp(appID, universalLink: WechatUniversalLinks)
|
}
|
}
|
|
extension YYPaymentManager {
|
|
/// 发送支付宝支付请求
|
///
|
/// - Parameters:
|
/// - request: 支付宝支付请求类 MMAlipayRequest
|
/// - result: 返回支付结果 success: 支付成功,cancel:支付被取消,failure:支付失败
|
func sendPaymentRequest(_ request: PayModel, didReceive result: @escaping (YYPaymentResult) -> Void) {
|
|
guard let appScheme = alipay_appScheme, !appScheme.isEmpty else {
|
fatalError("未设置appScheme")
|
}
|
|
AlipaySDK.defaultService()?.payOrder(request.orderString,
|
fromScheme: appScheme,
|
callback: { (result) in
|
self.handleAlipayResult(result)
|
})
|
|
didReceivePaymentInfos = { (infos) in
|
result(infos)
|
}
|
}
|
|
/// 拉起小程序支付
|
func sendWXPaymentRequest(_ request: YYWeChatMiniProgramPayRequest,didReceive result: @escaping (YYPaymentResult) -> Void) {
|
|
guard WXApi.isWXAppInstalled() else {
|
self.delegate?.paymentManager(self, didReceivePayment: .failure(NSError(domain: "com.paymentManager.error", code: -9999, userInfo: [NSLocalizedDescriptionKey: "未安装微信"])))
|
result(.failure(NSError(domain: "com.paymentManager.error", code: -9999, userInfo: [NSLocalizedDescriptionKey: "未安装微信"])))
|
return
|
}
|
let launchMiniProgramReq = WXLaunchMiniProgramReq.object()
|
// /拉起的小程序的username-原始ID
|
launchMiniProgramReq.userName = WechatMini
|
// 拉起小程序页面的可带参路径,不填默认拉起小程序首页
|
launchMiniProgramReq.path = "/pages/appPay/appPay?orderId=\(request.orderId ?? 0)&orderType=\(request.orderType ?? 0)&type=\(request.type)&uid=\(request.uid)&userType=\(request.userType)&content=\(request.content ?? "")"
|
launchMiniProgramReq.miniProgramType = .release
|
// launchMiniProgramReq.extMsg = request.toJSONString()
|
WXApi.send(launchMiniProgramReq) { (success) in
|
|
}
|
}
|
|
/// 发送微信支付请求
|
///
|
/// - Parameters:
|
/// - request: 微信支付请求类 MMWeChatPayRequest
|
/// - result: 返回支付结果 success: 支付成功,cancel:支付被取消,failure:支付失败
|
func sendPaymentRequest(_ request: YYWeChatPayRequest, didReceive result: @escaping (YYPaymentResult) -> Void) {
|
|
guard let weChat_appID = weChat_appID, !weChat_appID.isEmpty else {
|
fatalError("未设置微信AppID")
|
}
|
|
guard WXApi.isWXAppInstalled() else {
|
self.delegate?.paymentManager(self, didReceivePayment: .failure(NSError(domain: "com.paymentManager.error", code: -9999, userInfo: [NSLocalizedDescriptionKey: "未安装微信"])))
|
result(.failure(NSError(domain: "com.paymentManager.error", code: -9999, userInfo: [NSLocalizedDescriptionKey: "未安装微信"])))
|
return
|
}
|
|
let req = PayReq()
|
req.partnerId = request.partnerId
|
req.prepayId = request.prepayId
|
req.package = request.package
|
req.nonceStr = request.nonceStr
|
req.timeStamp = UInt32(request.timeStamp)
|
req.sign = request.sign
|
WXApi.send(req) { (success) in
|
|
}
|
didReceivePaymentInfos = { (infos) in
|
result(infos)
|
}
|
}
|
}
|
|
extension YYPaymentManager {
|
|
/// 处理通过URL启动App时传递的数据
|
///
|
/// 在AppDelegate中对应方法中调用并将结果返回给系统的方法
|
func handleApplication(_ application: UIApplication, handleOpen url: URL) -> Bool {
|
|
return handle(open: url)
|
}
|
|
/// 处理通过URL启动App时传递的数据
|
///
|
/// 在AppDelegate中对应方法中调用并将结果返回给系统的方法
|
func handleApplication(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {
|
|
return handle(open: url)
|
}
|
|
/// 处理通过URL启动App时传递的数据
|
///
|
/// 在AppDelegate中对应方法中调用并将结果返回给系统的方法
|
func handleApplication(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
|
|
return handle(open: url)
|
}
|
|
private func handle(open url: URL) -> Bool {
|
|
if url.host == "safepay" {
|
// 支付宝
|
|
AlipaySDK.defaultService()?.processOrder(withPaymentResult: url, standbyCallback: { (result) in
|
self.handleAlipayResult(result)
|
})
|
|
return true
|
}
|
|
else if url.host == "pay" {
|
// 微信
|
|
return WXApi.handleOpen(url, delegate: self)
|
}
|
|
else if url.host == "resendContextReqByScheme" {
|
// 微信
|
|
return WXApi.handleOpen(url, delegate: self)
|
}
|
|
return false
|
}
|
|
private func handleResult(_ result: YYPaymentResult) {
|
|
delegate?.paymentManager(self, didReceivePayment: result)
|
didReceivePaymentInfos?(result)
|
}
|
}
|
|
extension YYPaymentManager {
|
|
private func handleAlipayResult(_ result: [AnyHashable: Any]?) {
|
|
if let code = result?["resultStatus"] as? String, let message = result?["memo"] as? String {
|
switch code {
|
case "9000":
|
handleResult(.success)
|
|
case "6001":
|
handleResult(.cancel)
|
|
default:
|
handleResult(.failure(NSError(domain: "com.abitofcomedy.paymentManager.error",
|
code: Int(code) ?? -9999,
|
userInfo: [NSLocalizedDescriptionKey: message])))
|
}
|
} else {
|
handleResult(.failure(NSError(domain: "com.abitofcomedy.paymentManager.error",
|
code: -9999,
|
userInfo: [NSLocalizedDescriptionKey: "支付失败"])))
|
}
|
}
|
}
|
|
extension YYPaymentManager: WXApiDelegate {
|
|
/// 微信支付回调代理方法,不要直接调用
|
final func onResp(_ resp: BaseResp) {
|
// WXSuccess = 0, /**< 成功 */
|
// WXErrCodeCommon = -1, /**< 普通错误类型 */
|
// WXErrCodeUserCancel = -2, /**< 用户点击取消并返回 */
|
// WXErrCodeSentFail = -3, /**< 发送失败 */
|
// WXErrCodeAuthDeny = -4, /**< 授权失败 */
|
// WXErrCodeUnsupport = -5, /**< 微信不支持 */
|
|
if let response = resp as? PayResp {
|
|
switch response.errCode {
|
|
case 0: // 成功
|
handleResult(.success)
|
case -2: // 取消
|
handleResult(.cancel)
|
default:
|
handleResult(.failure(NSError(domain: "com.paymentManager.error",
|
code: Int(response.errCode),
|
userInfo: [NSLocalizedDescriptionKey: "支付失败"])))
|
}
|
}
|
}
|
}
|