KMRequestServerManager.swift 42 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875
  1. //
  2. // KMRequestServerManager.swift
  3. // PDF Master
  4. //
  5. // Created by lizhe on 2023/2/22.
  6. //
  7. import Cocoa
  8. enum KMRequestServerErrorCodeType: Int, CaseIterable {
  9. case unknown = 0 //未知
  10. case correct = 200 //正确
  11. case EXCEPTION_MSG_IMAGE_CODE_ERROR = 301
  12. case EXCEPTION_MSG_USER_NOT_FOUND = 302
  13. case EXCEPTION_MSG_TOKEN_IS_INVALID = 304
  14. case EXCEPTION_MSG_DEVICE_NUM_MAX = 305
  15. case EXCEPTION_MSG_USER_NOT_LOGIN = 306
  16. case EXCEPTION_MSG_GET_CODE_FAIL = 307
  17. case EXCEPTION_MSG_GET_TOKEN_FAIL = 308
  18. case EMAIL_VERIFY_CODE_KEY_ERROR = 309
  19. case EMAIL_REGISTER_ERROR = 310
  20. case EXCEPTION_MSG_PASSWORD_ERROR = 311
  21. case EXCEPTION_MSG_CODE_ACTION_ERROR = 312
  22. case EXCEPTION_MSG_CODE_SEND_ERROR = 313
  23. case EXCEPTION_MAIL_CODE_SEND_ERROR = 314
  24. case VERIFY_CODE_SEND_TOO_QUICKLY = 315
  25. case EXCEPTION_MSG_EMAIL_EXIST = 316
  26. case EXCEPTION_MSG_EMAIL_NOT_REGISTER = 317
  27. case EXCEPTION_MSG_EMAIL_LOGOUT_ING = 318
  28. case EXCEPTION_MSG_EMAIL_INVALID = 319
  29. case EXCEPTION_MSG_PASSWORD_NOT_INCONSISTENT = 320
  30. case EXCEPTION_MSG_PASSWORD_SIZE_MIN = 321
  31. case EXCEPTION_MSG_PASSWORD_SIZE_MAX = 322
  32. case EXCEPTION_MSG_PLEASE_ADD_AUTH_CONFIG = 323
  33. case EXCEPTION_MSG_USER_SUBSCRIPTION_IN_PROGRESS = 324
  34. case EXCEPTION_MSG_USER_TRAIL_IN_PROGRESS = 325
  35. case EXCEPTION_TIME_TRANSFER_ERROR = 326
  36. case EXCEPTION_MSG_PASSWORD_CONTAIN_EMRTY = 327
  37. case EXCEPTION_MSG_CREATE_ORDER_PARAMETER = 328//,"支付方式异常"),
  38. case EXCEPTION_MSG_EVENT_IS_CURRENTLY_NOT_SUPPORTED = 329 //, "当前事件暂不支持"),
  39. case EXCEPTION_MSG_THE_ACCOUNT_IS_ALREADY_LOGGED_IN_ON_OTHER_DEVICES = 330//, "账号已在其他设备登录"),
  40. case EXCEPTION_MSG_ABNORMAL_USER_STATUS = 331 //,"当前邮箱已被停用或者处于注销中状态"),
  41. case EXCEPTION_MSG_APP_STORE_TICKET_VALIDATION_FAILED = 332 //"AppStore票据验证失败"),
  42. case EXCEPTION_MSG_APP_STORE_TICKET_VALIDATION_NEED_TO_RETRY = 333// "AppStore票据验证需要重试"),
  43. case EXCEPTION_MSG_REPEAT_SUBSCRIPTION = 334 //"用户已订阅该产品"
  44. case EXCEPTION_MSG_RESTORING_PURCHASES_IS_NOT_CURRENTLY_SUPPORTED = 335 //"恢复购买暂不支持"),
  45. case EMAIL_VERIFY_CODE_KEY_ERROR2 = 700
  46. static func typeOfMessage(type: KMRequestServerErrorCodeType?) -> String {
  47. var result: String = ""
  48. switch type {
  49. case .EXCEPTION_MSG_IMAGE_CODE_ERROR:
  50. result = "Graphic verification code error"
  51. case .EXCEPTION_MSG_USER_NOT_FOUND:
  52. result = "Email address is not registered"
  53. case .EXCEPTION_MSG_TOKEN_IS_INVALID:
  54. result = "Invalid token or token has expired"
  55. case .EXCEPTION_MSG_DEVICE_NUM_MAX:
  56. result = "You have reached the maximum number of devices, please log out of other devices and log in again."
  57. case .EXCEPTION_MSG_USER_NOT_LOGIN:
  58. result = "User is not logged in. Please log in and try again."
  59. case .EXCEPTION_MSG_GET_CODE_FAIL:
  60. result = "Failed to obtain authorization code"
  61. case .EXCEPTION_MSG_GET_TOKEN_FAIL:
  62. result = "Failed to obtain token"
  63. case .EMAIL_VERIFY_CODE_KEY_ERROR:
  64. result = "Email code error"
  65. case .EMAIL_REGISTER_ERROR:
  66. result = "Register error"
  67. case .EXCEPTION_MSG_PASSWORD_ERROR:
  68. result = "Wrong password. You can check whether the letter is uppercase or lowercase."
  69. case .EXCEPTION_MSG_CODE_ACTION_ERROR:
  70. result = "Incorrect code"
  71. case .EXCEPTION_MSG_CODE_SEND_ERROR:
  72. result = "Code send error"
  73. case .EXCEPTION_MAIL_CODE_SEND_ERROR:
  74. result = "Mail send error"
  75. case .VERIFY_CODE_SEND_TOO_QUICKLY:
  76. result = "Enter an existing verification code" //result = "Too many codes sent, please try again later."
  77. case .EXCEPTION_MSG_EMAIL_EXIST:
  78. result = "This email is already registered, please log in."
  79. case .EXCEPTION_MSG_EMAIL_NOT_REGISTER:
  80. result = "This account is not registered, click Sign Up to create a new account."
  81. case .EXCEPTION_MSG_EMAIL_LOGOUT_ING:
  82. result = "Your account is currently being canceled and cannot be logged in. If you have any questions, please contact customer service."
  83. case .EXCEPTION_MSG_EMAIL_INVALID:
  84. result = "Please enter the correct email format"
  85. case .EXCEPTION_MSG_PASSWORD_NOT_INCONSISTENT:
  86. result = "Wrong password. You can check whether the letter is uppercase or lowercase." //result = "Passwords are different. Please re-enter them."
  87. case .EXCEPTION_MSG_PASSWORD_SIZE_MIN:
  88. result = "Password must be 6-24 characters" //result = "At least 6 characters"
  89. case .EXCEPTION_MSG_PASSWORD_SIZE_MAX:
  90. result = "Password must be 6-24 characters" //result = "Up to 24 characters"
  91. case .EXCEPTION_MSG_PLEASE_ADD_AUTH_CONFIG:
  92. result = "Please add auth config"
  93. case .EXCEPTION_MSG_USER_SUBSCRIPTION_IN_PROGRESS:
  94. result = "You are still in the subscription and cannot cancel account. Please click Cancel Account after the subscription period ends."
  95. case .EXCEPTION_MSG_USER_TRAIL_IN_PROGRESS:
  96. result = "You are still in the subscription and cannot cancel account. Please click Cancel Account after the trial expired."
  97. case .EXCEPTION_TIME_TRANSFER_ERROR:
  98. result = "Time conversion failure"
  99. case .EMAIL_VERIFY_CODE_KEY_ERROR2:
  100. result = "Email code error"
  101. case .EXCEPTION_MSG_PASSWORD_CONTAIN_EMRTY:
  102. result = "Spaces are not allowed in password" //result = "The password cannot contain Spaces"
  103. case .EXCEPTION_MSG_CREATE_ORDER_PARAMETER:
  104. result = "Abnormal payment method"
  105. case .EXCEPTION_MSG_EVENT_IS_CURRENTLY_NOT_SUPPORTED:
  106. result = "The current event is not supported"
  107. case .EXCEPTION_MSG_THE_ACCOUNT_IS_ALREADY_LOGGED_IN_ON_OTHER_DEVICES:
  108. result = "The account has been logged in to another device"
  109. case .EXCEPTION_MSG_ABNORMAL_USER_STATUS:
  110. result = "The current mailbox has been disabled or logged out"
  111. case .EXCEPTION_MSG_APP_STORE_TICKET_VALIDATION_FAILED:
  112. result = "当前邮箱已被停用或者处于注销中状态"
  113. case .EXCEPTION_MSG_APP_STORE_TICKET_VALIDATION_NEED_TO_RETRY:
  114. result = "AppStore票据验证失败"
  115. case .EXCEPTION_MSG_REPEAT_SUBSCRIPTION:
  116. result = "用户已订阅该产品"
  117. case .EXCEPTION_MSG_RESTORING_PURCHASES_IS_NOT_CURRENTLY_SUPPORTED:
  118. result = "恢复购买暂不支持"
  119. case .unknown:
  120. result = ""
  121. case .correct:
  122. result = ""
  123. default:
  124. result = "Network error"
  125. }
  126. return result
  127. }
  128. }
  129. enum KMVerifyCodeType: String, CaseIterable {
  130. case unknown = "" //
  131. case register = "user_register" // 注册
  132. case logOff = "user_log_off" //注销
  133. case resetPassword = "user_reset_password" //重置密码
  134. }
  135. enum KMVerifyEmailType: String, CaseIterable {
  136. case login = "1" // 登录
  137. case register = "2" //注册
  138. }
  139. struct Result {
  140. var result: NSDictionary = [:]
  141. var message: String = ""
  142. var code : Int = 200
  143. var error: NSError?
  144. }
  145. typealias KMRequestServerComplete = (_ success: Bool, _ result: Result?) -> Void
  146. class KMRequestServerManager: NSObject {
  147. static let manager = KMRequestServerManager()
  148. var loginAlert: NSAlert? = nil
  149. }
  150. //MARK: - 会员
  151. extension KMRequestServerManager {
  152. /**
  153. @abstract 获取验证码
  154. @param verifyCodeType 验证入口类型
  155. @param email 邮箱
  156. */
  157. func getVerifyCode(verifyCodeType: KMVerifyCodeType, email: String, complete: @escaping KMRequestServerComplete) {
  158. let urlString = KMLightMemberManager.manager.config.kServerURL + "/pdf-office-sso/auth/getVerifyCode"
  159. let params: [String: Any] = ["action": verifyCodeType.rawValue,
  160. "appId": "16",
  161. "receiver": email,
  162. "type": "0"]
  163. KMRequestServer.requestServer.request(urlString: urlString, method: .get, params: params) { requestSerializer in
  164. requestSerializer.setValue("Apifox/1.0.0 (https://www.apifox.cn)", forHTTPHeaderField: "User-Agent")
  165. } completion: { [unowned self] (task, responseObject, error) in
  166. let result = self.dealData(responseObject: responseObject as? NSDictionary, error: error)
  167. if result.code == 200 {
  168. complete(true, result)
  169. } else {
  170. complete(false, result)
  171. }
  172. }
  173. }
  174. /**
  175. @abstract 注册
  176. @param userName 用户账号(邮箱)
  177. @param verifyCode 验证码
  178. */
  179. func register(userName: String, password: String, verifyCode: String, complete: @escaping (_ success: Bool, _ requestData: KMLightMemberToken?, _ result: Result) -> Void) {
  180. let uuid: String = GetHardwareUUID() ?? ""
  181. let urlString = KMLightMemberManager.manager.config.kServerURL + "/pdf-office-sso/auth/emailRegister"
  182. let params: [String: Any] = ["appId": "16",
  183. "deviceSign": uuid,
  184. "password": password,
  185. "platformType": "0",
  186. "username": userName,
  187. "verifyCode": verifyCode,
  188. "model": "Mac"]
  189. KMRequestServer.requestServer.request(urlString: urlString, method: .post, params: params) { requestSerializer in
  190. requestSerializer.setValue("Apifox/1.0.0 (https://www.apifox.cn)", forHTTPHeaderField: "User-Agent")
  191. } completion: { [unowned self] task, responseObject, error in
  192. let result = self.dealData(responseObject: responseObject as? NSDictionary, error: error)
  193. if result.code == 200 {
  194. //解析数据
  195. KMLightMemberToken.parseData(data: result.result) { data in
  196. //登录成功
  197. KMLightMemberManager.manager.logIn()
  198. complete(true, data, result)
  199. }
  200. } else {
  201. complete(false, nil, result)
  202. }
  203. }
  204. }
  205. /**
  206. @abstract 注销
  207. @param verifyCode 验证码
  208. */
  209. func logOff(verifyCode: String, complete: @escaping KMRequestServerComplete) {
  210. let token: String = KMLightMemberManager.manager.token.access_token
  211. if token == "" {
  212. return
  213. }
  214. var urlString = KMLightMemberManager.manager.config.kServerURL + "/pdf-office-sso/user/logOffForUser"
  215. // let params = ["code":verifyCode]
  216. urlString = urlString + (NSString(format: "?code=%@&appId=%@", verifyCode, "16") as String)
  217. KMRequestServer.requestServer.request(urlString: urlString, method: .post, params: nil) { requestSerializer in
  218. requestSerializer.setValue("Apifox/1.0.0 (https://www.apifox.cn)", forHTTPHeaderField: "User-Agent")
  219. requestSerializer.setValue("Bearer " + token, forHTTPHeaderField: "Authorization")
  220. } completion: { [unowned self] (task, responseObject, error) in
  221. let result = self.dealData(responseObject: responseObject as? NSDictionary, error: error)
  222. if result.code == 200 {
  223. //登出
  224. KMLightMemberCache.cache.clean()
  225. KMLightMemberManager.manager.logOut()
  226. complete(true, result)
  227. } else {
  228. complete(false, result)
  229. }
  230. }
  231. }
  232. /**
  233. @abstract 登录
  234. @param email 邮箱
  235. @param password 密码
  236. */
  237. func login(email: String, password: String, complete: @escaping (_ success: Bool, _ requestData: KMLightMemberToken?, _ result: Result?) -> Void) {
  238. var urlString = KMLightMemberManager.manager.config.kServerURL + "/pdf-office-sso/auth/emailLogin"
  239. let uuid: String = GetHardwareUUID() ?? ""
  240. // let params: [String: String] = ["appId": "16",
  241. // "deviceSign": uuid,
  242. // "email": email,
  243. // "password": password,
  244. // "platformType": "0"]
  245. urlString = urlString + (NSString(format: "?appId=16&deviceSign=%@&email=%@&password=%@&platformType=0&model=%@", uuid, email, password, "Mac") as String)
  246. KMRequestServer.requestServer.request(urlString: urlString, method: .post, params: nil) { requestSerializer in
  247. requestSerializer.setValue("Apifox/1.0.0 (https://www.apifox.cn)", forHTTPHeaderField: "User-Agent")
  248. } completion: { [unowned self] (task, responseObject, error) in
  249. let result = self.dealData(responseObject: responseObject as? NSDictionary, error: error)
  250. if result.code == 200 {
  251. //解析数据
  252. KMLightMemberToken.parseData(data: result.result) { data in
  253. //登录成功
  254. KMLightMemberManager.manager.logIn()
  255. complete(true, data, nil)
  256. }
  257. } else {
  258. complete(false, nil, result)
  259. }
  260. }
  261. }
  262. /**
  263. @abstract 登出
  264. */
  265. func logout(complete: @escaping KMRequestServerComplete) {
  266. let token: String = KMLightMemberManager.manager.token.access_token
  267. if token == "" {
  268. return
  269. }
  270. let uuid: String = GetHardwareUUID() ?? ""
  271. var urlString = KMLightMemberManager.manager.config.kServerURL + "/pdf-office-sso/user/logout"
  272. // let params: [String: Any] = ["deviceSign": uuid,
  273. // "appId": "16"]
  274. urlString = urlString + (NSString(format: "?appId=16&deviceSign=%@", uuid) as String)
  275. KMRequestServer.requestServer.request(urlString: urlString, method: .post, params: nil) { requestSerializer in
  276. requestSerializer.setValue("Apifox/1.0.0 (https://www.apifox.cn)", forHTTPHeaderField: "User-Agent")
  277. requestSerializer.setValue("Bearer " + token, forHTTPHeaderField: "Authorization")
  278. } completion: { [unowned self] (task, responseObject, error) in
  279. //登出成功
  280. let result = self.dealData(responseObject: responseObject as? NSDictionary, error: error)
  281. if result.code == 200 {
  282. //登出
  283. KMLightMemberManager.manager.logOut()
  284. complete(true, result)
  285. } else {
  286. complete(false, result)
  287. }
  288. }
  289. }
  290. /**
  291. @abstract 修改密码
  292. @param url 源文件url
  293. @param data 数据
  294. @retrun document
  295. */
  296. func resetPassword(account: String, firstPassword: String, secondPassword: String, verifyCode: String, complete: @escaping KMRequestServerComplete) {
  297. let urlString = KMLightMemberManager.manager.config.kServerURL + "/pdf-office-sso/auth/resetPassword"
  298. let params: [String: Any] = ["account": account,
  299. "appId": "16",
  300. "firstPassword": firstPassword,
  301. "platformType": "0",
  302. "secondPassword": secondPassword,
  303. "verifyCode": verifyCode]
  304. KMRequestServer.requestServer.request(urlString: urlString, method: .post, params: params) { requestSerializer in
  305. requestSerializer.setValue("Apifox/1.0.0 (https://www.apifox.cn)", forHTTPHeaderField: "User-Agent")
  306. } completion: { [unowned self] (task, responseObject, error) in
  307. let result = self.dealData(responseObject: responseObject as? NSDictionary, error: error)
  308. if result.code == 200 {
  309. complete(true, result)
  310. } else {
  311. complete(false, result)
  312. }
  313. }
  314. }
  315. /**
  316. @abstract 获取用户信息
  317. */
  318. func getUserInfo(complete: @escaping (_ success: Bool, _ data: KMLightMemberUserInfo?, _ result: Result?, _ isLocal: Bool) -> Void) {
  319. let token: String = KMLightMemberManager.manager.token.access_token
  320. if token == "" {
  321. complete(false , nil, Result(message: "token 不存在", code: 304), false)
  322. return
  323. }
  324. //先拿缓存数据 再请求新数据
  325. let cacheData = KMLightMemberCache.cache.readData()
  326. if cacheData.count != 0 {
  327. KMLightMemberUserInfo.parseData(data: cacheData, needSave: false) { data in
  328. complete(true ,data, nil, true)
  329. }
  330. }
  331. let urlString = KMLightMemberManager.manager.config.kServerURL + "/pdf-office-sso/user/me"
  332. KMRequestServer.requestServer.request(urlString: urlString, method: .get, params: nil) { requestSerializer in
  333. requestSerializer.setValue("Apifox/1.0.0 (https://www.apifox.cn)", forHTTPHeaderField: "User-Agent")
  334. requestSerializer.setValue("Bearer " + token, forHTTPHeaderField: "Authorization")
  335. } completion: { [unowned self] (task, responseObject, error) in
  336. let result = self.dealData(responseObject: responseObject as? NSDictionary, error: error)
  337. if result.code == 200 {
  338. //解析数据
  339. KMLightMemberUserInfo.parseData(data: responseObject as! NSDictionary) { data in
  340. KMLightMemberManager.manager.reloadUserInfo()
  341. complete(true, data, nil, false)
  342. }
  343. } else {
  344. complete(false, nil, result, false)
  345. }
  346. }
  347. }
  348. func getUserInfo2() async throws -> (Bool, Result) {
  349. let token: String = KMLightMemberManager.manager.token.access_token
  350. if token == "" {
  351. return (false, Result())
  352. }
  353. if #available(macOS 10.15, *) {
  354. return try await withCheckedThrowingContinuation { continuation in
  355. let urlString = KMLightMemberManager.manager.config.kServerURL + "/pdf-office-sso/user/me"
  356. KMRequestServer.requestServer.request(urlString: urlString, method: .get, params: nil) { requestSerializer in
  357. requestSerializer.setValue("Apifox/1.0.0 (https://www.apifox.cn)", forHTTPHeaderField: "User-Agent")
  358. requestSerializer.setValue("Bearer " + token, forHTTPHeaderField: "Authorization")
  359. } completion: { [unowned self] (task, responseObject, error) in
  360. let result = self.dealData(responseObject: responseObject as? NSDictionary, error: error)
  361. DispatchQueue.main.async {
  362. if result.code == 200 {
  363. //解析数据
  364. KMLightMemberUserInfo.parseData(data: responseObject as! NSDictionary) { data in
  365. KMLightMemberManager.manager.reloadUserInfo()
  366. continuation.resume(returning: (true, result))
  367. }
  368. } else {
  369. continuation.resume(returning: (false, result))
  370. }
  371. }
  372. }
  373. }
  374. } else {
  375. // Fallback on earlier versions
  376. return (true, Result())
  377. }
  378. }
  379. /**
  380. @abstract 验证码验证是否正确
  381. @param account 用户账号(邮箱)
  382. @param verifyCode 验证码
  383. @retrun verifyCodeType 验证码入口类型
  384. */
  385. func verificationCode(account: String, verifyCode: String, verifyCodeType: KMVerifyCodeType, complete: @escaping KMRequestServerComplete) {
  386. let urlString = KMLightMemberManager.manager.config.kServerURL + "/pdf-office-sso/auth/isEmailCodeValid"
  387. let params: [String: Any] = ["account": account,
  388. "code": verifyCode,
  389. "type": verifyCodeType.rawValue,
  390. "appId": "16"]
  391. KMRequestServer.requestServer.request(urlString: urlString, method: .get, params: params) { requestSerializer in
  392. requestSerializer.setValue("Apifox/1.0.0 (https://www.apifox.cn)", forHTTPHeaderField: "User-Agent")
  393. } completion: { [unowned self] (task, responseObject, error) in
  394. let result = self.dealData(responseObject: responseObject as? NSDictionary, error: error)
  395. if result.code == 200 {
  396. complete(true, result)
  397. } else {
  398. complete(false, result)
  399. }
  400. }
  401. }
  402. /**
  403. @abstract 邮箱验证
  404. @param account 用户账号(邮箱)
  405. @param verifyCodeType 验证码
  406. @retrun verifyCodeType 验证码入口类型
  407. */
  408. func verificationEmail(userName: String, verifyEmailType: KMVerifyEmailType, complete: @escaping KMRequestServerComplete) {
  409. let urlString = KMLightMemberManager.manager.config.kServerURL + "/pdf-office-sso/auth/validUser"
  410. let params: [String: Any] = ["appId": "16",
  411. "username": userName,
  412. "platformType": "0",
  413. "validType": verifyEmailType.rawValue]
  414. KMRequestServer.requestServer.request(urlString: urlString, method: .post, params: params) { requestSerializer in
  415. requestSerializer.setValue("Apifox/1.0.0 (https://www.apifox.cn)", forHTTPHeaderField: "User-Agent")
  416. } completion: { [unowned self] (task, responseObject, error) in
  417. let result = self.dealData(responseObject: responseObject as? NSDictionary, error: error)
  418. if result.code == 200 {
  419. complete(true, result)
  420. } else {
  421. complete(false, result)
  422. }
  423. }
  424. }
  425. }
  426. //MARK: - 订阅
  427. extension KMRequestServerManager {
  428. func createOrder(productId: String, userId: String, complete: @escaping (_ success: Bool, _ orderId: String?, _ result: Result?) -> Void) {
  429. let urlString = KMLightMemberManager.manager.config.kServerURL + "/pdf-office-website/pay/appStoreCreateOrder"
  430. let params: [String: Any] = ["productId": productId,
  431. "paymentMethod": "APPLE_PAY",
  432. "userId": userId,
  433. "appId": "16"]
  434. let token: String = KMLightMemberManager.manager.token.access_token
  435. if token == "" {
  436. complete(false, "", Result())
  437. return
  438. }
  439. KMRequestServer.requestServer.request(urlString: urlString, method: .post, params: params) { requestSerializer in
  440. requestSerializer.setValue("Apifox/1.0.0 (https://www.apifox.cn)", forHTTPHeaderField: "User-Agent")
  441. requestSerializer.setValue("Bearer " + token, forHTTPHeaderField: "Authorization")
  442. } completion: { [unowned self] (task, responseObject, error) in
  443. let result = self.dealData(responseObject: responseObject as? NSDictionary, error: error)
  444. if result.code == 200 {
  445. complete(true, result.result["id"] as! String, result)
  446. } else {
  447. complete(false, "", result)
  448. }
  449. }
  450. }
  451. func restore(productId: String, userId: String, complete: @escaping (_ success: Bool, _ orderId: String?, _ result: Result?) -> Void) {
  452. let urlString = KMLightMemberManager.manager.config.kServerURL + "/pdf-office-website/pay/appStoreCreateOrder"
  453. let params: [String: Any] = ["productId": productId,
  454. "paymentMethod": "APPLE_PAY",
  455. "userId": userId,
  456. "appId": "16"]
  457. let token: String = KMLightMemberManager.manager.token.access_token
  458. if token == "" {
  459. complete(false, "", Result())
  460. return
  461. }
  462. KMRequestServer.requestServer.request(urlString: urlString, method: .post, params: params) { requestSerializer in
  463. requestSerializer.setValue("Apifox/1.0.0 (https://www.apifox.cn)", forHTTPHeaderField: "User-Agent")
  464. requestSerializer.setValue("Bearer " + token, forHTTPHeaderField: "Authorization")
  465. } completion: { [unowned self] (task, responseObject, error) in
  466. let result = self.dealData(responseObject: responseObject as? NSDictionary, error: error)
  467. if result.code == 200 {
  468. complete(true, result.result["id"] as! String, result)
  469. } else {
  470. complete(false, "", result)
  471. }
  472. }
  473. }
  474. func parseVerification(applePayProductId: String, orderId: String, receipt: String, restore: Int = 0, complete: @escaping KMRequestServerComplete) {
  475. let urlString = KMLightMemberManager.manager.config.kServerURL + "/pdf-office-website/pay/appStoreOrderSucceed"
  476. let params: [String: Any] = ["applePayProductId": applePayProductId,
  477. "orderId": orderId,
  478. "receipt": receipt,
  479. "restore": restore]
  480. KMPrint("二次验证上传数据:\(params)")
  481. let token: String = KMLightMemberManager.manager.token.access_token
  482. if token == "" {
  483. complete(false, Result())
  484. return
  485. }
  486. KMRequestServer.requestServer.request(urlString: urlString, method: .post, params: params) { requestSerializer in
  487. requestSerializer.setValue("Apifox/1.0.0 (https://www.apifox.cn)", forHTTPHeaderField: "User-Agent")
  488. requestSerializer.setValue("Bearer " + token, forHTTPHeaderField: "Authorization")
  489. } completion: { [unowned self] (task, responseObject, error) in
  490. let result = self.dealData(responseObject: responseObject as? NSDictionary, error: error)
  491. if result.code == 200 {
  492. complete(true, result)
  493. } else {
  494. complete(false, result)
  495. }
  496. }
  497. }
  498. func checkDeviceStatus(complete: @escaping KMRequestServerComplete) {
  499. var urlString = KMLightMemberManager.manager.config.kServerURL + "/pdf-office-sso/auth/checkDeviceStatus"
  500. let uuid: String = GetHardwareUUID() ?? ""
  501. // let params: [String: Any] = ["appId": "16",
  502. // "deviceSign": uuid]
  503. urlString = urlString + (NSString(format: "?appId=16&deviceSign=%@", uuid) as String)
  504. KMRequestServer.requestServer.request(urlString: urlString, method: .post, params: nil) { requestSerializer in
  505. requestSerializer.setValue("Apifox/1.0.0 (https://www.apifox.cn)", forHTTPHeaderField: "User-Agent")
  506. } completion: { [unowned self] (task, responseObject, error) in
  507. let result = self.dealData(responseObject: responseObject as? NSDictionary, error: error)
  508. if result.code == 200 {
  509. complete(true, result)
  510. } else {
  511. complete(false, result)
  512. }
  513. }
  514. }
  515. }
  516. //MARK: - 数据处理
  517. extension KMRequestServerManager {
  518. func dealData(responseObject: NSDictionary?, error: NSError?) -> Result {
  519. var dic: NSDictionary = [:]
  520. if (error == nil && responseObject != nil) {
  521. dic = responseObject!
  522. } else {
  523. var info = responseObject
  524. if (error != nil) {
  525. let data = error!.userInfo["com.alamofire.serialization.response.error.data"]
  526. if (data != nil) {
  527. info = try?JSONSerialization.jsonObject(with: data as? Data ?? Data(), options: JSONSerialization.ReadingOptions.mutableLeaves) as? NSDictionary
  528. }
  529. dic = info ?? [:]
  530. }
  531. }
  532. let result: NSDictionary = dic["result"] as? NSDictionary ?? [:]
  533. var code: Int = dic["code"] as? Int ?? 0
  534. let message: String = dic["msg"] as? String ?? "unknown error"
  535. let error = NSError(domain: message, code: code)
  536. if result.count == 0 && responseObject != nil && code == 0 {
  537. code = 200
  538. }
  539. if code == 318 {
  540. DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.1, execute: {
  541. let alert = NSAlert()
  542. alert.messageText = NSLocalizedString("Unable to Log in", comment: "")
  543. alert.informativeText = NSLocalizedString("Your account is currently being canceled and cannot be logged in. If you have any questions, please contact us at support@pdfreaderpro.com", comment: "")
  544. alert.addButton(withTitle: NSLocalizedString("Contact Us", comment: ""))
  545. alert.addButton(withTitle: NSLocalizedString("Cancel", comment: ""))
  546. var window = NSApp.mainWindow
  547. if NSApp.mainWindow?.sheets.first != nil {
  548. window = NSApp.mainWindow?.sheets.first
  549. }
  550. if window != nil {
  551. alert.beginSheetModal(for: window!) { result in
  552. if (result == .alertFirstButtonReturn) {
  553. // KMMailHelper.newEmail(withContacts: "support@pdfreaderpro.com", andSubjects: "")
  554. // NSWorkspace.shared.launchApplication("Mailto:support@pdfreaderpro.com")
  555. // NSWorkspace.shared.open(URL(string: "mailto:support@pdfreaderpro.com")!)
  556. NSWorkspace.shared.open(URL(string: "https://www.pdfreaderpro.com/contact")!)
  557. // let service = NSSharingService(named: NSSharingService.Name.composeEmail)
  558. // service?.recipients = ["support@pdfreaderpro.com"]
  559. // service?.subject = "Test Mail"
  560. // service?.perform(withItems: ["Test Mail body"])
  561. } else if result == .alertSecondButtonReturn {
  562. return
  563. }
  564. }
  565. }
  566. })
  567. }
  568. if code == 304 {
  569. self.checkDeviceStatus { success, result in
  570. }
  571. }
  572. if code == 330 {
  573. DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.2, execute: { [unowned self] in
  574. if loginAlert == nil {
  575. loginAlert = NSAlert()
  576. loginAlert?.messageText = NSLocalizedString("请重新登录", comment: "")
  577. loginAlert?.informativeText = NSLocalizedString("您的账号已在其他设备登录,若非本人操作,请尽快修改您的账号密码", comment: "")
  578. loginAlert?.addButton(withTitle: NSLocalizedString("登录", comment: ""))
  579. loginAlert?.addButton(withTitle: NSLocalizedString("取消", comment: ""))
  580. var window = NSApp.mainWindow
  581. if NSApp.mainWindow?.sheets.first != nil {
  582. window = NSApp.mainWindow?.sheets.first
  583. }
  584. if window != nil {
  585. loginAlert?.beginSheetModal(for: window!) { result in
  586. if (result == .alertFirstButtonReturn) {
  587. if KMLoginWindowController.fetchSampleController() == nil {
  588. KMLoginWindowController.show(window: window!)
  589. }
  590. } else if result == .alertSecondButtonReturn {
  591. self.loginAlert = nil
  592. return
  593. }
  594. self.loginAlert = nil
  595. }
  596. } else {
  597. self.loginAlert = nil
  598. }
  599. }
  600. })
  601. }
  602. // if code == 500 {
  603. // let alert = NSAlert()
  604. // alert.messageText = NSLocalizedString(message, comment: "")
  605. // alert.addButton(withTitle: NSLocalizedString("Cancel", comment: ""))
  606. // if NSApp.mainWindow != nil {
  607. // alert.beginSheetModal(for: NSApp.mainWindow!)
  608. // } else {
  609. // alert.runModal()
  610. // }
  611. // }
  612. KMPrint(dic)
  613. return Result(result: result,message: message,code: code, error: error)
  614. }
  615. }
  616. //MARK: - AI
  617. extension KMRequestServerManager {
  618. /**
  619. @abstract 翻译上传
  620. @param file 文件路径
  621. @param version 版本号
  622. */
  623. func aiTranslationFileUpload(file: String, version: String, complete: @escaping KMRequestServerComplete) {
  624. let infoDictionary = Bundle .main.infoDictionary!
  625. let userInfo = KMLightMemberCache.cache.readData(type: .info)
  626. let majorVersion = infoDictionary["CFBundleShortVersionString"]
  627. let urlString = KMAIServerConfig().aiTranslationURL + "/v1/translate/fileUpload"
  628. let fileData = FileManager.default.contents(atPath: file)
  629. let params: [String: Any] = ["file": fileData,
  630. "projectId": "2",
  631. "version": version,
  632. "userId": userInfo["id"] as Any]
  633. KMRequestServer.requestServer.aiTranslation(urlString: urlString, params: params) { formData in
  634. let fileURL = URL(fileURLWithPath: file)
  635. try? formData.appendPart(withFileURL: fileURL, name: "file", fileName: fileURL.lastPathComponent, mimeType: "application/octet-stream")
  636. } requestSerializer: { requestSerializer in
  637. requestSerializer.setValue("Apifox/1.0.0 (https://www.apifox.cn)", forHTTPHeaderField: "User-Agent")
  638. } completion: { task, responseObject, error in
  639. if responseObject != nil {
  640. let data: NSDictionary = responseObject!["data"] as? NSDictionary ?? [:]
  641. let code: String = responseObject!["code"] as? String ?? "06005"
  642. let message: String = responseObject!["msg"] as? String ?? "unknown error"
  643. let error = NSError(domain: message, code: Int(code)!)
  644. let result = Result(result: data,message: message,code: Int(code)!, error: error)
  645. if result.code == 200 {
  646. complete(true, result)
  647. } else {
  648. complete(false, result)
  649. }
  650. } else {
  651. let error = NSError(domain: "unknown error", code: 404)
  652. let result = Result(result: [:],message: "unknown error",code: 404, error: error)
  653. complete(false, result)
  654. }
  655. }
  656. }
  657. /**
  658. @abstract 文件翻译
  659. @param fileKey 文件Key
  660. @param from 初始语言
  661. @param to 结束语言
  662. @param version 应用版本
  663. */
  664. func aiTranslationFileTranslateHandle(fileKey: String, from: String, to: String, version: String, complete: @escaping KMRequestServerComplete) {
  665. let infoDictionary = Bundle .main.infoDictionary!
  666. let userInfo = KMLightMemberCache.cache.readData(type: .info)
  667. let majorVersion = infoDictionary["CFBundleShortVersionString"]
  668. let urlString = KMAIServerConfig().aiTranslationURL + "/v1/translate/fileTranslateHandle"
  669. var semaphore = DispatchSemaphore (value: 0)
  670. let parameters = String(format: "{\r\n \"fileKey\": \"%@\",\r\n \"from\": \"%@\",\r\n \"to\": \"%@\",\r\n \"version\": \"%@\",\r\n \"projectId\": \"2\",\r\n \"userId\": \"%@\"\r\n}", fileKey, from, to, version, userInfo["id"] as! String)
  671. let postData = parameters.data(using: .utf8)
  672. var request = URLRequest(url: URL(string: urlString)!,timeoutInterval: Double.infinity)
  673. request.addValue("Apifox/1.0.0 (https://www.apifox.cn)", forHTTPHeaderField: "User-Agent")
  674. request.addValue("application/json", forHTTPHeaderField: "Content-Type")
  675. request.httpMethod = "POST"
  676. request.httpBody = postData
  677. let task = URLSession.shared.dataTask(with: request) { data, response, error in
  678. guard let data = data else {
  679. KMPrint(String(describing: error))
  680. semaphore.signal()
  681. return
  682. }
  683. let jsonObject = try? JSONSerialization.jsonObject(with: data, options: []) as? NSDictionary ?? [:]
  684. if jsonObject != nil {
  685. let data1: NSDictionary = jsonObject!["data"] as? NSDictionary ?? [:]
  686. let code: String = jsonObject!["code"] as? String ?? "06005"
  687. let message: String = jsonObject!["msg"] as? String ?? "unknown error"
  688. let error = NSError(domain: message, code: Int(code)!)
  689. let result = Result(result: data1,message: message,code: Int(code)!, error: error)
  690. if result.code == 200 {
  691. complete(true, result)
  692. } else {
  693. complete(false, result)
  694. }
  695. } else {
  696. let error = NSError(domain: "unknown error", code: 404)
  697. let result = Result(result: [:],message: "unknown error",code: 404, error: error)
  698. complete(false, result)
  699. }
  700. semaphore.signal()
  701. }
  702. task.resume()
  703. semaphore.wait()
  704. }
  705. /**
  706. @abstract 内容翻译
  707. @param q 选中
  708. @param from 初始语言
  709. @param to 结束语言
  710. @param version 应用版本
  711. */
  712. func aiTranslationTextTrans(q: String, from: String, to: String, version: String, complete: @escaping KMRequestServerComplete) {
  713. let infoDictionary = Bundle .main.infoDictionary!
  714. let userInfo = KMLightMemberCache.cache.readData(type: .info)
  715. let majorVersion = infoDictionary["CFBundleShortVersionString"]
  716. let urlString = KMAIServerConfig().aiTranslationURL + "/v1/translate/textTrans"
  717. var semaphore = DispatchSemaphore (value: 0)
  718. var escapedString = q
  719. if q.contains("\n") || q.contains("\r") {
  720. escapedString = q.replacingOccurrences(of: "\n", with: "\\n")
  721. escapedString = escapedString.replacingOccurrences(of: "\r", with: "\\r")
  722. } else if q.contains("\u{2028}") {
  723. }
  724. escapedString = String(data: escapedString.data(using: .utf8)!, encoding: .utf8)!
  725. // let escapedString = String(data: q.data(using: .utf8)!, encoding: .utf8)!
  726. let parameters = String(format: "{\r\n \"q\": \"%@\",\r\n \"from\": \"%@\",\r\n \"to\": \"%@\",\r\n \"version\": \"%@\",\r\n \"projectId\": \"2\",\r\n \"userId\": \"%@\"\r\n}", escapedString, from, to, version, userInfo["id"] as! String)
  727. let postData = parameters.data(using: .utf8)
  728. var request = URLRequest(url: URL(string: urlString)!,timeoutInterval: Double.infinity)
  729. request.addValue("Apifox/1.0.0 (https://www.apifox.cn)", forHTTPHeaderField: "User-Agent")
  730. request.addValue("application/json", forHTTPHeaderField: "Content-Type")
  731. request.httpMethod = "POST"
  732. request.httpBody = postData
  733. let task = URLSession.shared.dataTask(with: request) { data, response, error in
  734. guard let data = data else {
  735. KMPrint(String(describing: error))
  736. semaphore.signal()
  737. return
  738. }
  739. let jsonObject = try? JSONSerialization.jsonObject(with: data, options: []) as? NSDictionary ?? [:]
  740. if jsonObject != nil {
  741. let data1: NSDictionary = jsonObject!["data"] as? NSDictionary ?? [:]
  742. let code: String = jsonObject!["code"] as? String ?? "06005"
  743. let message: String = jsonObject!["msg"] as? String ?? "unknown error"
  744. let error = NSError(domain: message, code: Int(code)!)
  745. let result = Result(result: data1,message: message,code: Int(code)!, error: error)
  746. if result.code == 200 {
  747. complete(true, result)
  748. } else {
  749. complete(false, result)
  750. }
  751. } else {
  752. let error = NSError(domain: "unknown error", code: 404)
  753. let result = Result(result: [:],message: "unknown error",code: 404, error: error)
  754. complete(false, result)
  755. }
  756. semaphore.signal()
  757. }
  758. task.resume()
  759. semaphore.wait()
  760. }
  761. /**
  762. @abstract重写 & 纠错
  763. @param content 内容
  764. @param version 版本号
  765. */
  766. func aiRewriting(content: String, version: String, state: KMAIRewritingState, complete: @escaping KMRequestServerComplete) {
  767. let userInfo = KMLightMemberCache.cache.readData(type: .info)
  768. var urlString = KMAIServerConfig().aiRewritingURL + "/api/rewrite"
  769. if state == .AIErrorCorrection {
  770. urlString = KMAIServerConfig().aiRewritingURL + "/api/correct-typos"
  771. }
  772. let params: [String: Any] = ["project_id": 2,
  773. "content": content,
  774. "version": version,
  775. "user_id": userInfo["id"] as Any]
  776. KMRequestServer.requestServer.aiRewriting(urlString: urlString, params: params) { formData in
  777. } requestSerializer: { requestSerializer in
  778. requestSerializer.setValue("Apifox/1.0.0 (https://www.apifox.cn)", forHTTPHeaderField: "User-Agent")
  779. } completion: { task, responseObject, error in
  780. if responseObject != nil {
  781. let data: NSDictionary = responseObject!["data"] as? NSDictionary ?? [:]
  782. let code: String = responseObject!["code"] as? String ?? "06005"
  783. let message: String = responseObject!["message"] as? String ?? "unknown error"
  784. let error = NSError(domain: message, code: Int(code)!)
  785. let result = Result(result: data,message: message,code: Int(code)!, error: error)
  786. if result.code == 200 {
  787. complete(true, result)
  788. } else {
  789. complete(false, result)
  790. }
  791. } else {
  792. let error = NSError(domain: "unknown error", code: 404)
  793. let result = Result(result: [:],message: "unknown error",code: 404, error: error)
  794. complete(false, result)
  795. }
  796. }
  797. }
  798. }