KMRequestServerManager.swift 41 KB

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