KMPurchaseEmbeddedWindowController.swift 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305
  1. //
  2. // KMPurchaseEmbeddedWindowController.swift
  3. // PDF Reader Pro
  4. //
  5. // Created by wanjun on 2024/8/29.
  6. //
  7. import Cocoa
  8. class KMPurchaseEmbeddedWindowController: NSWindowController {
  9. override func windowDidLoad() {
  10. super.windowDidLoad()
  11. // Implement this method to handle any initialization after your window controller's window has been loaded from its nib file.
  12. #if DEBUG
  13. let btn = NSButton()
  14. let wh: CGFloat = 100
  15. let x = (NSWidth(self.window?.frame ?? .zero) - wh) * 0.5
  16. let y = (NSHeight(self.window?.frame ?? .zero) - wh) * 0.5
  17. btn.frame = NSMakeRect(x, y, wh, wh)
  18. btn.target = self
  19. btn.action = #selector(btnAction)
  20. self.window?.contentView?.addSubview(btn)
  21. #endif
  22. }
  23. override func showWindow(_ sender: Any?) {
  24. NSApp.runModal(for: self.window!)
  25. }
  26. @objc func btnAction() {
  27. // self.subscriptions()
  28. self.retrieval()
  29. }
  30. func getPriceUrl() {
  31. }
  32. func retrieval() {
  33. let urlString = kVerificationServer + "/api/coupons/retrieval"
  34. let productCode = "com.brother.pdfreaderpro.windows.product_1"
  35. let app_code = MainBundle.km_infoDictionary()?["CFBundleIdentifier"] ?? ""
  36. let params = [
  37. // 优惠卷id
  38. "code" : "E85B-9C31-6EAB",
  39. "app_code" : app_code,
  40. "product_code" : productCode]
  41. KMAdvertisementRequestServer.requestServer.request(urlString: urlString, method: "GET", params: params) { [self] task, responseObject, error in
  42. if (error == nil && responseObject != nil) {
  43. let array = responseObject?["data"] as? NSDictionary
  44. if array != nil {
  45. //解析数据
  46. print("开始解析数据")
  47. for model in array as! [NSDictionary] {
  48. let jsonString: String = (model["detail"] as? String) ?? ""
  49. let jsonData: Data = jsonString.data(using: .utf8)!
  50. let dict = try?JSONSerialization.jsonObject(with: jsonData)
  51. // infoDict = dict as! NSDictionary
  52. }
  53. } else {
  54. print("解析数据失败array")
  55. // completion(nil, responseObject, error)
  56. }
  57. } else {
  58. print("解析数据失败数据不存在")
  59. // completion(nil, responseObject, error)
  60. }
  61. }
  62. }
  63. func getOrderStatus(trade_no: String) {
  64. let urlString = kVerificationServer + "/api/orders/getOrderStatus"
  65. // 升级产品
  66. let paraDict = ["token" : trade_no]
  67. var postData = try! JSONSerialization.data(withJSONObject: paraDict)
  68. var request = URLRequest(url: URL(string: urlString)!,timeoutInterval: Double.infinity)
  69. request.addValue("Apifox/1.0.0 (https://www.apifox.cn)", forHTTPHeaderField: "User-Agent")
  70. request.addValue("application/json", forHTTPHeaderField: "Content-Type")
  71. request.httpMethod = "POST"
  72. request.httpBody = postData
  73. let task = URLSession.shared.dataTask(with: request) { data, response, error in
  74. guard let data = data else {
  75. print(String(describing: error))
  76. return
  77. }
  78. let jsonObject = try? JSONSerialization.jsonObject(with: data, options: []) as? NSDictionary ?? [:]
  79. if jsonObject != nil {
  80. let data1: NSDictionary = jsonObject!["data"] as? NSDictionary ?? [:]
  81. let subscriptionInfo = data1.object(forKey: "subscription") as? NSDictionary
  82. let paypal_order_info = subscriptionInfo?.object(forKey: "paypal_order") as? NSDictionary
  83. if let dataInfo = paypal_order_info, dataInfo.count > 0 {
  84. // paypal_order
  85. // page_pay_url 链接
  86. // https://www.sandbox.paypal.com/cgi-bin/webscr?cmd=_express-checkout&token=EC-3V503434MD108282U
  87. // trade_no 订单id 用于校验订单 【22024083006591098】
  88. let trade_no = dataInfo.object(forKey: "trade_no")
  89. let page_pay_url = dataInfo.object(forKey: "page_pay_url")
  90. KMPrint("trade_no:" + "\(trade_no)" + ";" + "page_pay_url:" + "\(page_pay_url)")
  91. } else {
  92. // 数据错误
  93. }
  94. } else {
  95. // 数据错误
  96. }
  97. }
  98. task.resume()
  99. }
  100. func subscriptions() {
  101. let urlString = kVerificationServer + "/api/subscriptions"
  102. // 升级产品
  103. let productCode = "com.brother.pdfreaderpro.windows.product_1"
  104. let app_code = MainBundle.km_infoDictionary()?["CFBundleIdentifier"] ?? ""
  105. let paraDict = ["data" :
  106. ["product_code": productCode,
  107. "app_code": app_code,
  108. // 购买数量
  109. "amount": "1",
  110. // 优惠卷id
  111. "coupon_code": "",
  112. // 支付类型 paypal alipay wxpay paddle
  113. "payment": "paypal",
  114. // 地区
  115. "customer_country": "US",
  116. // 邮编码
  117. "customer_postcode" : "20001",
  118. "unique_sn" : uuid(),
  119. // 序列码 标准包 升级 高级包 需要
  120. "upgrade_cdkey" : "",
  121. "email" : "tangchao@kdanmobile.com",
  122. // 用户名
  123. "contact_name" : uuid()]]
  124. var postData = try! JSONSerialization.data(withJSONObject: paraDict)
  125. var request = URLRequest(url: URL(string: urlString)!,timeoutInterval: Double.infinity)
  126. request.addValue("Apifox/1.0.0 (https://www.apifox.cn)", forHTTPHeaderField: "User-Agent")
  127. request.addValue("application/json", forHTTPHeaderField: "Content-Type")
  128. request.httpMethod = "POST"
  129. request.httpBody = postData
  130. let task = URLSession.shared.dataTask(with: request) { data, response, error in
  131. guard let data = data else {
  132. print(String(describing: error))
  133. return
  134. }
  135. let jsonObject = try? JSONSerialization.jsonObject(with: data, options: []) as? NSDictionary ?? [:]
  136. if jsonObject != nil {
  137. let data1: NSDictionary = jsonObject!["data"] as? NSDictionary ?? [:]
  138. let subscriptionInfo = data1.object(forKey: "subscription") as? NSDictionary
  139. let paypal_order_info = subscriptionInfo?.object(forKey: "paypal_order") as? NSDictionary
  140. if let dataInfo = paypal_order_info, dataInfo.count > 0 {
  141. // paypal_order
  142. // page_pay_url 链接
  143. // https://www.sandbox.paypal.com/cgi-bin/webscr?cmd=_express-checkout&token=EC-3V503434MD108282U
  144. // trade_no 订单id 用于校验订单 【22024083006591098】
  145. let trade_no = dataInfo.object(forKey: "trade_no")
  146. let page_pay_url = dataInfo.object(forKey: "page_pay_url")
  147. KMPrint("trade_no:" + "\(trade_no)" + ";" + "page_pay_url:" + "\(page_pay_url)")
  148. DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
  149. self.getOrderStatus(trade_no: trade_no as? String ?? "")
  150. }
  151. } else {
  152. // 数据错误
  153. }
  154. } else {
  155. // 数据错误
  156. }
  157. }
  158. task.resume()
  159. }
  160. // MARK: Private
  161. private func uuid() -> String {
  162. return GetHardwareUUID()!
  163. }
  164. private func platform() -> String {
  165. var platform = "DMG"
  166. #if VERSION_DMG
  167. platform = "DMG"
  168. #else
  169. platform = "AiStore"
  170. #endif
  171. return platform
  172. }
  173. private func app_name() -> String {
  174. var bundleID: String!
  175. bundleID = Bundle.main.object(forInfoDictionaryKey: "CFBundleIdentifier") as! String
  176. return bundleID;
  177. }
  178. }
  179. // /api/coupons/retrieval
  180. /*
  181. ▿ Optional<AnyObject>
  182. ▿ some : 2 elements
  183. ▿ 0 : 2 elements
  184. - key : app_code
  185. - value : com.brother.pdfreaderprofree.windows
  186. ▿ 1 : 2 elements
  187. - key : data
  188. ▿ value : 12 elements
  189. ▿ 0 : 2 elements
  190. - key : id
  191. - value : 5851c5d6-f43e-32b2-8660-a6222194fee4
  192. ▿ 1 : 2 elements
  193. - key : discount
  194. - value : <null>
  195. ▿ 2 : 2 elements
  196. - key : member
  197. ▿ value : 2 elements
  198. ▿ 0 : 2 elements
  199. - key : email
  200. - value : sec-2@drmail.in
  201. ▿ 1 : 2 elements
  202. - key : full_name
  203. - value : test-nilvbo2
  204. ▿ 3 : 2 elements
  205. - key : coupon_provider
  206. ▿ value : 15 elements
  207. ▿ 0 : 2 elements
  208. - key : id
  209. - value : 291
  210. ▿ 1 : 2 elements
  211. - key : category
  212. - value : presented
  213. ▿ 2 : 2 elements
  214. - key : start_date
  215. - value : <null>
  216. ▿ 3 : 2 elements
  217. - key : limit_product
  218. - value : 0
  219. ▿ 4 : 2 elements
  220. - key : total_amount
  221. - value : 59502
  222. ▿ 5 : 2 elements
  223. - key : rcode
  224. - value :
  225. ▿ 6 : 2 elements
  226. - key : end_date
  227. - value : <null>
  228. ▿ 7 : 2 elements
  229. - key : created_at
  230. - value : 2024-05-24 07:20:21
  231. ▿ 8 : 2 elements
  232. - key : discount
  233. - value : <null>
  234. ▿ 9 : 2 elements
  235. - key : limit_product_code
  236. - value :
  237. ▿ 10 : 2 elements
  238. - key : minimum_charge
  239. - value : 59.99
  240. ▿ 11 : 2 elements
  241. - key : price
  242. - value : 15
  243. ▿ 12 : 2 elements
  244. - key : valid_period
  245. - value : 336.hours
  246. ▿ 13 : 2 elements
  247. - key : product_id
  248. - value : 15
  249. ▿ 14 : 2 elements
  250. - key : received_amount
  251. - value : 39
  252. ▿ 4 : 2 elements
  253. - key : expire_date
  254. - value : 1718857051
  255. ▿ 5 : 2 elements
  256. - key : created_at
  257. - value : 2024-06-06 04:17:31
  258. ▿ 6 : 2 elements
  259. - key : source_type
  260. - value : event
  261. ▿ 7 : 2 elements
  262. - key : minimum_charge
  263. - value : 59.99
  264. ▿ 8 : 2 elements
  265. - key : price
  266. - value : 15
  267. ▿ 9 : 2 elements
  268. - key : coupon_provider_id
  269. - value : 291
  270. ▿ 10 : 2 elements
  271. - key : code
  272. - value : E85B-9C31-6EAB
  273. ▿ 11 : 2 elements
  274. - key : status
  275. - value : expired
  276. */