瀏覽代碼

弹窗接口对接,购买相关接口对接。

wangjian 1 年之前
父節點
當前提交
738a1252d3
共有 70 個文件被更改,包括 3947 次插入77 次删除
  1. 8 8
      Pods/Pods.xcodeproj/xcuserdata/apple.xcuserdatad/xcschemes/xcschememanagement.plist
  2. 126 0
      双子星云手机.xcodeproj/project.pbxproj
  3. 二進制
      双子星云手机.xcworkspace/xcuserdata/apple.xcuserdatad/UserInterfaceState.xcuserstate
  4. 18 0
      双子星云手机.xcworkspace/xcuserdata/apple.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist
  5. 38 0
      双子星云手机/AppDelegate/AppDelegate.m
  6. 5 0
      双子星云手机/AppDelegate/Config/ColorDefine.h
  7. 5 0
      双子星云手机/AppDelegate/Config/Const.h
  8. 5 0
      双子星云手机/AppDelegate/Config/Const.m
  9. 9 0
      双子星云手机/AppDelegate/Config/Notification.h
  10. 3 0
      双子星云手机/AppDelegate/PrefixHeader.pch
  11. 92 10
      双子星云手机/AppDelegate/SceneDelegate.m
  12. 22 0
      双子星云手机/Assets.xcassets/Buy/buy_copy.imageset/Contents.json
  13. 二進制
      双子星云手机/Assets.xcassets/Buy/buy_copy.imageset/编组 2@2x.png
  14. 二進制
      双子星云手机/Assets.xcassets/Buy/buy_copy.imageset/编组 2@3x.png
  15. 22 0
      双子星云手机/Assets.xcassets/Buy/buy_pay_faile.imageset/Contents.json
  16. 二進制
      双子星云手机/Assets.xcassets/Buy/buy_pay_faile.imageset/编组 5@2x.png
  17. 二進制
      双子星云手机/Assets.xcassets/Buy/buy_pay_faile.imageset/编组 5@3x.png
  18. 22 0
      双子星云手机/Assets.xcassets/Buy/buy_pay_success.imageset/Contents.json
  19. 二進制
      双子星云手机/Assets.xcassets/Buy/buy_pay_success.imageset/编组 2@2x.png
  20. 二進制
      双子星云手机/Assets.xcassets/Buy/buy_pay_success.imageset/编组 2@3x.png
  21. 22 0
      双子星云手机/Assets.xcassets/Buy/buy_paying.imageset/Contents.json
  22. 二進制
      双子星云手机/Assets.xcassets/Buy/buy_paying.imageset/编组@2x.png
  23. 二進制
      双子星云手机/Assets.xcassets/Buy/buy_paying.imageset/编组@3x.png
  24. 22 0
      双子星云手机/Assets.xcassets/Player/new_people_welfare_bg.imageset/Contents.json
  25. 二進制
      双子星云手机/Assets.xcassets/Player/new_people_welfare_bg.imageset/编组 5@3x@2x.png
  26. 二進制
      双子星云手机/Assets.xcassets/Player/new_people_welfare_bg.imageset/编组 5@3x@3x.png
  27. 22 0
      双子星云手机/Assets.xcassets/Player/new_people_welfare_middle_bg.imageset/Contents.json
  28. 二進制
      双子星云手机/Assets.xcassets/Player/new_people_welfare_middle_bg.imageset/编组@3x@2x.png
  29. 二進制
      双子星云手机/Assets.xcassets/Player/new_people_welfare_middle_bg.imageset/编组@3x@3x.png
  30. 8 0
      双子星云手机/Class/BuyPhone/BuyHome/BuyOrReExchangeViewController.h
  31. 25 5
      双子星云手机/Class/BuyPhone/BuyHome/BuyOrReExchangeViewController.m
  32. 2 0
      双子星云手机/Class/BuyPhone/BuyHome/VIPFunctView.h
  33. 12 4
      双子星云手机/Class/BuyPhone/BuyHome/VIPFunctView.m
  34. 105 6
      双子星云手机/Class/BuyPhone/BuyVIPViewController.m
  35. 0 1
      双子星云手机/Class/BuyPhone/BuyVipView/BuyVipTopView.m
  36. 2 1
      双子星云手机/Class/BuyPhone/BuyVipView/PackageListScrollView.h
  37. 1 0
      双子星云手机/Class/BuyPhone/BuyVipView/PackageListScrollView.m
  38. 2 2
      双子星云手机/Class/BuyPhone/BuyVipView/packDetailBtn.h
  39. 83 0
      双子星云手机/Class/BuyPhone/BuyVipView/packDetailBtn.m
  40. 58 0
      双子星云手机/Class/BuyPhone/Model/PhonePackageModel.h
  41. 30 0
      双子星云手机/Class/BuyPhone/Model/PhonePackageModel.m
  42. 16 0
      双子星云手机/Class/BuyPhone/PayRecoderDetailViewController.h
  43. 192 0
      双子星云手机/Class/BuyPhone/PayRecoderDetailViewController.m
  44. 16 0
      双子星云手机/Class/BuyPhone/PayRecoderListViewController.h
  45. 126 0
      双子星云手机/Class/BuyPhone/PayRecoderListViewController.m
  46. 17 0
      双子星云手机/Class/BuyPhone/PlayResultViewController.h
  47. 440 0
      双子星云手机/Class/BuyPhone/PlayResultViewController.m
  48. 25 0
      双子星云手机/Class/BuyPhone/Recoder/BuyRecoderListCell.h
  49. 207 0
      双子星云手机/Class/BuyPhone/Recoder/BuyRecoderListCell.m
  50. 39 0
      双子星云手机/Class/BuyPhone/WXPayManager.h
  51. 85 0
      双子星云手机/Class/BuyPhone/WXPayManager.m
  52. 23 0
      双子星云手机/CloudPlayer/AlertVC/NewPeopleWelfareViewController.h
  53. 169 0
      双子星云手机/CloudPlayer/AlertVC/NewPeopleWelfareViewController.m
  54. 27 0
      双子星云手机/CloudPlayer/AlertVC/NoEnoughTimeViewController.h
  55. 196 0
      双子星云手机/CloudPlayer/AlertVC/NoEnoughTimeViewController.m
  56. 10 0
      双子星云手机/CloudPlayer/CloudPhoneAPI.h
  57. 50 0
      双子星云手机/CloudPlayer/Model/PhoneTimeInfoModel.h
  58. 25 0
      双子星云手机/CloudPlayer/Model/PhoneTimeInfoModel.m
  59. 65 38
      双子星云手机/CloudPlayer/PlayerViewController.mm
  60. 16 0
      双子星云手机/CloudPlayer/View/PlayerLoadingView.h
  61. 130 0
      双子星云手机/CloudPlayer/View/PlayerLoadingView.m
  62. 二進制
      双子星云手机/Vendor/AlipaySDK.framework/AlipaySDK
  63. 二進制
      双子星云手机/Vendor/AlipaySDK.framework/AlipaySDK-inside-Info.plist
  64. 56 0
      双子星云手机/Vendor/AlipaySDK.framework/Headers/AFServiceCenter.h
  65. 43 0
      双子星云手机/Vendor/AlipaySDK.framework/Headers/AFServiceResponse.h
  66. 33 0
      双子星云手机/Vendor/AlipaySDK.framework/Headers/APayAuthInfo.h
  67. 223 0
      双子星云手机/Vendor/AlipaySDK.framework/Headers/AlipaySDK.h
  68. 65 0
      双子星云手机/Vendor/RSATool.h
  69. 841 0
      双子星云手机/Vendor/RSATool.m
  70. 43 2
      双子星云手机/zh-Hans.lproj/Localizable.strings

+ 8 - 8
Pods/Pods.xcodeproj/xcuserdata/apple.xcuserdatad/xcschemes/xcschememanagement.plist

@@ -12,12 +12,12 @@
 		<key>HUPhotoBrowser.xcscheme_^#shared#^_</key>
 		<dict>
 			<key>orderHint</key>
-			<integer>11</integer>
+			<integer>5</integer>
 		</dict>
 		<key>IQKeyboardManager.xcscheme_^#shared#^_</key>
 		<dict>
 			<key>orderHint</key>
-			<integer>7</integer>
+			<integer>1</integer>
 		</dict>
 		<key>JQImagePicker.xcscheme_^#shared#^_</key>
 		<dict>
@@ -27,22 +27,22 @@
 		<key>MJExtension.xcscheme_^#shared#^_</key>
 		<dict>
 			<key>orderHint</key>
-			<integer>5</integer>
+			<integer>7</integer>
 		</dict>
 		<key>Masonry.xcscheme_^#shared#^_</key>
 		<dict>
 			<key>orderHint</key>
-			<integer>4</integer>
+			<integer>10</integer>
 		</dict>
 		<key>Pods-双子星云手机-双子星云手机UITests.xcscheme_^#shared#^_</key>
 		<dict>
 			<key>orderHint</key>
-			<integer>8</integer>
+			<integer>4</integer>
 		</dict>
 		<key>Pods-双子星云手机.xcscheme_^#shared#^_</key>
 		<dict>
 			<key>orderHint</key>
-			<integer>10</integer>
+			<integer>6</integer>
 		</dict>
 		<key>Pods-双子星云手机Tests.xcscheme_^#shared#^_</key>
 		<dict>
@@ -52,12 +52,12 @@
 		<key>SDWebImage.xcscheme_^#shared#^_</key>
 		<dict>
 			<key>orderHint</key>
-			<integer>6</integer>
+			<integer>8</integer>
 		</dict>
 		<key>SVProgressHUD.xcscheme_^#shared#^_</key>
 		<dict>
 			<key>orderHint</key>
-			<integer>1</integer>
+			<integer>11</integer>
 		</dict>
 		<key>TZImagePickerController.xcscheme_^#shared#^_</key>
 		<dict>

+ 126 - 0
双子星云手机.xcodeproj/project.pbxproj

@@ -7,6 +7,8 @@
 	objects = {
 
 /* Begin PBXBuildFile section */
+		1810F9002AA1839C00322116 /* PhoneTimeInfoModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 1810F8FE2AA1839C00322116 /* PhoneTimeInfoModel.m */; };
+		1810F9012AA1839C00322116 /* PhoneTimeInfoModel.h in Headers */ = {isa = PBXBuildFile; fileRef = 1810F8FF2AA1839C00322116 /* PhoneTimeInfoModel.h */; };
 		181E84F22A8F0A9B00292B96 /* HelpDownScrollView.h in Headers */ = {isa = PBXBuildFile; fileRef = 181E84F02A8F0A9A00292B96 /* HelpDownScrollView.h */; };
 		181E84F32A8F0A9B00292B96 /* HelpDownScrollView.m in Sources */ = {isa = PBXBuildFile; fileRef = 181E84F12A8F0A9B00292B96 /* HelpDownScrollView.m */; };
 		181E84F62A8F451D00292B96 /* MineViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 181E84F42A8F451C00292B96 /* MineViewCell.m */; };
@@ -119,10 +121,31 @@
 		18613D6D2A98AFC900C06B58 /* PackageListScrollView.h in Headers */ = {isa = PBXBuildFile; fileRef = 18613D6B2A98AFC900C06B58 /* PackageListScrollView.h */; };
 		18613D6E2A98AFC900C06B58 /* PackageListScrollView.m in Sources */ = {isa = PBXBuildFile; fileRef = 18613D6C2A98AFC900C06B58 /* PackageListScrollView.m */; };
 		1866F99E2A136DC700B31E22 /* iPhone.m in Sources */ = {isa = PBXBuildFile; fileRef = 1866F99C2A136DC600B31E22 /* iPhone.m */; };
+		1870766A2A9EE03700F15F7F /* PayRecoderDetailViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 187076682A9EE03600F15F7F /* PayRecoderDetailViewController.m */; };
+		1870766B2A9EE03700F15F7F /* PayRecoderDetailViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 187076692A9EE03700F15F7F /* PayRecoderDetailViewController.h */; };
+		1870766F2A9F180500F15F7F /* NewPeopleWelfareViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 1870766D2A9F180500F15F7F /* NewPeopleWelfareViewController.h */; };
+		187076702A9F180500F15F7F /* NewPeopleWelfareViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1870766E2A9F180500F15F7F /* NewPeopleWelfareViewController.m */; };
+		187076732A9F32DC00F15F7F /* NoEnoughTimeViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 187076712A9F32DC00F15F7F /* NoEnoughTimeViewController.m */; };
+		187076742A9F32DC00F15F7F /* NoEnoughTimeViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 187076722A9F32DC00F15F7F /* NoEnoughTimeViewController.h */; };
+		187076772A9F400300F15F7F /* PlayerLoadingView.h in Headers */ = {isa = PBXBuildFile; fileRef = 187076752A9F400300F15F7F /* PlayerLoadingView.h */; };
+		187076782A9F400300F15F7F /* PlayerLoadingView.m in Sources */ = {isa = PBXBuildFile; fileRef = 187076762A9F400300F15F7F /* PlayerLoadingView.m */; };
 		1893CDCB2A178C3E0074B92F /* HWSetViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1893CDCD2A178C3E0074B92F /* HWSetViewController.xib */; };
 		1893CDD22A178D920074B92F /* HWAgreementViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1893CDD42A178D920074B92F /* HWAgreementViewController.xib */; };
 		1893CDD92A178DC10074B92F /* HWAboutViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1893CDDB2A178DC10074B92F /* HWAboutViewController.xib */; };
 		1893CDE02A178FE70074B92F /* HWHistoryViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1893CDE22A178FE70074B92F /* HWHistoryViewController.xib */; };
+		189414232A9DA0BD00F0A151 /* PhonePackageModel.h in Headers */ = {isa = PBXBuildFile; fileRef = 189414212A9DA0BD00F0A151 /* PhonePackageModel.h */; };
+		189414242A9DA0BD00F0A151 /* PhonePackageModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 189414222A9DA0BD00F0A151 /* PhonePackageModel.m */; };
+		189414272A9DE19500F0A151 /* PlayResultViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 189414252A9DE19500F0A151 /* PlayResultViewController.h */; };
+		189414282A9DE19500F0A151 /* PlayResultViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 189414262A9DE19500F0A151 /* PlayResultViewController.m */; };
+		1894142B2A9DF0EF00F0A151 /* PayRecoderListViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 189414292A9DF0EF00F0A151 /* PayRecoderListViewController.h */; };
+		1894142C2A9DF0EF00F0A151 /* PayRecoderListViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1894142A2A9DF0EF00F0A151 /* PayRecoderListViewController.m */; };
+		189414302A9DF88E00F0A151 /* BuyRecoderListCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 1894142E2A9DF88E00F0A151 /* BuyRecoderListCell.h */; };
+		189414312A9DF88E00F0A151 /* BuyRecoderListCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 1894142F2A9DF88E00F0A151 /* BuyRecoderListCell.m */; };
+		18BA24872AA5C57900BA01EE /* RSATool.h in Headers */ = {isa = PBXBuildFile; fileRef = 18BA24852AA5C57900BA01EE /* RSATool.h */; };
+		18BA24882AA5C57900BA01EE /* RSATool.m in Sources */ = {isa = PBXBuildFile; fileRef = 18BA24862AA5C57900BA01EE /* RSATool.m */; };
+		18BA248B2AA5D48D00BA01EE /* WXPayManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 18BA24892AA5D48C00BA01EE /* WXPayManager.h */; };
+		18BA248C2AA5D48D00BA01EE /* WXPayManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 18BA248A2AA5D48D00BA01EE /* WXPayManager.m */; };
+		18BA248E2AA5D82F00BA01EE /* AlipaySDK.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 18BA248D2AA5D82F00BA01EE /* AlipaySDK.framework */; };
 		18C4754F2A8E0DB5006129C0 /* MySetViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 18C4754D2A8E0DB5006129C0 /* MySetViewController.h */; };
 		18C475502A8E0DB5006129C0 /* MySetViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 18C4754E2A8E0DB5006129C0 /* MySetViewController.m */; };
 		18D947182A96F77D003B5731 /* HWShareViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 18D9471A2A96F77D003B5731 /* HWShareViewController.xib */; };
@@ -244,6 +267,8 @@
 /* Begin PBXFileReference section */
 		0FD90189B9883E63ABE51F3C /* Pods-双子星云手机.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-双子星云手机.release.xcconfig"; path = "Target Support Files/Pods-双子星云手机/Pods-双子星云手机.release.xcconfig"; sourceTree = "<group>"; };
 		16C83602E592F43A82A92B3E /* libPods-双子星云手机Tests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-双子星云手机Tests.a"; sourceTree = BUILT_PRODUCTS_DIR; };
+		1810F8FE2AA1839C00322116 /* PhoneTimeInfoModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PhoneTimeInfoModel.m; sourceTree = "<group>"; };
+		1810F8FF2AA1839C00322116 /* PhoneTimeInfoModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PhoneTimeInfoModel.h; sourceTree = "<group>"; };
 		181E84F02A8F0A9A00292B96 /* HelpDownScrollView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HelpDownScrollView.h; sourceTree = "<group>"; };
 		181E84F12A8F0A9B00292B96 /* HelpDownScrollView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HelpDownScrollView.m; sourceTree = "<group>"; };
 		181E84F42A8F451C00292B96 /* MineViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MineViewCell.m; sourceTree = "<group>"; };
@@ -412,6 +437,14 @@
 		18613D6C2A98AFC900C06B58 /* PackageListScrollView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PackageListScrollView.m; sourceTree = "<group>"; };
 		1866F99C2A136DC600B31E22 /* iPhone.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = iPhone.m; sourceTree = "<group>"; };
 		1866F99D2A136DC700B31E22 /* iPhone.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = iPhone.h; sourceTree = "<group>"; };
+		187076682A9EE03600F15F7F /* PayRecoderDetailViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PayRecoderDetailViewController.m; sourceTree = "<group>"; };
+		187076692A9EE03700F15F7F /* PayRecoderDetailViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PayRecoderDetailViewController.h; sourceTree = "<group>"; };
+		1870766D2A9F180500F15F7F /* NewPeopleWelfareViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NewPeopleWelfareViewController.h; sourceTree = "<group>"; };
+		1870766E2A9F180500F15F7F /* NewPeopleWelfareViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NewPeopleWelfareViewController.m; sourceTree = "<group>"; };
+		187076712A9F32DC00F15F7F /* NoEnoughTimeViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NoEnoughTimeViewController.m; sourceTree = "<group>"; };
+		187076722A9F32DC00F15F7F /* NoEnoughTimeViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NoEnoughTimeViewController.h; sourceTree = "<group>"; };
+		187076752A9F400300F15F7F /* PlayerLoadingView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PlayerLoadingView.h; sourceTree = "<group>"; };
+		187076762A9F400300F15F7F /* PlayerLoadingView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PlayerLoadingView.m; sourceTree = "<group>"; };
 		1893CDCC2A178C3E0074B92F /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/HWSetViewController.xib; sourceTree = "<group>"; };
 		1893CDCF2A178C410074B92F /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/HWSetViewController.strings; sourceTree = "<group>"; };
 		1893CDD12A178C420074B92F /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/HWSetViewController.strings"; sourceTree = "<group>"; };
@@ -426,6 +459,19 @@
 		1893CDE62A178FED0074B92F /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/HWHistoryViewController.strings"; sourceTree = "<group>"; };
 		1893CDE82A1790AD0074B92F /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/HWAddBookmarkViewController.strings; sourceTree = "<group>"; };
 		1893CDEA2A1790B00074B92F /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/HWAddBookmarkViewController.strings"; sourceTree = "<group>"; };
+		189414212A9DA0BD00F0A151 /* PhonePackageModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PhonePackageModel.h; sourceTree = "<group>"; };
+		189414222A9DA0BD00F0A151 /* PhonePackageModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PhonePackageModel.m; sourceTree = "<group>"; };
+		189414252A9DE19500F0A151 /* PlayResultViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PlayResultViewController.h; sourceTree = "<group>"; };
+		189414262A9DE19500F0A151 /* PlayResultViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PlayResultViewController.m; sourceTree = "<group>"; };
+		189414292A9DF0EF00F0A151 /* PayRecoderListViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PayRecoderListViewController.h; sourceTree = "<group>"; };
+		1894142A2A9DF0EF00F0A151 /* PayRecoderListViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PayRecoderListViewController.m; sourceTree = "<group>"; };
+		1894142E2A9DF88E00F0A151 /* BuyRecoderListCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BuyRecoderListCell.h; sourceTree = "<group>"; };
+		1894142F2A9DF88E00F0A151 /* BuyRecoderListCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BuyRecoderListCell.m; sourceTree = "<group>"; };
+		18BA24852AA5C57900BA01EE /* RSATool.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RSATool.h; sourceTree = "<group>"; };
+		18BA24862AA5C57900BA01EE /* RSATool.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RSATool.m; sourceTree = "<group>"; };
+		18BA24892AA5D48C00BA01EE /* WXPayManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WXPayManager.h; sourceTree = "<group>"; };
+		18BA248A2AA5D48D00BA01EE /* WXPayManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WXPayManager.m; sourceTree = "<group>"; };
+		18BA248D2AA5D82F00BA01EE /* AlipaySDK.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = AlipaySDK.framework; sourceTree = "<group>"; };
 		18C4754D2A8E0DB5006129C0 /* MySetViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MySetViewController.h; sourceTree = "<group>"; };
 		18C4754E2A8E0DB5006129C0 /* MySetViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MySetViewController.m; sourceTree = "<group>"; };
 		18D947192A96F77D003B5731 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/HWShareViewController.xib; sourceTree = "<group>"; };
@@ -607,6 +653,7 @@
 			files = (
 				183AE69B2A8C9D5400B11CB0 /* libc++.tbd in Frameworks */,
 				183AE6992A8C9D3C00B11CB0 /* libxml2.tbd in Frameworks */,
+				18BA248E2AA5D82F00BA01EE /* AlipaySDK.framework in Frameworks */,
 				18FB69042A95F8AF00DA9ABC /* libWeChatSDK.a in Frameworks */,
 				183AE68D2A8C9C1A00B11CB0 /* libz.tbd in Frameworks */,
 				183AE6972A8C9D0C00B11CB0 /* Security.framework in Frameworks */,
@@ -656,6 +703,15 @@
 			path = Pods;
 			sourceTree = "<group>";
 		};
+		1810F8FD2AA1823800322116 /* Model */ = {
+			isa = PBXGroup;
+			children = (
+				1810F8FF2AA1839C00322116 /* PhoneTimeInfoModel.h */,
+				1810F8FE2AA1839C00322116 /* PhoneTimeInfoModel.m */,
+			);
+			path = Model;
+			sourceTree = "<group>";
+		};
 		181E84F82A8F577D00292B96 /* ChangeLogo */ = {
 			isa = PBXGroup;
 			children = (
@@ -879,6 +935,8 @@
 		183AE6812A8C9ACA00B11CB0 /* CloudPlayer */ = {
 			isa = PBXGroup;
 			children = (
+				1810F8FD2AA1823800322116 /* Model */,
+				1870766C2A9F152900F15F7F /* AlertVC */,
 				183AE6D02A8CA98C00B11CB0 /* CloudPhoneAPI.h */,
 				183AE6BE2A8CA44D00B11CB0 /* SocketManage */,
 				183AE6B12A8C9F5800B11CB0 /* View */,
@@ -912,6 +970,8 @@
 				183AE6B32A8CA00300B11CB0 /* PlayerView.m */,
 				183AE6B62A8CA0C100B11CB0 /* ShowImageView.h */,
 				183AE6B52A8CA0C000B11CB0 /* ShowImageView.m */,
+				187076752A9F400300F15F7F /* PlayerLoadingView.h */,
+				187076762A9F400300F15F7F /* PlayerLoadingView.m */,
 			);
 			path = View;
 			sourceTree = "<group>";
@@ -956,6 +1016,35 @@
 			path = BuyVipView;
 			sourceTree = "<group>";
 		};
+		1870766C2A9F152900F15F7F /* AlertVC */ = {
+			isa = PBXGroup;
+			children = (
+				1870766D2A9F180500F15F7F /* NewPeopleWelfareViewController.h */,
+				1870766E2A9F180500F15F7F /* NewPeopleWelfareViewController.m */,
+				187076722A9F32DC00F15F7F /* NoEnoughTimeViewController.h */,
+				187076712A9F32DC00F15F7F /* NoEnoughTimeViewController.m */,
+			);
+			path = AlertVC;
+			sourceTree = "<group>";
+		};
+		189414202A9D9FEC00F0A151 /* Model */ = {
+			isa = PBXGroup;
+			children = (
+				189414212A9DA0BD00F0A151 /* PhonePackageModel.h */,
+				189414222A9DA0BD00F0A151 /* PhonePackageModel.m */,
+			);
+			path = Model;
+			sourceTree = "<group>";
+		};
+		1894142D2A9DF86900F0A151 /* Recoder */ = {
+			isa = PBXGroup;
+			children = (
+				1894142E2A9DF88E00F0A151 /* BuyRecoderListCell.h */,
+				1894142F2A9DF88E00F0A151 /* BuyRecoderListCell.m */,
+			);
+			path = Recoder;
+			sourceTree = "<group>";
+		};
 		18C4754C2A8E0D9B006129C0 /* Set */ = {
 			isa = PBXGroup;
 			children = (
@@ -1040,10 +1129,20 @@
 		18FB690A2A9624C600DA9ABC /* BuyPhone */ = {
 			isa = PBXGroup;
 			children = (
+				18BA24892AA5D48C00BA01EE /* WXPayManager.h */,
+				18BA248A2AA5D48D00BA01EE /* WXPayManager.m */,
+				1894142D2A9DF86900F0A151 /* Recoder */,
+				189414202A9D9FEC00F0A151 /* Model */,
 				18613D662A98907A00C06B58 /* BuyVipView */,
 				18D9471F2A96FC90003B5731 /* BuyHome */,
 				18613D622A988D0E00C06B58 /* BuyVIPViewController.h */,
 				18613D632A988D0E00C06B58 /* BuyVIPViewController.m */,
+				189414252A9DE19500F0A151 /* PlayResultViewController.h */,
+				189414262A9DE19500F0A151 /* PlayResultViewController.m */,
+				189414292A9DF0EF00F0A151 /* PayRecoderListViewController.h */,
+				1894142A2A9DF0EF00F0A151 /* PayRecoderListViewController.m */,
+				187076692A9EE03700F15F7F /* PayRecoderDetailViewController.h */,
+				187076682A9EE03600F15F7F /* PayRecoderDetailViewController.m */,
 			);
 			path = BuyPhone;
 			sourceTree = "<group>";
@@ -1098,6 +1197,9 @@
 		A003F6B727D841FF00715CBF /* Vendor */ = {
 			isa = PBXGroup;
 			children = (
+				18BA24852AA5C57900BA01EE /* RSATool.h */,
+				18BA24862AA5C57900BA01EE /* RSATool.m */,
+				18BA248D2AA5D82F00BA01EE /* AlipaySDK.framework */,
 				183AE6D22A8CAFAD00B11CB0 /* UIView+View.h */,
 				183AE6D32A8CAFAE00B11CB0 /* UIView+View.m */,
 				183AE7C52A8CB39100B11CB0 /* SafeForKey.h */,
@@ -1412,26 +1514,34 @@
 			isa = PBXHeadersBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				189414272A9DE19500F0A151 /* PlayResultViewController.h in Headers */,
+				187076742A9F32DC00F15F7F /* NoEnoughTimeViewController.h in Headers */,
 				184C8AD02A94980D00F26650 /* CustomerWebViewController.h in Headers */,
 				184C8ADA2A949DAC00F26650 /* HaveNewVersionView.h in Headers */,
 				183AE6D12A8CA98C00B11CB0 /* CloudPhoneAPI.h in Headers */,
+				1870766F2A9F180500F15F7F /* NewPeopleWelfareViewController.h in Headers */,
 				184E0B6A2A9C7E4900DE1571 /* packDetailBtn.h in Headers */,
 				183AE6C72A8CA4D200B11CB0 /* PlayerViewController+AdjustBtnFrame.h in Headers */,
 				183AE6C82A8CA4D700B11CB0 /* PlayerViewController+AppDelegate.h in Headers */,
 				18FB690D2A96252900DA9ABC /* BuyOrReExchangeViewController.h in Headers */,
 				18613D692A9890AB00C06B58 /* BuyVipTopView.h in Headers */,
+				1870766B2A9EE03700F15F7F /* PayRecoderDetailViewController.h in Headers */,
 				183AE6CE2A8CA55E00B11CB0 /* ShortcutManager.h in Headers */,
 				18D947222A96FCBB003B5731 /* VIPFunctView.h in Headers */,
 				181E85002A8F6B1800292B96 /* LogoSelectView.h in Headers */,
+				18BA24872AA5C57900BA01EE /* RSATool.h in Headers */,
 				184E0B622A9C48A900DE1571 /* PayTypeView.h in Headers */,
 				183AE6CA2A8CA4E300B11CB0 /* PlayerViewController+RBD.h in Headers */,
+				189414232A9DA0BD00F0A151 /* PhonePackageModel.h in Headers */,
 				183AE6CB2A8CA4E700B11CB0 /* PlayerViewController+TouchPointXD.h in Headers */,
+				1810F9012AA1839C00322116 /* PhoneTimeInfoModel.h in Headers */,
 				181E84F22A8F0A9B00292B96 /* HelpDownScrollView.h in Headers */,
 				18FB69022A95F8AF00DA9ABC /* MessageModel.h in Headers */,
 				181E84FB2A8F57A500292B96 /* ChangeLogoViewController.h in Headers */,
 				18C4754F2A8E0DB5006129C0 /* MySetViewController.h in Headers */,
 				184C8ADD2A949DBD00F26650 /* HWVersionModel.h in Headers */,
 				181E84F72A8F451D00292B96 /* MineViewCell.h in Headers */,
+				189414302A9DF88E00F0A151 /* BuyRecoderListCell.h in Headers */,
 				183AE6D42A8CAFAE00B11CB0 /* UIView+View.h in Headers */,
 				184C8ACC2A94557200F26650 /* HidenMaskSetViewController.h in Headers */,
 				18FB68FF2A95F8AF00DA9ABC /* WXApi.h in Headers */,
@@ -1439,11 +1549,14 @@
 				18613D642A988D0E00C06B58 /* BuyVIPViewController.h in Headers */,
 				18FB69002A95F8AF00DA9ABC /* WXApiObject.h in Headers */,
 				184C8AD52A949D5900F26650 /* AboutViewController.h in Headers */,
+				18BA248B2AA5D48D00BA01EE /* WXPayManager.h in Headers */,
 				18FB68FD2A95F8AF00DA9ABC /* WechatAuthSDK.h in Headers */,
 				183AE7CB2A8CC14D00B11CB0 /* BuryPoint.h in Headers */,
+				187076772A9F400300F15F7F /* PlayerLoadingView.h in Headers */,
 				18FB68FC2A95F8AF00DA9ABC /* HWShareViewController.h in Headers */,
 				184E0B672A9C4C0C00DE1571 /* VIPFunctForBuyView.h in Headers */,
 				18613D6D2A98AFC900C06B58 /* PackageListScrollView.h in Headers */,
+				1894142B2A9DF0EF00F0A151 /* PayRecoderListViewController.h in Headers */,
 				18D947262A970804003B5731 /* CellWithBtnView.h in Headers */,
 				183AE7C72A8CB39100B11CB0 /* SafeForKey.h in Headers */,
 			);
@@ -1734,6 +1847,7 @@
 				183AE6AB2A8C9EAB00B11CB0 /* PlayerViewController.mm in Sources */,
 				18613D6E2A98AFC900C06B58 /* PackageListScrollView.m in Sources */,
 				18E557292A3C60ED005CC84B /* PwdInPutView.m in Sources */,
+				189414282A9DE19500F0A151 /* PlayResultViewController.m in Sources */,
 				183AE6502A8A2CF000B11CB0 /* UIButton+AFNetworking.m in Sources */,
 				18613D652A988D0E00C06B58 /* BuyVIPViewController.m in Sources */,
 				183AE6112A8A268D00B11CB0 /* CloudPhoneModel.m in Sources */,
@@ -1748,6 +1862,7 @@
 				183AE6AF2A8C9EAB00B11CB0 /* PlayerViewController+AdjustBtnFrame.m in Sources */,
 				A08A950027E9A4E400C544BB /* FMDatabaseQueue.m in Sources */,
 				A031DD7A27EC713A00909527 /* HWSetViewController.m in Sources */,
+				189414312A9DF88E00F0A151 /* BuyRecoderListCell.m in Sources */,
 				183AE6022A89CE3C00B11CB0 /* JSONValueTransformer.m in Sources */,
 				183AE6522A8A2CF000B11CB0 /* AFAutoPurgingImageCache.m in Sources */,
 				181E84FC2A8F57A500292B96 /* ChangeLogoViewController.m in Sources */,
@@ -1777,6 +1892,7 @@
 				A08A950427E9A4E400C544BB /* FMResultSet.m in Sources */,
 				18D947272A970804003B5731 /* CellWithBtnView.m in Sources */,
 				A003F6C227D841FF00715CBF /* UIScrollView+EmptyDataSet.m in Sources */,
+				187076702A9F180500F15F7F /* NewPeopleWelfareViewController.m in Sources */,
 				183AE5CD2A89C83500B11CB0 /* LoginForViewController.m in Sources */,
 				183AE7C82A8CB39100B11CB0 /* SafeForKey.m in Sources */,
 				183AE6AE2A8C9EAB00B11CB0 /* PlayerViewController+TouchPointXD.m in Sources */,
@@ -1786,15 +1902,19 @@
 				183AE6532A8A2CF000B11CB0 /* AFImageDownloader.m in Sources */,
 				A003F6B327D841EE00715CBF /* UIColor+HZXColor.m in Sources */,
 				184E0B6B2A9C7E4900DE1571 /* packDetailBtn.m in Sources */,
+				1870766A2A9EE03700F15F7F /* PayRecoderDetailViewController.m in Sources */,
 				18E557222A3C5D75005CC84B /* CalculatorViewController.m in Sources */,
 				18E5572F2A3C6141005CC84B /* UITextfield+NLLimit.m in Sources */,
 				183AE6B72A8CA0C100B11CB0 /* ShowImageView.m in Sources */,
 				183AE5D32A89C99000B11CB0 /* ViewForPhoneAndSMS.m in Sources */,
+				187076732A9F32DC00F15F7F /* NoEnoughTimeViewController.m in Sources */,
 				183AE6C52A8CA44D00B11CB0 /* FLSocketManager.m in Sources */,
 				184E0B662A9C4C0C00DE1571 /* VIPFunctForBuyView.m in Sources */,
 				A003F6F827D8775A00715CBF /* HWSearchBar.m in Sources */,
+				189414242A9DA0BD00F0A151 /* PhonePackageModel.m in Sources */,
 				A00221E027EB0EBF00E45F78 /* HWFolderListCell.m in Sources */,
 				A003F6D027D8425C00715CBF /* RSA.m in Sources */,
+				18BA24882AA5C57900BA01EE /* RSATool.m in Sources */,
 				1866F99E2A136DC700B31E22 /* iPhone.m in Sources */,
 				183AE64D2A8A2CF000B11CB0 /* UIRefreshControl+AFNetworking.m in Sources */,
 				A003F6E327D8428200715CBF /* SceneDelegate.m in Sources */,
@@ -1813,7 +1933,9 @@
 				A031DD7527EC507000909527 /* HWAddFolderViewController.m in Sources */,
 				183AE6CF2A8CA55E00B11CB0 /* ShortcutManager.m in Sources */,
 				183AE6BA2A8CA3A800B11CB0 /* PhoneP2PModel.m in Sources */,
+				187076782A9F400300F15F7F /* PlayerLoadingView.m in Sources */,
 				A08A950127E9A4E400C544BB /* FMDatabaseAdditions.m in Sources */,
+				1894142C2A9DF0EF00F0A151 /* PayRecoderListViewController.m in Sources */,
 				A08A94FB27E9A4E400C544BB /* BGDB.m in Sources */,
 				183AE6AD2A8C9EAB00B11CB0 /* PlayerViewController+RBD.m in Sources */,
 				A003F6B427D841EE00715CBF /* UITextfield+NLLimit.m in Sources */,
@@ -1829,6 +1951,7 @@
 				183AE6562A8A2CF000B11CB0 /* AFURLSessionManager.m in Sources */,
 				183AE6092A89CE3C00B11CB0 /* JSONAPI.m in Sources */,
 				183AE6232A8A291400B11CB0 /* HWBuryPointModel.m in Sources */,
+				1810F9002AA1839C00322116 /* PhoneTimeInfoModel.m in Sources */,
 				1823A8262A8601A500CE2913 /* GuideViewController.m in Sources */,
 				18FB69052A95F8AF00DA9ABC /* HWShareViewController.m in Sources */,
 				18E5572C2A3C6127005CC84B /* ForbidMenuTextField.m in Sources */,
@@ -1849,6 +1972,7 @@
 				183AE5E12A89CD3C00B11CB0 /* SuperModel.m in Sources */,
 				A003F6A927D841C800715CBF /* BaseTabBarController.m in Sources */,
 				A003F6C027D841FF00715CBF /* FLAnimatedImage.m in Sources */,
+				18BA248C2AA5D48D00BA01EE /* WXPayManager.m in Sources */,
 				A02FF6AC27D7054700D59D3F /* main.m in Sources */,
 				A08A94DB27E97DB800C544BB /* HWPageViewController.m in Sources */,
 			);
@@ -2107,6 +2231,7 @@
 					"$(inherited)",
 					"$(PROJECT_DIR)/双子星云手机/CloudPlayer",
 					"$(PROJECT_DIR)/双子星云手机/Class/Set/Share",
+					"$(PROJECT_DIR)/双子星云手机/Vendor",
 				);
 				GCC_PREFIX_HEADER = "$(SRCROOT)/双子星云手机/AppDelegate/PrefixHeader.pch";
 				GENERATE_INFOPLIST_FILE = YES;
@@ -2180,6 +2305,7 @@
 					"$(inherited)",
 					"$(PROJECT_DIR)/双子星云手机/CloudPlayer",
 					"$(PROJECT_DIR)/双子星云手机/Class/Set/Share",
+					"$(PROJECT_DIR)/双子星云手机/Vendor",
 				);
 				GCC_PREFIX_HEADER = "$(SRCROOT)/双子星云手机/AppDelegate/PrefixHeader.pch";
 				GENERATE_INFOPLIST_FILE = YES;

二進制
双子星云手机.xcworkspace/xcuserdata/apple.xcuserdatad/UserInterfaceState.xcuserstate


+ 18 - 0
双子星云手机.xcworkspace/xcuserdata/apple.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist

@@ -3,4 +3,22 @@
    uuid = "0D51A86C-5526-42B9-8ACC-2C9E51DC35D8"
    type = "0"
    version = "2.0">
+   <Breakpoints>
+      <BreakpointProxy
+         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
+         <BreakpointContent
+            uuid = "16E92C48-9C93-4326-A3C7-56879A14CB81"
+            shouldBeEnabled = "Yes"
+            ignoreCount = "0"
+            continueAfterRunningActions = "No"
+            filePath = "&#x53cc;&#x5b50;&#x661f;&#x4e91;&#x624b;&#x673a;/Vendor/AFNetworking/AFNetworking/AFURLRequestSerialization.m"
+            startingColumnNumber = "9223372036854775807"
+            endingColumnNumber = "9223372036854775807"
+            startingLineNumber = "1338"
+            endingLineNumber = "1338"
+            landmarkName = "-requestBySerializingRequest:withParameters:error:"
+            landmarkType = "7">
+         </BreakpointContent>
+      </BreakpointProxy>
+   </Breakpoints>
 </Bucket>

+ 38 - 0
双子星云手机/AppDelegate/AppDelegate.m

@@ -10,6 +10,8 @@
 #import "QQLoginManager.h"
 #import <TencentOpenAPI/QQApiInterface.h>
 #import <TencentOpenAPI/TencentOAuth.h>
+#import <AlipaySDK/AlipaySDK.h>
+#import "WXPayManager.h"
 
 @interface AppDelegate ()
 
@@ -66,5 +68,41 @@
     // Use this method to release any resources that were specific to the discarded scenes, as they will not return.
 }
 
+- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options
+{
+    [UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleLightContent;
+    
+    if ([url.host isEqualToString:@"safepay"]) {
+        //跳转支付宝钱包进行支付,处理支付结果
+        [[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
+            HLog(@"result = %@",resultDic);
+            
+            [[NSNotificationCenter defaultCenter] postNotificationName:NotificationNameBySafepayResult object:resultDic];
+            
+            [HWDataManager setStringWithKey:Const_AirpayOrWXorderNum value:@""];
+        }];
+        return YES;
+    }else if ([url.absoluteString hasPrefix:@"tencent"]) { // QQ
+        
+        [HWDataManager setStringWithKey:Const_AirpayOrWXorderNum value:@""];
+        
+        return [TencentOAuth HandleOpenURL:url];
+    }
+
+    
+    return [WXApi handleOpenURL:url  delegate:[WXPayManager shareInstance]];
+}
 
+- (void)applicationWillEnterForeground:(UIApplication *)application {
+    // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background.
+    
+    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.4 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
+
+        NSString *orderNumber = [HWDataManager getStringWithKey:Const_AirpayOrWXorderNum];
+        if (orderNumber && ![orderNumber isEqualToString:@""])
+        {
+            [[NSNotificationCenter defaultCenter] postNotificationName:NotNameAirpayOrWXorderNum object:orderNumber];
+        }
+    });
+}
 @end

+ 5 - 0
双子星云手机/AppDelegate/Config/ColorDefine.h

@@ -44,6 +44,11 @@
 #define HWCCCCCCColor [UIColor hwColor:@"#CCCCCC"]
 #define HW2C2C2DColor [UIColor hwColor:@"#2C2C2D"]
 #define HWE7F2F8Color [UIColor hwColor:@"#E7F2F8"]
+#define HWFBFCFDColor [UIColor hwColor:@"#FBFCFD"]
+#define HW01B7EAColor [UIColor hwColor:@"#01B7EA"]
+#define HW0458E3Color [UIColor hwColor:@"#0458E3"]
+#define HW2F3972Color [UIColor hwColor:@"#2F3972"]
+#define HW111111Color [UIColor hwColor:@"#111111"]
 
 #define COLOR_DISABLE_BTN         RGBACOLOR(0x08,0x86,0xF5,0.3)
 #define COLOR_ENABLE_BTN          RGBACOLOR(36,99,251,1)

+ 5 - 0
双子星云手机/AppDelegate/Config/Const.h

@@ -49,8 +49,13 @@ UIKIT_EXTERN NSString *const Const_Mask_View_Open;
 /*进城隐藏模式 1:计算器  2:浏览器 其他默认计算器*/
 UIKIT_EXTERN NSString *const Const_Mask_View_Model;
 
+/*标记是否已过期 YES:已过期  其他未过期*/
+UIKIT_EXTERN NSString *const Const_Have_No_VaildTime;
+
 /**App有新版本更新*/
 UIKIT_EXTERN NSString *const Const_haveVersion;
+
+UIKIT_EXTERN NSString *const Const_AirpayOrWXorderNum;
 @end
 
 NS_ASSUME_NONNULL_END

+ 5 - 0
双子星云手机/AppDelegate/Config/Const.m

@@ -45,6 +45,11 @@ NSString *const Const_Mask_View_Open  = @"Const_Mask_View_Open";
 /*进城隐藏模式 1:计算器  2:浏览器 其他默认计算器*/
 NSString *const Const_Mask_View_Model  = @"Const_Mask_View_Model";
 
+/*标记是否已过期 YES:已过期  其他未过期*/
+NSString *const Const_Have_No_VaildTime  = @"Const_Have_No_VaildTime";
+
 /**App有新版本更新*/
 NSString *const Const_haveVersion = @"Const_haveVersion";
+
+NSString *const Const_AirpayOrWXorderNum = @"AirpayOrWXorderNum";
 @end

+ 9 - 0
双子星云手机/AppDelegate/Config/Notification.h

@@ -24,6 +24,9 @@
 #pragma mark 异地登陆
 #define AccountLoginWithOtherDeviceNotification  @"AccountLoginWithOtherDeviceNotification"
 
+/*无有效时间*/
+#define PhoneNoVailTimeNotification  @"PhoneNoVailTimeNotification"
+
 #pragma mark Token失效
 #define TokenIsInvalidNotification  @"TokenIsInvalidNotification"
 
@@ -49,4 +52,10 @@
 
 #pragma mark 断开连接
 #define NotNameByCONNECT_DISCONNECT  @"CONNECT_DISCONNECT"
+
+#pragma mark 支付回调
+#define NotNameAirpayOrWXorderNum  @"NotNameAirpayOrWXorderNum"
+
+#pragma mark 安全支付结果通知
+#define NotificationNameBySafepayResult  @"SafepayResult" //
 #endif /* Notification_h */

文件差異過大導致無法顯示
+ 3 - 0
双子星云手机/AppDelegate/PrefixHeader.pch


+ 92 - 10
双子星云手机/AppDelegate/SceneDelegate.m

@@ -16,6 +16,8 @@
 #import "BaseNavigationController.h"
 #import "MySetViewController.h"
 #import "BuyOrReExchangeViewController.h"
+#import "ShortcutManager.h"
+#import "SafeForKey.h"
 
 @interface SceneDelegate ()<SetUsePWDViewControllerDelegate,GuideViewControllerDelegate,LoginForViewControllerDelegate>
 @property(nonatomic, strong)   CalculatorViewController *calculatorVC;
@@ -28,7 +30,10 @@
 - (void)scene:(UIScene *)scene willConnectToSession:(UISceneSession *)session options:(UISceneConnectionOptions *)connectionOptions {
 
     if (scene) {
-    
+        
+        //监听账号异地登陆销通知
+        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(accountLoginWithOtherDevice:)  name:AccountLoginWithOtherDeviceNotification  object:nil];
+        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(showExchangePhoneVC:)  name:PhoneNoVailTimeNotification  object:nil];
         UIWindowScene *windowScene = (UIWindowScene *)scene;
         self.window = [[UIWindow alloc] initWithWindowScene:windowScene];
         self.window.frame = CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height);
@@ -86,16 +91,15 @@
         return;
     }
     
-    /*已过期,无有效使用时长 直接加载购买续费界面*/
-    BuyOrReExchangeViewController *buyOrReExchangeVC = [[BuyOrReExchangeViewController alloc] init];
-    BaseNavigationController *buyOrReExchangeNav = [[BaseNavigationController alloc] initWithRootViewController:buyOrReExchangeVC];
-    self.window.rootViewController = buyOrReExchangeNav;
-    return;
+//    BOOL haveVaildTime = [HWDataManager getBoolWithKey:Const_Have_No_VaildTime];
+//    if (haveVaildTime == YES){/*无有效时间*/
+//        [self showExchangePhoneVC];
+//    }
     
-//    PlayerViewController *playerRootVC = [[PlayerViewController alloc] init];
-//    BaseNavigationController *playerNav = [[BaseNavigationController alloc] initWithRootViewController:playerRootVC];
-//    self.window.rootViewController = playerNav;
-//    return;
+    PlayerViewController *playerRootVC = [[PlayerViewController alloc] init];
+    BaseNavigationController *playerNav = [[BaseNavigationController alloc] initWithRootViewController:playerRootVC];
+    self.window.rootViewController = playerNav;
+    return;
     
 //
 //    MySetViewController *playerRootVC = [[MySetViewController alloc] init];
@@ -103,6 +107,28 @@
 //    self.window.rootViewController = playerNav;
 }
 
+- (void)showExchangePhoneVC:(NSNotification*)not{
+    NSDictionary *dict = not.userInfo;
+    NSArray *privilegeList = [dict objectForKey:@"privilegeList"];
+    
+    /*0开通  3续费*/
+    NSInteger whetherPhoneStatus = [[dict objectForKey:@"whetherPhoneStatus"] integerValue];
+    /*已过期,无有效使用时长 直接加载购买续费界面*/
+    BuyOrReExchangeViewController *buyOrReExchangeVC = [[BuyOrReExchangeViewController alloc] init];
+    buyOrReExchangeVC.privilegeList = privilegeList;
+    if (0 == whetherPhoneStatus){
+        buyOrReExchangeVC.buyOrExchange = 0;
+    }else if (3 == whetherPhoneStatus){
+        NSInteger expirationReminder = [[dict safeStringForKey:@"expirationReminder"] integerValue];
+        buyOrReExchangeVC.buyOrExchange = 1;
+        buyOrReExchangeVC.expirationReminder = expirationReminder;
+    }
+    
+    BaseNavigationController *buyOrReExchangeNav = [[BaseNavigationController alloc] initWithRootViewController:buyOrReExchangeVC];
+    self.window.rootViewController = buyOrReExchangeNav;
+    return;
+}
+
 - (void)setPwdOk{
     [self enterMainVCFromScene];
     
@@ -281,6 +307,11 @@
         return;
     }
     
+    BOOL haveVaildTime = [HWDataManager getBoolWithKey:Const_Have_No_VaildTime];
+    if (haveVaildTime == YES){/*无有效时间*/
+        return;
+    }
+    
     NSInteger maskModel = [HWDataManager getIntegerWithKey:Const_Mask_View_Model];
     if (maskModel == 2){
         /*浏览器*/
@@ -374,4 +405,55 @@
     [self enterMainVCFromScene];
 }
 
+
+//static BOOL  isFirstTimeShowAccountLoginWithOtherDevice = YES;
+- (void)accountLoginWithOtherDevice:(NSNotification*)not {
+    UIViewController *currentVC = [[ShortcutManager shareInstance] findCurrentShowingViewController];
+    
+    NSDictionary *dict = not.userInfo;
+    NSString *msg = dict[@"msg"];
+    if (msg.length == 0) {
+        msg = @"设备已在别处登录";
+    }
+    
+    NSDictionary *dictLogin = [[UseAccountManage shareInstance] getLoginInfo];
+    if (dictLogin.allKeys.count == 0) { // 已经被清掉了
+        return;
+    }
+    
+    /*设备已在别处登录*/
+    [self initAlertWithTitle:nil message:msg sureActionBlock:^(UIAlertController * _Nonnull alertView) {
+        [[UseAccountManage shareInstance] logout];
+        // 退出登录
+        [self enterMainVCFromScene];
+    }];
+}
+
+-(void)initAlertWithTitle:(NSString *_Nullable)title message:(NSString *)message sureActionBlock:(sureActionBlock)sureActionBlock {
+    UIAlertController *alertController = [UIAlertController alertControllerWithTitle:title message:message preferredStyle:UIAlertControllerStyleAlert];
+    UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"other_comment_ok",nil) style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
+        
+        sureActionBlock(alertController);
+    }];
+    [alertController addAction:cancelAction];
+    
+    // 弹窗边框
+    UIView *subview = alertController.view.subviews.firstObject;
+    UIView *alertContentView = subview.subviews.firstObject;
+    alertContentView.layer.cornerRadius = 10;
+//                alertContentView.layer.masksToBounds = YES;
+    alertContentView.layer.shadowColor = [UIColor colorWithRed:30/255.0 green:32/255.0 blue:34/255.0 alpha:1.0].CGColor;
+    alertContentView.layer.shadowOffset = CGSizeMake(0,0);
+    alertContentView.layer.shadowOpacity = 1;
+    alertContentView.layer.shadowRadius = 7;
+    // 弹窗背景颜色
+    if (@available(iOS 13.0, *)) {
+        alertController.overrideUserInterfaceStyle = UIUserInterfaceStyleDark;
+    }
+    
+    UIViewController *currentVC = [[ShortcutManager shareInstance] findCurrentShowingViewController];
+    [currentVC presentViewController:alertController animated:YES completion:nil];
+//    [self presentViewController:alertController animated:YES completion:nil];
+}
+
 @end

+ 22 - 0
双子星云手机/Assets.xcassets/Buy/buy_copy.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "编组 2@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "编组 2@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

二進制
双子星云手机/Assets.xcassets/Buy/buy_copy.imageset/编组 2@2x.png


二進制
双子星云手机/Assets.xcassets/Buy/buy_copy.imageset/编组 2@3x.png


+ 22 - 0
双子星云手机/Assets.xcassets/Buy/buy_pay_faile.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "编组 5@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "编组 5@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

二進制
双子星云手机/Assets.xcassets/Buy/buy_pay_faile.imageset/编组 5@2x.png


二進制
双子星云手机/Assets.xcassets/Buy/buy_pay_faile.imageset/编组 5@3x.png


+ 22 - 0
双子星云手机/Assets.xcassets/Buy/buy_pay_success.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "编组 2@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "编组 2@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

二進制
双子星云手机/Assets.xcassets/Buy/buy_pay_success.imageset/编组 2@2x.png


二進制
双子星云手机/Assets.xcassets/Buy/buy_pay_success.imageset/编组 2@3x.png


+ 22 - 0
双子星云手机/Assets.xcassets/Buy/buy_paying.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "编组@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "编组@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

二進制
双子星云手机/Assets.xcassets/Buy/buy_paying.imageset/编组@2x.png


二進制
双子星云手机/Assets.xcassets/Buy/buy_paying.imageset/编组@3x.png


+ 22 - 0
双子星云手机/Assets.xcassets/Player/new_people_welfare_bg.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "编组 5@3x@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "编组 5@3x@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

二進制
双子星云手机/Assets.xcassets/Player/new_people_welfare_bg.imageset/编组 5@3x@2x.png


二進制
双子星云手机/Assets.xcassets/Player/new_people_welfare_bg.imageset/编组 5@3x@3x.png


+ 22 - 0
双子星云手机/Assets.xcassets/Player/new_people_welfare_middle_bg.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "编组@3x@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "编组@3x@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

二進制
双子星云手机/Assets.xcassets/Player/new_people_welfare_middle_bg.imageset/编组@3x@2x.png


二進制
双子星云手机/Assets.xcassets/Player/new_people_welfare_middle_bg.imageset/编组@3x@3x.png


+ 8 - 0
双子星云手机/Class/BuyPhone/BuyHome/BuyOrReExchangeViewController.h

@@ -11,6 +11,14 @@ NS_ASSUME_NONNULL_BEGIN
 
 @interface BuyOrReExchangeViewController : BaseViewController
 
+@property (nonatomic ,strong)NSArray *privilegeList;
+
+/*购买或者续费 0:购买 1:续费*/
+@property (nonatomic ,assign)NSInteger buyOrExchange;
+
+/*云机到期会保留数据多少天*/
+@property (nonatomic ,assign)NSInteger expirationReminder;
+
 @end
 
 NS_ASSUME_NONNULL_END

+ 25 - 5
双子星云手机/Class/BuyPhone/BuyHome/BuyOrReExchangeViewController.m

@@ -25,6 +25,9 @@
 @end
 
 @implementation BuyOrReExchangeViewController
+@synthesize privilegeList;
+@synthesize buyOrExchange;
+@synthesize expirationReminder;
 
 - (void)viewDidLoad {
     [super viewDidLoad];
@@ -120,7 +123,7 @@
     }];
     
     /*VIP视图*/
-    vipFunctView = [[VIPFunctView alloc] init];
+    vipFunctView = [[VIPFunctView alloc] initWithList:privilegeList];
     [self.view addSubview:vipFunctView];
     [vipFunctView setBackgroundColor:[UIColor clearColor]];
     [vipFunctView mas_makeConstraints:^(MASConstraintMaker *make) {
@@ -130,7 +133,7 @@
         make.height.mas_equalTo(210.f);
     }];
     
-    /*开通会员*/
+    /*开通或者续费会员*/
     upCell = [[CellWithBtnView alloc] init];
     [upCell setBackgroundColor:[UIColor whiteColor]];
     [self.view addSubview:upCell];
@@ -141,9 +144,26 @@
         make.height.mas_equalTo(72.f);
     }];
     [upCell.layer setCornerRadius:8];
-    [upCell.topLabel setText:NSLocalizedString(@"buy_home_cell_get_vip",nil)];
-    [upCell.downLabel setText:NSLocalizedString(@"buy_home_cell_get_vip_detail",nil)];
-    [upCell.rightBtn setTitle:NSLocalizedString(@"buy_home_cell_get_vip_do",nil) forState:(UIControlStateNormal)];
+    
+    if (buyOrExchange == 0){/*开通*/
+        [upCell.topLabel setText:NSLocalizedString(@"buy_home_cell_get_vip",nil)];
+        [upCell.downLabel setText:NSLocalizedString(@"buy_home_cell_get_vip_detail",nil)];
+        [upCell.rightBtn setTitle:NSLocalizedString(@"buy_home_cell_get_vip_do",nil) forState:(UIControlStateNormal)];
+    }else{/*续费*/
+//        expirationReminder
+        [upCell.topLabel setText:NSLocalizedString(@"buy_home_cell_exchange_vip",nil)];
+        
+        NSString *leftStr = NSLocalizedString(@"buy_vip_buy_dtat_will_lost",nil);
+        NSString *middleStr = [NSString stringWithFormat:@"%ld",expirationReminder];
+        NSString *rightStr = NSLocalizedString(@"buy_vip_package_detail_day",nil);
+        NSString *showStr = [[leftStr stringByAppendingString:middleStr] stringByAppendingString:rightStr];
+        NSMutableAttributedString *string = [[NSMutableAttributedString alloc] initWithString:showStr attributes: @{NSForegroundColorAttributeName:HW666666Color}];
+        
+        [string addAttributes:@{NSForegroundColorAttributeName:HWDD4E4EColor} range:NSMakeRange(leftStr.length, middleStr.length)];
+        [upCell.downLabel setAttributedText:string];
+        [upCell.rightBtn setTitle:NSLocalizedString(@"buy_home_cell_exchange_vip_do",nil) forState:(UIControlStateNormal)];
+    }
+    
     [upCell.rightBtn addTarget:self
                         action:@selector(toBuyVIP) forControlEvents:(UIControlEventTouchUpInside)];
     

+ 2 - 0
双子星云手机/Class/BuyPhone/BuyHome/VIPFunctView.h

@@ -11,6 +11,8 @@ NS_ASSUME_NONNULL_BEGIN
 
 @interface VIPFunctView : UIView
 
+- (id)initWithList:(NSArray *)privilegeList;
+
 @end
 
 NS_ASSUME_NONNULL_END

+ 12 - 4
双子星云手机/Class/BuyPhone/BuyHome/VIPFunctView.m

@@ -20,12 +20,20 @@
 - (id)initWithFrame:(CGRect)frame{
     self = [super initWithFrame:frame];
     
-    [self drawAnyView];
+//    [self drawAnyView];
     
     return self;
 }
 
-- (void)drawAnyView{
+- (id)initWithList:(NSArray *)privilegeList{
+    self = [super init];
+    
+    [self drawAnyViewWithList:privilegeList];
+    
+    return self;
+}
+
+- (void)drawAnyViewWithList:(NSArray *)privilegeList{
     /*上方背景*/
     UIImageView *upBGView = [[UIImageView alloc] init];
     [upBGView setBackgroundColor:[UIColor clearColor]];
@@ -77,12 +85,12 @@
     }];
     
     /*绘制标签*/
-    for (NSInteger nFori = 0; nFori < 6; nFori++) {
+    for (NSInteger nFori = 0; nFori < privilegeList.count; nFori++) {
         UIButton *flagBtn = [[UIButton alloc] init];
         [flagBtn setImage:[UIImage imageNamed:@"buy_home_flag_fun"] forState:(UIControlStateNormal)];
         [flagBtn setTitleColor:HW666666Color forState:(UIControlStateNormal)];
         [flagBtn.titleLabel setFont:[UIFont systemFontOfSize:12.f]];
-        [flagBtn setTitle:[NSString stringWithFormat:@"第%ld个标签",nFori+1] forState:(UIControlStateNormal)];
+        [flagBtn setTitle:privilegeList[nFori] forState:(UIControlStateNormal)];
         [flagBtn setContentHorizontalAlignment:(UIControlContentHorizontalAlignmentLeft)];
         [downBGView addSubview:flagBtn];
         

+ 105 - 6
双子星云手机/Class/BuyPhone/BuyVIPViewController.m

@@ -10,12 +10,24 @@
 #import "PackageListScrollView.h"
 #import "PayTypeView.h"
 #import "VIPFunctForBuyView.h"
+#import "PhonePackageModel.h"
+#import "PlayResultViewController.h"
+#import "NewPeopleWelfareViewController.h"
+#import "NoEnoughTimeViewController.h"
+#import "UseAccountManage.h"
+#import "CloudPhoneAPI.h"
+#import "PhonePackageModel.h"
+#import "WXApi.h"
+#import "RSATool.h"
+#import "SafeForKey.h"
 
 @interface BuyVIPViewController (){
     BuyVipTopView *buyVipTopView;
     PackageListScrollView *packageListScrollView;
     PayTypeView *payTypeView;
     VIPFunctForBuyView *vipFunctForBuyView;
+    
+    PhonePackageDataModel *phonePackageDataModel;
 }
 
 @end
@@ -25,17 +37,38 @@
 - (void)viewDidLoad {
     [super viewDidLoad];
     // Do any additional setup after loading the view.
+    if (@available(iOS 11.0, *)) {  // 兼容低版本ios
+        [self setNeedsUpdateOfHomeIndicatorAutoHidden];
+    }
     
     [self drawAnyView];
+    
+    /*请求套餐数据*/
+    [[UseAccountManage shareInstance] CommonPostCallBackCode:PostPhonePackageInfoAPI
+                                                      Params:[NSDictionary new]
+                                                     success:^(id  _Nonnull responseObject) {
+        
+        self->phonePackageDataModel = [[PhonePackageDataModel alloc] initWithDictionary:responseObject error:nil];
+        
+        if (self->phonePackageDataModel.status.integerValue == 0){
+            [self drawPackageVew];
+        }
+    }
+                                                     failure:^(NSError * _Nonnull error) {
+        ;
+    }];
 }
 
 - (void)drawAnyView{
     [self.view setBackgroundColor:HWF5F7FAColor];
+    [[UIApplication sharedApplication] setStatusBarHidden:NO];
     [self.toolBar setHidden:YES];
     [self.navigationBar setHidden:YES];
     [self.navBarBGView setHidden:NO];
     [self.titleLabel setText:NSLocalizedString(@"buy_vip_title",nil)];
-    
+}
+
+- (void)drawPackageVew{
     /*头部视图*/
     buyVipTopView = [[BuyVipTopView alloc] init];
     [self.view addSubview:buyVipTopView];
@@ -47,6 +80,13 @@
     }];
     [buyVipTopView setImage:[UIImage imageNamed:@"buy_vip_top_bj"]];
     
+    NSString *leftStr = NSLocalizedString(@"buy_vip_top_vaildtime",nil);
+    NSString *timeStr = phonePackageDataModel.data.exceptTime;
+    if (!timeStr || timeStr.length < 1){
+        timeStr = NSLocalizedString(@"buy_vip_buy_no_vaildtime",nil);
+    }
+    [buyVipTopView.vaildTimeLabel setText:[leftStr stringByAppendingString:timeStr]];
+    
     /*底部购买按钮*/
     CGFloat w_btn = SCREEN_W - 2*15.f;
     UIButton *buyBtn = [[UIButton alloc] init];
@@ -106,7 +146,9 @@
     [packageListScrollView setShowsHorizontalScrollIndicator:NO];
     [packageListScrollView setUserInteractionEnabled:YES];
     [middleScr.panGestureRecognizer requireGestureRecognizerToFail:packageListScrollView.panGestureRecognizer ];
-    packageListScrollView.packageModelAry = @[@"1111",@"2222",@"3333",@"4444",@"5555",@"6666",@"7777"];
+    
+    packageListScrollView.packageModelAry = [[NSMutableArray alloc] initWithArray:phonePackageDataModel.data.menuRuleVOList];
+    
     /*支付方式*/
     payTypeView = [[PayTypeView alloc] init];
     [payTypeView setBackgroundColor:[UIColor whiteColor]];
@@ -119,16 +161,15 @@
         make.top.equalTo(packageListScrollView.mas_bottom).offset(0);
     }];
     
-    NSArray *titleAry = @[@"11111",@"222222",@"33333",@"44444",@"5555",@"6666"];
     /*会员特权*/
-    vipFunctForBuyView = [[VIPFunctForBuyView alloc] initWithFunAry:titleAry];
+    vipFunctForBuyView = [[VIPFunctForBuyView alloc] initWithFunAry:phonePackageDataModel.data.privilegeList];
     [vipFunctForBuyView setBackgroundColor:[UIColor whiteColor]];
     [vipFunctForBuyView.layer setCornerRadius:8.f];
     [middleScr addSubview:vipFunctForBuyView];
     
     /*计算高度*/
 //    全高131
-    NSInteger funAryCount = titleAry.count;
+    NSInteger funAryCount = phonePackageDataModel.data.privilegeList.count;
     CGFloat h_vipFunctForBuyView = 131.f;
     if (funAryCount <= 2){
         h_vipFunctForBuyView = 65.f;
@@ -156,7 +197,65 @@
 }
 
 - (void)buyBtnPressed{
-    ;
+    if (payTypeView.selectPayType == 0)/*微信*/{
+        if(![WXApi isWXAppInstalled]){
+            [[iToast makeText:@"未安装微信,请先安装微信"] show];
+            return;
+        }
+    }
+    
+    PhonePackageModel *model = [phonePackageDataModel.data.menuRuleVOList objectAtIndex:packageListScrollView.selectIndex];
+    NSMutableDictionary *params = [NSMutableDictionary dictionary];
+    [params setObject:@(model.ID) forKey:@"mealId"];
+    [params setObject:@(0) forKey:@"mealType"];
+    [params setObject:@(0) forKey:@"couponId"];
+    [params setObject:@(1) forKey:@"quantity"];
+    [params setObject:@(0) forKey:@"userCardId"];
+    [params setObject:@"VIP" forKey:@"phoneType"];
+    [params setObject:@(0) forKey:@"automaticRenewal"];
+    
+    if (payTypeView.selectPayType == 0){
+        [params setObject:@(2) forKey:@"payType"];
+    }else{
+        [params setObject:@(1) forKey:@"payType"];
+    }
+    [params setObject:[NSNumber numberWithFloat:model.actualPrice] forKey:@"totalAmount"];
+    [params setObject:@(1) forKey:@"buyType"];
+    NSString *jsonStr = [RSATool sortArrWithDictionary:params];
+    NSString *signStr = [RSATool RSASignEncrypt:jsonStr key:SignKey];
+    signStr = [RSATool deleteNewlineCharactersWithString:signStr];
+    [params setObject:signStr forKey:@"sign"];
+    [self showNewIndicatorWithCanBack:YES canTouch:NO];
+    [[UseAccountManage shareInstance] CommonPostCallBackCode:PostCreateOrderAPI
+                                                      Params:params
+                                                     success:^(id  _Nonnull responseObject) {
+        [self removeNewIndicator];
+        
+        if (CODE == 0){
+            NSDictionary *data = [responseObject safeDictionaryForKey:@"data"];
+            NSString *orderNum = [data safeStringForKey:@"orderNum"];
+            PlayResultViewController *nextVC = [[PlayResultViewController alloc] init];
+            nextVC.orderNum = orderNum;
+            nextVC.selectPayType = self->payTypeView.selectPayType;
+            [self.navigationController pushViewController:nextVC animated:YES];
+        }
+    }
+                                                     failure:^(NSError * _Nonnull error) {
+        [self removeNewIndicator];
+    }];
+//#define PostCreateOrderAPI        @"/api/pay/v1/order/create"/*创建订单*/
+//
+//#define GetPayOrderAPI            @"/api/pay/v1/order/closeOrder"/*拉起订单支付*/
+    
+//    PlayResultViewController *nextVC = [[PlayResultViewController alloc] init];
+//    [self.navigationController pushViewController:nextVC animated:YES];
+    
+//    /*调试UI*/
+//    NoEnoughTimeViewController *nextVC = [[NoEnoughTimeViewController alloc] init];
+//    nextVC.modalPresentationStyle = UIModalPresentationCustom;
+//    [self presentViewController:nextVC animated:YES completion:^{
+//        nextVC.view.superview.backgroundColor = [UIColor clearColor];
+//    }];
 }
 
 /*

+ 0 - 1
双子星云手机/Class/BuyPhone/BuyVipView/BuyVipTopView.m

@@ -45,7 +45,6 @@
     [string addAttributes:@{NSFontAttributeName: [UIFont boldSystemFontOfSize:24.f]} range:NSMakeRange(leftStr0.length, rightStr0.length)];
     [titleLabel setAttributedText:string];
     
-    
     vaildTimeLabel = [[UILabel alloc] init];
     [self addSubview:vaildTimeLabel];
     [vaildTimeLabel mas_makeConstraints:^(MASConstraintMaker *make) {

+ 2 - 1
双子星云手机/Class/BuyPhone/BuyVipView/PackageListScrollView.h

@@ -7,12 +7,13 @@
 //
 
 #import <UIKit/UIKit.h>
+#import "PhonePackageModel.h"
 
 NS_ASSUME_NONNULL_BEGIN
 
 @interface PackageListScrollView : UIScrollView<UIGestureRecognizerDelegate>
 
-@property(nonatomic,strong)NSMutableArray *packageModelAry;/*支付套餐*/
+@property(nonatomic,strong)NSMutableArray <PhonePackageModel *>*packageModelAry;/*支付套餐*/
 @property(nonatomic,assign)NSInteger selectIndex;/*选中的支付套餐*/
 
 @end

+ 1 - 0
双子星云手机/Class/BuyPhone/BuyVipView/PackageListScrollView.m

@@ -82,6 +82,7 @@
         
         packDetailBtn *tempView = [[packDetailBtn alloc] initWithFrame:(CGRectMake(x_index*(w_btn + 15.f), 16.f + y_index*(113.f + 16.f), w_btn, 113.f))];
         tempView.tag = 12345+nFori;
+        tempView.model = [self->packageModelAry objectAtIndex:nFori];
         [self addSubview:tempView];
         [tempView.layer setCornerRadius:8.f];
         tempView.clipsToBounds = YES;

+ 2 - 2
双子星云手机/Class/BuyPhone/BuyVipView/packDetailBtn.h

@@ -6,11 +6,11 @@
 //
 
 #import <UIKit/UIKit.h>
-
+#import "PhonePackageModel.h"
 NS_ASSUME_NONNULL_BEGIN
 
 @interface packDetailBtn : UIButton
-
+@property(nonatomic,strong)PhonePackageModel *model;
 @end
 
 NS_ASSUME_NONNULL_END

+ 83 - 0
双子星云手机/Class/BuyPhone/BuyVipView/packDetailBtn.m

@@ -6,8 +6,66 @@
 //
 
 #import "packDetailBtn.h"
+#import <Masonry.h>
+
+@interface packDetailBtn(){
+    UILabel *actPiceLabel;
+    UILabel *orgPiceLabel;
+    UILabel *vailTimeLabel;
+}
+
+@end
 
 @implementation packDetailBtn
+@synthesize model;
+
+- (id)init{
+    self = [super init];
+    
+    [self drawAnyView];
+    
+    return self;
+}
+
+- (id)initWithFrame:(CGRect)frame{
+    self= [super initWithFrame:frame];
+    
+    [self drawAnyView];
+    
+    return self;
+}
+
+- (void)drawAnyView{
+    actPiceLabel = [[UILabel alloc] init];
+    [actPiceLabel setTextColor:HWDD4E4EColor];
+    [actPiceLabel setTextAlignment:(NSTextAlignmentRight)];
+    [self addSubview:actPiceLabel];
+    [actPiceLabel mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.right.equalTo(self.mas_centerX).offset(25);
+        make.top.mas_equalTo(20.f);
+        make.height.mas_equalTo(50.f);
+    }];
+    
+    orgPiceLabel = [[UILabel alloc] init];
+    [orgPiceLabel setTextColor:HW666666Color];
+    [self addSubview:orgPiceLabel];
+    [orgPiceLabel mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.equalTo(actPiceLabel.mas_right).offset(5.f);
+        make.top.mas_equalTo(44.f);
+        make.height.mas_equalTo(18.f);
+    }];
+    
+    vailTimeLabel = [[UILabel alloc] init];
+    [vailTimeLabel setTextColor:HW0A132BColor];
+    [vailTimeLabel setTextAlignment:(NSTextAlignmentCenter)];
+    [self addSubview:vailTimeLabel];
+    [vailTimeLabel mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.mas_equalTo(20.f);
+        make.right.mas_equalTo(-20.f);
+        make.bottom.mas_equalTo(-20.f);
+        make.height.mas_equalTo(18.f);
+    }];
+}
 
 /*
 // Only override drawRect: if you perform custom drawing.
@@ -31,4 +89,29 @@
     }
 }
 
+- (void)setModel:(PhonePackageModel *)model{
+    self->model = model;
+    
+    /*真实价格*/
+    NSString *leftStr0 = @"¥";
+    NSString *rightStr0 = [NSString stringWithFormat:@"%.02lf",model.actualPrice];
+    NSString *showStr = [leftStr0 stringByAppendingString:rightStr0];
+    NSMutableAttributedString *string = [[NSMutableAttributedString alloc] initWithString:showStr attributes: @{NSFontAttributeName: [UIFont systemFontOfSize:13.f]}];
+    [string addAttributes:@{NSFontAttributeName: [UIFont boldSystemFontOfSize:32.f]} range:NSMakeRange(leftStr0.length, rightStr0.length)];
+    [actPiceLabel setAttributedText:string];
+
+    
+    NSString *leftStr1 = @"¥";
+    NSString *rightStr1 = [NSString stringWithFormat:@"%.02lf",model.originalPrice];
+    NSMutableAttributedString *string1 = [[NSMutableAttributedString alloc] initWithString:[leftStr1 stringByAppendingString:rightStr1] attributes: @{NSFontAttributeName: [UIFont systemFontOfSize:13.f],NSStrikethroughStyleAttributeName: [NSNumber numberWithInteger:NSUnderlineStyleSingle]}];
+    [orgPiceLabel setAttributedText:string1];
+    
+    /*有效期*/
+    NSString *leftStr2 = [NSString stringWithFormat:@"%ld",model.effectiveTime];
+    NSString *rightStr2 = NSLocalizedString(@"buy_vip_package_detail_day",nil);
+    [vailTimeLabel setText:[leftStr2 stringByAppendingString:rightStr2]];
+//    orgPiceLabel
+//    vailTimeLabel
+}
+
 @end

+ 58 - 0
双子星云手机/Class/BuyPhone/Model/PhonePackageModel.h

@@ -0,0 +1,58 @@
+//
+//  PhonePackageModel.h
+//  VclustersGemini
+//
+//  Created by APPLE on 2020/7/27.
+//  Copyright © 2020 APPLE. All rights reserved.
+//
+
+#import "SuperModel.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface PhonePackageModel : SuperModel
+
+@property (nonatomic,assign) CGFloat actualPrice;/*实际价格*/
+@property (nonatomic,assign) CGFloat originalPrice;/*原价*/
+@property (nonatomic,assign) NSInteger effectiveTime;/*时长*/
+@property (nonatomic,copy)   NSString *createTime;/*创建时间*/
+@property (nonatomic,copy)   NSString *title;/*标签*/
+@property (nonatomic,assign)   NSInteger ID;/*套餐id*/
+
+@end
+
+@protocol PhonePackageModel;
+@interface PhonePackageListModel : SuperModel
+
+@property (nonatomic,copy)   NSArray <PhonePackageModel>*menuRuleVOList;/*套餐列表*/
+
+/**
+ * @brief  特权信息
+ */
+@property(nonatomic, copy)NSArray *privilegeList;
+
+/**
+ * @brief 云机剩余时长 单位秒S
+ */
+@property (nonatomic, assign) NSInteger cloudPhoneTime;
+
+/**
+ * @brief  过期时间yyyy-mm-dd hh:MM:SS
+ */
+@property(nonatomic, copy)NSString *exceptSourceTime;
+
+/**
+ * @brief  过期时间yyyy-mm-dd
+ */
+@property(nonatomic, copy)NSString *exceptTime;
+
+@end
+
+@interface PhonePackageDataModel : SuperModel
+
+@property(nonatomic, copy)PhonePackageListModel *data;
+
+@end
+
+NS_ASSUME_NONNULL_END
+

+ 30 - 0
双子星云手机/Class/BuyPhone/Model/PhonePackageModel.m

@@ -0,0 +1,30 @@
+//
+//  PhonePackageModel.m
+//  VclustersGemini
+//
+//  Created by APPLE on 2020/7/27.
+//  Copyright © 2020 APPLE. All rights reserved.
+//
+
+#import "PhonePackageModel.h"
+
+@implementation PhonePackageModel
+
++(JSONKeyMapper *)keyMapper{
+    return [[JSONKeyMapper alloc]initWithDictionary:@{@"id":@"ID"}];
+}
+
+@end
+
+@implementation PhonePackageListModel
+
+
+@end
+
+@implementation PhonePackageDataModel
+
+
+@end
+
+
+

+ 16 - 0
双子星云手机/Class/BuyPhone/PayRecoderDetailViewController.h

@@ -0,0 +1,16 @@
+//
+//  PayRecoderDetailViewController.h
+//  隐私保护
+//
+//  Created by APPLE on 2023/8/29.
+//
+
+#import "BaseViewController.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface PayRecoderDetailViewController : BaseViewController
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 192 - 0
双子星云手机/Class/BuyPhone/PayRecoderDetailViewController.m

@@ -0,0 +1,192 @@
+//
+//  PayRecoderDetailViewController.m
+//  隐私保护
+//
+//  Created by APPLE on 2023/8/29.
+//
+
+#import "PayRecoderDetailViewController.h"
+
+@interface PayRecoderDetailViewController ()<UITableViewDelegate,UITableViewDataSource>
+
+@property (nonatomic, strong, nullable) UITableView *tableView;
+
+@end
+
+@implementation PayRecoderDetailViewController
+
+- (void)viewDidLoad {
+    [super viewDidLoad];
+    // Do any additional setup after loading the view.
+    [self drawAnyView];
+}
+
+- (void)drawAnyView{
+    [self.view setBackgroundColor:HWF5F7FAColor];
+    
+    [self.toolBar setHidden:YES];
+    [self.navigationBar setHidden:YES];
+    [self.navBarBGView setHidden:NO];
+    [self.titleLabel setText:NSLocalizedString(@"buy_vip_buy_recoder_cell_buy_detaile",nil)];
+    
+    [self.view addSubview:self.tableView];
+    [self.tableView mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.mas_equalTo(16);
+        make.right.mas_equalTo(-16);
+        make.bottom.mas_equalTo(0);
+        make.top.equalTo(self.navBarBGView.mas_bottom).offset(4);
+    }];
+    
+    [self.tableView setTableHeaderView:[self tableHeaderView]];
+}
+
+/*
+#pragma mark - Navigation
+
+// In a storyboard-based application, you will often want to do a little preparation before navigation
+- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
+    // Get the new view controller using [segue destinationViewController].
+    // Pass the selected object to the new view controller.
+}
+*/
+#pragma mark - 懒加载
+- (UITableView *)tableView{
+    if (!_tableView) {
+        _tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_W, SCREEN_H - TABBARHEIGHT) style:UITableViewStyleGrouped];
+        _tableView.delegate = self;
+        _tableView.dataSource = self;
+        _tableView.showsVerticalScrollIndicator = NO;
+        _tableView.showsHorizontalScrollIndicator = NO;
+//        _tableView.contentInset = UIEdgeInsetsMake(-20, 0, 0, 0);
+        [_tableView setSeparatorStyle:(UITableViewCellSeparatorStyleNone)];
+        [_tableView setSeparatorColor:[UIColor clearColor]];
+        [_tableView setBackgroundColor:[UIColor clearColor]];
+        [_tableView setTableFooterView:[UIView new]];
+        [_tableView setBounces:YES];
+        if (@available(iOS 15.0, *)) {
+            _tableView.sectionHeaderTopPadding = 0;
+        }
+
+    }
+    
+    return _tableView;
+}
+
+#pragma mark - 列表委托
+- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
+    return 1;
+}
+
+- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
+    return 5;
+}
+
+- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
+    
+    NSInteger row = indexPath.row;
+    static NSString *identifier = @"BuyRecoderDetailCell";
+    
+    UITableViewCell * cell =  [tableView dequeueReusableCellWithIdentifier:identifier];
+    cell.selectionStyle = UITableViewCellSelectionStyleNone;
+    if (!cell){
+        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:identifier];
+        [cell setSelectionStyle:UITableViewCellSelectionStyleNone];
+        [cell setBackgroundColor:[UIColor clearColor]];
+        [cell setAccessoryType:(UITableViewCellAccessoryNone)];
+        [cell.textLabel setTextColor:HW666666Color];
+        [cell.textLabel setFont:[UIFont systemFontOfSize:12]];
+        
+        [cell.detailTextLabel setTextColor:HW0A132BColor];
+        [cell.detailTextLabel setFont:[UIFont systemFontOfSize:12]];
+        [cell.detailTextLabel setTextAlignment:(NSTextAlignmentRight)];
+        [cell.contentView setBackgroundColor:HWFFFFFFColor];
+    }
+    cell.contentView.layer.mask = nil;
+    if (0 == row){
+        [cell.textLabel setText:NSLocalizedString(@"buy_vip_buy_recoder_detaile_buy_time",nil)];
+        [cell.detailTextLabel setText:@"2023-12-12 19:00:00"];
+    }else if (1 == row){
+        [cell.textLabel setText:NSLocalizedString(@"buy_vip_buy_recoder_detaile_expect_time",nil)];
+        [cell.detailTextLabel setText:@"2023-12-15 19:00:00"];
+    }else if (2 == row){
+        [cell.textLabel setText:NSLocalizedString(@"buy_vip_buy_recoder_detaile_order_number",nil)];
+        [cell.detailTextLabel setText:@"okrs0m9gyyoYS39733673768"];
+    }else if (3 == row){
+        [cell.textLabel setText:NSLocalizedString(@"buy_vip_buy_recoder_detaile_pay_states",nil)];
+        [cell.detailTextLabel setText:@"支付成功"];
+    }else if (4 == row){
+        [cell.textLabel setText:NSLocalizedString(@"buy_vip_buy_recoder_detaile_pay_type",nil)];
+        [cell.detailTextLabel setText:@"支付宝"];
+        UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(0, 0, SCREEN_W - 2*16.f, 35.f)
+                                                       byRoundingCorners:UIRectCornerBottomLeft | UIRectCornerBottomRight
+                                                             cornerRadii:CGSizeMake(8, 8)];
+        CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init];
+        maskLayer.frame = cell.contentView.bounds;
+        maskLayer.path = maskPath.CGPath;
+        cell.contentView.layer.mask = maskLayer;
+    }
+
+    return cell;
+}
+
+- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
+    return 35;
+}
+
+- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
+    [tableView deselectRowAtIndexPath:indexPath animated:YES];
+    
+    NSInteger row = indexPath.row;
+}
+
+- (UIView *)tableHeaderView{
+    UIView *headView = [[UIView alloc] initWithFrame:(CGRectMake(0, 0, SCREEN_W - 2*16.f, 52.f))];
+    [headView setBackgroundColor:HWFFFFFFColor];
+    
+    UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(0, 0, SCREEN_W - 2*16.f, 52.f)
+                                                   byRoundingCorners:UIRectCornerTopLeft | UIRectCornerTopRight
+                                                         cornerRadii:CGSizeMake(8, 8)];
+    CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init];
+    maskLayer.frame = headView.bounds;
+    maskLayer.path = maskPath.CGPath;
+    headView.layer.mask = maskLayer;
+    
+    /*订单时间相关*/
+    UILabel *vipTypeLabel = [[UILabel alloc] init];
+    [vipTypeLabel setText:@"VIP30天"];
+    [vipTypeLabel setFont:[UIFont boldSystemFontOfSize:16]];
+    [vipTypeLabel setTextColor:HW0A132BColor];
+    [headView addSubview:vipTypeLabel];
+    [vipTypeLabel mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.mas_equalTo(14.f);
+        make.top.mas_equalTo(16);
+    }];
+    /*价格标签*/
+    NSString *leftStr3 = @"¥";
+    NSString *rightStr3 = @"99.00";
+    UILabel *priceLabel = [[UILabel alloc] init];
+    [priceLabel setText:[leftStr3 stringByAppendingString:rightStr3]];
+    [priceLabel setFont:[UIFont boldSystemFontOfSize:16]];
+    [priceLabel setTextColor:HWDD4E4EColor];
+    [priceLabel setTextAlignment:(NSTextAlignmentRight)];
+    [headView addSubview:priceLabel];
+    [priceLabel mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.right.mas_equalTo(-14.f);
+        make.top.mas_equalTo(16);
+    }];
+    
+    /*分割线*/
+    UIView *line = [[UIView alloc] init];
+    [line setBackgroundColor:HW979797Color10];
+    [headView addSubview:line];
+    [line mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.mas_equalTo(14.f);
+        make.right.mas_equalTo(-14.f);
+        make.height.mas_equalTo(1.f);
+        make.bottom.mas_equalTo(0);
+    }];
+    
+    return headView;
+}
+
+@end

+ 16 - 0
双子星云手机/Class/BuyPhone/PayRecoderListViewController.h

@@ -0,0 +1,16 @@
+//
+//  PayRecoderListViewController.h
+//  隐私保护
+//
+//  Created by APPLE on 2023/8/29.
+//
+
+#import "BaseViewController.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface PayRecoderListViewController : BaseViewController
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 126 - 0
双子星云手机/Class/BuyPhone/PayRecoderListViewController.m

@@ -0,0 +1,126 @@
+//
+//  PayRecoderListViewController.m
+//  隐私保护
+//
+//  Created by APPLE on 2023/8/29.
+//
+
+#import "PayRecoderListViewController.h"
+#import "BuyRecoderListCell.h"
+#import "PayRecoderDetailViewController.h"
+
+@interface PayRecoderListViewController ()<UITableViewDelegate,UITableViewDataSource,BuyRecoderListCellDelegate>
+
+@property (nonatomic, strong, nullable) UITableView *tableView;
+@property (nonatomic, strong, nullable) NSMutableArray *tableDataSource;
+
+@end
+
+@implementation PayRecoderListViewController
+@synthesize tableDataSource;
+
+- (void)viewDidLoad {
+    [super viewDidLoad];
+    // Do any additional setup after loading the view.
+    [self drawAnyView];
+}
+
+- (void)drawAnyView{
+    [self.view setBackgroundColor:HWF5F7FAColor];
+    
+    [self.toolBar setHidden:YES];
+    [self.navigationBar setHidden:YES];
+    
+    [self.navBarBGView setHidden:NO];
+    [self.titleLabel setText:NSLocalizedString(@"buy_vip_buy_recoder_title",nil)];
+    
+    [self.view addSubview:self.tableView];
+    [self.tableView mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.mas_equalTo(0);
+        make.right.mas_equalTo(0);
+        make.bottom.mas_equalTo(0);
+        make.top.equalTo(self.navBarBGView.mas_bottom).offset(4);
+    }];
+}
+
+/*
+#pragma mark - Navigation
+
+// In a storyboard-based application, you will often want to do a little preparation before navigation
+- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
+    // Get the new view controller using [segue destinationViewController].
+    // Pass the selected object to the new view controller.
+}
+*/
+#pragma mark - 懒加载
+- (UITableView *)tableView{
+    if (!_tableView) {
+        _tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_W, SCREEN_H - TABBARHEIGHT) style:UITableViewStyleGrouped];
+        _tableView.delegate = self;
+        _tableView.dataSource = self;
+        _tableView.showsVerticalScrollIndicator = NO;
+        _tableView.showsHorizontalScrollIndicator = NO;
+        _tableView.contentInset = UIEdgeInsetsMake(-20, 0, 0, 0);
+        [_tableView setSeparatorStyle:(UITableViewCellSeparatorStyleNone)];
+        [_tableView setSeparatorColor:[UIColor clearColor]];
+        [_tableView setBackgroundColor:[UIColor clearColor]];
+        [_tableView setTableFooterView:[UIView new]];
+        [_tableView setBounces:YES];
+        if (@available(iOS 15.0, *)) {
+            _tableView.sectionHeaderTopPadding = 0;
+        }
+
+    }
+    
+    return _tableView;
+}
+
+#pragma mark - 列表委托
+- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
+    return 1;
+}
+
+- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
+//    return tableDataSource.count;
+    
+    /*测试*/
+    return 8;
+}
+
+- (BuyRecoderListCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
+    
+    NSInteger row = indexPath.row;
+    static NSString *identifier = @"BuyRecoderListCell";
+    
+    BuyRecoderListCell * cell =  [tableView dequeueReusableCellWithIdentifier:identifier];
+    cell.selectionStyle = UITableViewCellSelectionStyleNone;
+    if (!cell){
+        cell = [[BuyRecoderListCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:identifier];
+        cell.delegate = self;
+        [cell setSelectionStyle:UITableViewCellSelectionStyleNone];
+        [cell setBackgroundColor:[UIColor clearColor]];
+        [cell setAccessoryType:(UITableViewCellAccessoryNone)];
+    }
+
+    return cell;
+}
+
+- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
+    return 203;
+}
+
+- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
+    [tableView deselectRowAtIndexPath:indexPath animated:YES];
+    
+    NSInteger row = indexPath.row;
+
+}
+
+#pragma mark - 订单回调委托
+- (void)buyRecoderListCellOrderDetailBtnClick{
+    /*订单详情*/
+    PayRecoderDetailViewController *nextVC = [[PayRecoderDetailViewController alloc] init];
+    [self.navigationController pushViewController:nextVC animated:YES];
+}
+
+@end

+ 17 - 0
双子星云手机/Class/BuyPhone/PlayResultViewController.h

@@ -0,0 +1,17 @@
+//
+//  PlayResultViewController.h
+//  隐私保护
+//
+//  Created by APPLE on 2023/8/29.
+//
+
+#import "BaseViewController.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface PlayResultViewController : BaseViewController
+@property(nonatomic,copy)NSString *orderNum;
+@property(nonatomic,assign)NSInteger selectPayType;//0:微信 1支付宝
+@end
+
+NS_ASSUME_NONNULL_END

+ 440 - 0
双子星云手机/Class/BuyPhone/PlayResultViewController.m

@@ -0,0 +1,440 @@
+//
+//  PlayResultViewController.m
+//  隐私保护
+//
+//  Created by APPLE on 2023/8/29.
+//
+
+#import "PlayResultViewController.h"
+#import "PayRecoderListViewController.h"
+#import <Masonry.h>
+#import "CloudPhoneAPI.h"
+#import "UseAccountManage.h"
+#import "WXApi.h"
+#import "WXPayManager.h"
+#import <AlipaySDK/AlipaySDK.h>
+
+@interface PlayResultViewController ()<WXPayManagerDelegate>{
+    UIImageView *topImageView;
+    UILabel *topLabel;
+    UILabel *detailLabel;
+    UIButton *downBtn;
+    NSInteger payStates;/*支付状态  0:支付中  1:支付成功  2:支付失败*/
+}
+
+@end
+
+@implementation PlayResultViewController
+@synthesize orderNum;
+@synthesize selectPayType;
+
+- (void)viewDidLoad {
+    [super viewDidLoad];
+    // Do any additional setup after loading the view.
+    
+    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidBecomeActive:)  name:UIApplicationDidBecomeActiveNotification  object:nil];
+    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(SafepayResult:)  name:NotificationNameBySafepayResult  object:nil];
+    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(getPayDetailWithOrderNumWithPostN:)  name:NotNameAirpayOrWXorderNum  object:nil];
+    
+    [self drawAnyView];
+    
+    NSDictionary *parameters = [[NSDictionary alloc] initWithObjectsAndKeys:orderNum,@"orderNum", nil];
+    [[UseAccountManage shareInstance] CommonGetWithCallBackCode:GetPayOrderAPI
+                                                     Parameters:parameters
+                                                        success:^(id  _Nonnull responseObject) {
+        if (0 == CODE)
+        {
+            NSDictionary *dict = (NSDictionary *)responseObject;
+            NSDictionary *payConnection;
+            NSString *payConnectionStr = @"";
+            if ([[dict allKeys] containsObject:@"data"])
+            {
+                NSDictionary *info = [dict objectForKey:@"data"];
+                payConnection = [[NSDictionary alloc] initWithDictionary:info];
+                if (info && [[info allKeys] containsObject:@"connection"])
+                {
+                    payConnectionStr = [info objectForKey:@"connection"];
+                }
+            }
+            
+            HLog(@"\n-----payConnection = %@---",payConnection);
+            
+            if (0 == self->selectPayType){/*微信*/
+                /*调用微信接口*/
+                [self payWXWithDict:payConnection];
+            }else{/*支付宝*/
+                [self payWithPayAuthstring:payConnectionStr];
+            }
+        }
+    }
+                                                        failure:^(NSError * _Nonnull error) {
+        ;
+    }];
+    
+}
+
+- (void)drawAnyView{
+    payStates = 0;
+    [self.view setBackgroundColor:HWF5F7FAColor];
+    [self.toolBar setHidden:YES];
+    [self.navigationBar setHidden:YES];
+    
+    topImageView = [[UIImageView alloc] init];
+    [self.view addSubview:topImageView];
+    [topImageView mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.top.mas_equalTo(89.f + H_STATE_BAR);
+        make.width.mas_equalTo(100.f);
+        make.height.mas_equalTo(100.f);
+        make.centerX.equalTo(self.view.mas_centerX);
+    }];
+    
+    topLabel = [[UILabel alloc] init];
+    [self.view addSubview:topLabel];
+    [topLabel mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.top.equalTo(topImageView.mas_bottom).offset(5);
+        make.right.mas_equalTo(-20.f);
+        make.left.mas_equalTo(20.f);
+    }];
+    [topLabel setTextAlignment:(NSTextAlignmentCenter)];
+    [topLabel setFont:[UIFont systemFontOfSize:16]];
+    [topLabel setTextColor:HW0A132BColor];
+    [topLabel setText:NSLocalizedString(@"buy_vip_pay_result_paying",nil)];
+    
+    detailLabel = [[UILabel alloc] init];
+    [self.view addSubview:detailLabel];
+    [detailLabel mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.top.equalTo(topLabel.mas_bottom).offset(10);
+        make.right.mas_equalTo(-20.f);
+        make.left.mas_equalTo(20.f);
+    }];
+    [detailLabel setTextAlignment:(NSTextAlignmentCenter)];
+    [detailLabel setFont:[UIFont systemFontOfSize:13]];
+    [detailLabel setTextColor:HW666666Color];
+    [detailLabel setHidden:YES];
+//    detailLabel
+    
+    /*底部按钮*/
+    downBtn = [[UIButton alloc] init];
+    downBtn.frame = CGRectMake(0, 0, 260.f, 48.f);
+
+    // gradient
+    CAGradientLayer *gl = [CAGradientLayer layer];
+    gl.frame = CGRectMake(0,0,260.f,48.f);
+    gl.startPoint = CGPointMake(0, 0.5);
+    gl.endPoint = CGPointMake(1, 0.5);
+    gl.colors = @[(__bridge id)HW0CDEFDColor.CGColor, (__bridge id)HW058DFBColor.CGColor];
+    gl.locations = @[@(0), @(1.0f)];
+    
+    [downBtn.layer addSublayer:gl];
+    [downBtn addTarget:self action:@selector(downBtnBtnClick) forControlEvents:(UIControlEventTouchUpInside)];
+    [downBtn setTitle:NSLocalizedString(@"buy_vip_pay_result_back_vip",nil) forState:(UIControlStateNormal)];
+    [downBtn setTitleColor:[UIColor whiteColor] forState:(UIControlStateNormal)];
+    [downBtn.titleLabel setFont:[UIFont systemFontOfSize:16.f]];
+    [downBtn.layer setCornerRadius:8.f];
+    downBtn.clipsToBounds = YES;
+    [self.view addSubview:downBtn];
+    [downBtn mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.centerX.equalTo(self.view.mas_centerX);
+        make.width.mas_equalTo(260.f);
+        make.top.equalTo(detailLabel.mas_bottom).offset(30.f);
+        make.height.mas_equalTo(48.f);
+    }];
+    
+    [self updateView];
+}
+
+- (void)updateView{
+    if (payStates == 0){
+        [topImageView setImage:[UIImage imageNamed:@"buy_paying"]];
+        [topLabel setText:NSLocalizedString(@"buy_vip_pay_result_paying",nil)];
+        [detailLabel setHidden:YES];
+        [downBtn setTitle:NSLocalizedString(@"buy_vip_pay_result_back_vip",nil) forState:(UIControlStateNormal)];
+    }else if (payStates == 1){
+        [topImageView setImage:[UIImage imageNamed:@"buy_pay_success"]];
+        [topLabel setText:NSLocalizedString(@"buy_vip_pay_result_pay_success",nil)];
+        [detailLabel setHidden:NO];
+        [detailLabel setText:NSLocalizedString(@"buy_vip_pay_result_detail_success",nil)];
+        [downBtn setTitle:NSLocalizedString(@"buy_vip_pay_result_ge_recoder",nil) forState:(UIControlStateNormal)];
+    }else if (payStates == 2){
+        [topImageView setImage:[UIImage imageNamed:@"buy_pay_faile"]];
+        [topLabel setText:NSLocalizedString(@"buy_vip_pay_result_pay_faile",nil)];
+        [detailLabel setHidden:NO];
+        [detailLabel setText:NSLocalizedString(@"buy_vip_pay_result_detail_faile",nil)];
+        [downBtn setTitle:NSLocalizedString(@"buy_vip_pay_result_back_vip",nil) forState:(UIControlStateNormal)];
+    }
+}
+
+- (void)downBtnBtnClick{
+    if (payStates == 1){
+        /*跳入订单界面*/
+        PayRecoderListViewController *nextVC = [[PayRecoderListViewController alloc] init];
+        
+        [self.navigationController pushViewController:nextVC animated:YES];
+    }else{
+        /*返回上一级界面*/
+        [self.navigationController popViewControllerAnimated:YES];
+    }
+}
+
+/*
+#pragma mark - Navigation
+
+// In a storyboard-based application, you will often want to do a little preparation before navigation
+- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
+    // Get the new view controller using [segue destinationViewController].
+    // Pass the selected object to the new view controller.
+}
+*/
+
+- (void)payWXWithDict:(NSDictionary*)payInfo
+{
+    /*提取appid*/
+    if ([[payInfo allKeys] containsObject:@"appid"])
+    {
+//        NSString * universalLink = @"https://shuangzixing.com/";
+//        if ([CloudService rangeOfString:@"pre"].location != NSNotFound) {
+//            universalLink = @"https://shuangzixing.com/test";
+//        }
+        
+        BOOL isOk0 = [WXApi registerApp:[payInfo objectForKey:@"appid"] universalLink:wxuniversalLink];
+        
+        if (isOk0)
+        {
+            HLog(@"\n注册ok");
+        }
+        else
+        {
+            HLog(@"\n注册失败");
+        }
+    }
+    
+    //    appid = wx017ed8921f249e1a;
+    //    noncestr = 6bzhl5vMYgrFjQ9l;
+    //    package = "Sign=WXPay";
+    //    partnerid = 1544966281;
+    //    prepayid = wx25164144265218461862fd281495268600;
+    //    sign = E3CDA5E32067BF05F73ACBE12A1D1EB7;
+    //    timestamp = 1569400904;
+    
+    HLog(@"\npayInfo = %@",payInfo);
+    
+    PayReq *request = [[PayReq alloc] init];
+    if ([[payInfo allKeys] containsObject:@"partnerid"])
+    {
+        request.partnerId = [payInfo objectForKey:@"partnerid"];
+    }
+    
+    if ([[payInfo allKeys] containsObject:@"prepayid"])
+    {
+        request.prepayId = [payInfo objectForKey:@"prepayid"];
+    }
+    
+    if ([[payInfo allKeys] containsObject:@"package"])
+    {
+        request.package = [payInfo objectForKey:@"package"];
+    }
+    
+    if ([[payInfo allKeys] containsObject:@"noncestr"])
+    {
+        request.nonceStr = [payInfo objectForKey:@"noncestr"];
+    }
+    
+    if ([[payInfo allKeys] containsObject:@"timestamp"])
+    {
+        request.timeStamp = (int)[[payInfo objectForKey:@"timestamp"] integerValue];
+    }
+    
+    if ([[payInfo allKeys] containsObject:@"sign"])
+    {
+        request.sign = [payInfo objectForKey:@"sign"];
+    }
+    
+    //    BOOL isOk = [WXApi sendReq:request];
+    [WXApi sendReq:request completion:^(BOOL success) {
+        if (success)
+     {
+
+         [HWDataManager setStringWithKey:Const_AirpayOrWXorderNum value:self->orderNum];
+
+     }
+     else
+     {
+         KyoLog(@"\n调用失败");
+     }
+
+    }];
+
+
+    [WXPayManager shareInstance].delegate = self;
+}
+
+- (void)onResp:(BaseResp *)resp payManager:(WXPayManager *)payManager
+{
+//    [self removeGetingView];
+    switch (resp.errCode) {
+        case WXSuccess:
+        {
+            HLog(@"支付成功-PaySuccess,retcode = %d", resp.errCode);
+            /*跳入到成功界面*/
+            /*跳入到成功界面*/
+            payStates = 1;
+            [self updateView];
+        }
+            break;
+
+        default:
+        {
+            HLog(@"错误,retcode = %d, retstr = %@", resp.errCode,resp.errStr);
+            /*跳入到失败界面*/
+            payStates = 2;
+            [self updateView];
+        }
+            break;
+    }
+}
+
+
+- (void)getPayDetailWithOrderNumWithPostN:(NSNotification *)not
+{
+    NSString *resultNumber = [not object];
+    
+    
+    if (!orderNum)
+    {
+        [self removeNewIndicatorHaveStr];
+        /*跳入到成功界面*/
+        payStates = 1;
+        [self updateView];
+        
+        return;
+    }
+    
+    payStates = 1;
+    [self updateView];
+}
+
+- (void)SafepayResult:(NSNotification *)notification
+{
+    [UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleLightContent;
+    
+    NSDictionary *resultDict = [notification object];
+    
+    if ([[resultDict allKeys] containsObject:@"resultStatus"])
+    {
+        NSInteger resultStatus = [[resultDict objectForKey:@"resultStatus"] integerValue];
+        
+        NSString *memo = [resultDict objectForKey:@"memo"];
+        
+        
+        switch (resultStatus)
+        {
+            case 9000:/*订单支付成功*/
+                {
+                    payStates = 1;
+                    [self updateView];
+                }
+                break;
+                case 8000:/*正在处理中,支付结果未知(有可能已经支付成功),请查询商户订单列表中订单的支付状态*/
+                {
+                    payStates = 2;
+                    [self updateView];
+                }
+                break;
+                case 4000:/*订单支付失败*/
+                {
+                    payStates = 2;
+                    [self updateView];
+                }
+                break;
+                case 5000:/*重复请求*/
+                {
+                    payStates = 2;
+                    [self updateView];
+                }
+                break;
+                case 6001:/*用户中途取消*/
+                {
+                    payStates = 2;
+                    [self updateView];
+                }
+                break;
+                case 6002:/*网络连接出错*/
+                {
+                    payStates = 2;
+                    [self updateView];
+                }
+                break;
+                
+            default:/*未知错误*/
+            {
+                payStates = 2;
+                [self updateView];
+            }
+                break;
+        }
+    }
+}
+
+- (void)payWithPayAuthstring:(NSString *)payAuthstring
+{
+    [HWDataManager setStringWithKey:Const_AirpayOrWXorderNum value:orderNum];
+    
+    [[AlipaySDK defaultService] payOrder:payAuthstring fromScheme:AirPaySecret callback:^(NSDictionary *resultDic) {
+        HLog(@"reslut = %@",resultDic);
+        [UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleLightContent;
+        if ([[resultDic allKeys] containsObject:@"resultStatus"])
+        {
+            NSInteger resultStatus = [[resultDic objectForKey:@"resultStatus"] integerValue];
+            
+            NSString *memo = [resultDic objectForKey:@"memo"];
+            
+            switch (resultStatus)
+            {
+                case 9000:/*订单支付成功*/
+                    {
+                        self->payStates = 1;
+                        [self updateView];
+                    }
+                    break;
+                    case 8000:/*正在处理中,支付结果未知(有可能已经支付成功),请查询商户订单列表中订单的支付状态*/
+                    {
+                        self->payStates = 2;
+                        [self updateView];
+                    }
+                    break;
+                    case 4000:/*订单支付失败*/
+                    {
+                        self->payStates = 2;
+                        [self updateView];
+                    }
+                    break;
+                    case 5000:/*重复请求*/
+                    {
+                        self->payStates = 2;
+                        [self updateView];
+                    }
+                    break;
+                    case 6001:/*用户中途取消*/
+                    {
+                        self->payStates = 2;
+                        [self updateView];
+                    }
+                    break;
+                    case 6002:/*网络连接出错*/
+                    {
+                        self->payStates = 2;
+                        [self updateView];
+                    }
+                    break;
+                    
+                default:/*未知错误*/
+                {
+                    self->payStates = 2;
+                    [self updateView];
+                }
+                    break;
+            }
+        }
+    }];
+}
+@end

+ 25 - 0
双子星云手机/Class/BuyPhone/Recoder/BuyRecoderListCell.h

@@ -0,0 +1,25 @@
+//
+//  BuyRecoderListCell.h
+//  VclustersGemini
+//
+//  Created by 黄盛威 on 2020/10/19.
+//  Copyright © 2020 APPLE. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@protocol BuyRecoderListCellDelegate <NSObject>
+
+- (void)buyRecoderListCellOrderDetailBtnClick;
+
+@end
+
+@interface BuyRecoderListCell : UITableViewCell
+
+@property (nonatomic ,weak)id <BuyRecoderListCellDelegate> delegate;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 207 - 0
双子星云手机/Class/BuyPhone/Recoder/BuyRecoderListCell.m

@@ -0,0 +1,207 @@
+//
+//  BuyRecoderListCell.m
+//  VclustersGemini
+//
+//  Created by 黄盛威 on 2020/10/19.
+//  Copyright © 2020 APPLE. All rights reserved.
+//
+
+#import "BuyRecoderListCell.h"
+#import <Masonry.h>
+
+@interface BuyRecoderListCell(){
+    UILabel *orderNumberLabel;
+    UILabel *vipTypeLabel;
+    UILabel *buyTimeLabel;
+    UILabel *expantTimeLabel;
+    UILabel *priceLabel;
+}
+
+@end
+
+
+@implementation BuyRecoderListCell
+@synthesize delegate;
+
+- (void)awakeFromNib {
+    [super awakeFromNib];
+    // Initialization code
+}
+
+- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier{
+    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
+    
+    if (self){
+        [self drawView];
+    }
+    
+    return self;
+}
+
+- (void)drawView{
+    UIView *bgView = [[UIView alloc] init];
+    [bgView setBackgroundColor:HWFBFCFDColor];
+    [bgView.layer setCornerRadius:8.f];
+    [self.contentView addSubview:bgView];
+    [bgView mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.mas_equalTo(16.f);
+        make.right.mas_equalTo(-16.f);
+        make.bottom.mas_equalTo(-16.f);
+        make.top.mas_equalTo(0);
+    }];
+    
+    /*订单编号*/
+    UILabel *orderNumberTitleLabel = [[UILabel alloc] init];
+    [orderNumberTitleLabel setText:NSLocalizedString(@"buy_vip_buy_recoder_cell_oerder_title",nil)];
+    [orderNumberTitleLabel setFont:[UIFont systemFontOfSize:12]];
+    [orderNumberTitleLabel setTextColor:HW0A132BColor];
+    [bgView addSubview:orderNumberTitleLabel];
+    [orderNumberTitleLabel mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.mas_equalTo(16.f);
+        make.top.mas_equalTo(16);
+    }];
+    
+    orderNumberLabel = [[UILabel alloc] init];
+    [orderNumberLabel setText:@"wefe3f3fe3wf23r32"];
+    [orderNumberLabel setFont:[UIFont systemFontOfSize:12]];
+    [orderNumberLabel setTextColor:HW0A132BColor];
+    [bgView addSubview:orderNumberLabel];
+    [orderNumberLabel mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.equalTo(orderNumberTitleLabel.mas_right);
+        make.top.mas_equalTo(16);
+    }];
+    
+    /*复制按钮*/
+    UIButton *copyBtn = [[UIButton alloc] init];
+    [copyBtn setImage:[UIImage imageNamed:@"buy_copy"] forState:(UIControlStateNormal)];
+    [copyBtn addTarget:self
+                action:@selector(copyBtnPressed)
+      forControlEvents:(UIControlEventTouchUpInside)];
+    [bgView addSubview:copyBtn];
+    [copyBtn mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.equalTo(orderNumberLabel.mas_right);
+        make.top.mas_equalTo(16);
+        make.height.mas_equalTo(16);
+        make.width.mas_equalTo(16);
+    }];
+    
+    /*已付款标签*/
+    UILabel *havePayLabel = [[UILabel alloc] init];
+    [havePayLabel setText:NSLocalizedString(@"buy_vip_buy_recoder_cell_have_pay",nil)];
+    [havePayLabel setFont:[UIFont systemFontOfSize:12]];
+    [havePayLabel setTextColor:HW01B7EAColor];
+    [havePayLabel setTextAlignment:(NSTextAlignmentRight)];
+    [bgView addSubview:havePayLabel];
+    [havePayLabel mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.right.mas_equalTo(-16.f);
+        make.top.mas_equalTo(16);
+    }];
+    
+    /*分割线*/
+    UIView *line = [[UIView alloc] init];
+    [line setBackgroundColor:HW979797Color10];
+    [bgView addSubview:line];
+    [line mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.mas_equalTo(14.f);
+        make.right.mas_equalTo(-14.f);
+        make.height.mas_equalTo(1.f);
+        make.top.mas_equalTo(45);
+    }];
+    
+    /*订单时间相关*/
+    vipTypeLabel = [[UILabel alloc] init];
+    [vipTypeLabel setText:@"VIP30天"];
+    [vipTypeLabel setFont:[UIFont boldSystemFontOfSize:16]];
+    [vipTypeLabel setTextColor:HW0A132BColor];
+    [bgView addSubview:vipTypeLabel];
+    [vipTypeLabel mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.mas_equalTo(16.f);
+        make.top.equalTo(line.mas_bottom).offset(12);
+    }];
+    
+    NSString *leftStr1 = @"购买时间:";
+    NSString *rightStr1 = @"2023-12-12 19:00:00";
+    buyTimeLabel = [[UILabel alloc] init];
+    [buyTimeLabel setText:[leftStr1 stringByAppendingString:rightStr1]];
+    [buyTimeLabel setFont:[UIFont systemFontOfSize:12]];
+    [buyTimeLabel setTextColor:HW666666Color];
+    [bgView addSubview:buyTimeLabel];
+    [buyTimeLabel mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.mas_equalTo(16.f);
+        make.top.equalTo(vipTypeLabel.mas_bottom).offset(4);
+    }];
+    
+    NSString *leftStr2 = @"到期时间:";
+    NSString *rightStr2 = @"2023-12-13 19:00:00";
+    expantTimeLabel = [[UILabel alloc] init];
+    [expantTimeLabel setText:[leftStr2 stringByAppendingString:rightStr2]];
+    [expantTimeLabel setFont:[UIFont systemFontOfSize:12]];
+    [expantTimeLabel setTextColor:HW666666Color];
+    [bgView addSubview:expantTimeLabel];
+    [expantTimeLabel mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.mas_equalTo(16.f);
+        make.top.equalTo(buyTimeLabel.mas_bottom);
+    }];
+    
+    UIView *line1 = [[UIView alloc] init];
+    [line1 setBackgroundColor:HW979797Color10];
+    [bgView addSubview:line1];
+    [line1 mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.mas_equalTo(14.f);
+        make.right.mas_equalTo(-14.f);
+        make.height.mas_equalTo(1.f);
+        make.bottom.mas_equalTo(-58);
+    }];
+    
+    /*价格标签*/
+    NSString *leftStr3 = @"¥";
+    NSString *rightStr3 = @"99.00";
+    priceLabel = [[UILabel alloc] init];
+    [priceLabel setText:[leftStr3 stringByAppendingString:rightStr3]];
+    [priceLabel setFont:[UIFont boldSystemFontOfSize:16]];
+    [priceLabel setTextColor:HWDD4E4EColor];
+    [bgView addSubview:priceLabel];
+    [priceLabel mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.mas_equalTo(16.f);
+        make.top.equalTo(line1.mas_bottom).offset(16);
+    }];
+    
+    /*订单详情*/
+    UIButton *orderDetailBtn = [[UIButton alloc] init];
+    orderDetailBtn.frame = CGRectMake(0, 0, 72.f, 30.f);
+
+    // gradient
+    CAGradientLayer *gl = [CAGradientLayer layer];
+    gl.frame = CGRectMake(0,0,72.f,30.f);
+    gl.startPoint = CGPointMake(0, 0.5);
+    gl.endPoint = CGPointMake(1, 0.5);
+    gl.colors = @[(__bridge id)HW0CDEFDColor.CGColor, (__bridge id)HW058DFBColor.CGColor];
+    gl.locations = @[@(0), @(1.0f)];
+    
+    [orderDetailBtn.layer addSublayer:gl];
+    [orderDetailBtn addTarget:self action:@selector(orderDetailBtnClick) forControlEvents:(UIControlEventTouchUpInside)];
+    [orderDetailBtn setTitle:NSLocalizedString(@"buy_vip_buy_recoder_cell_see_detaile",nil) forState:(UIControlStateNormal)];
+    [orderDetailBtn setTitleColor:[UIColor whiteColor] forState:(UIControlStateNormal)];
+    [orderDetailBtn.titleLabel setFont:[UIFont systemFontOfSize:16.f]];
+    [orderDetailBtn.layer setCornerRadius:8.f];
+    orderDetailBtn.clipsToBounds = YES;
+    [bgView addSubview:orderDetailBtn];
+    [orderDetailBtn mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.right.mas_equalTo(-16.f);
+        make.width.mas_equalTo(72.f);
+        make.bottom.mas_equalTo(-16.f);
+        make.height.mas_equalTo(30.f);
+    }];
+}
+
+- (void)copyBtnPressed{
+    ;
+}
+
+- (void)orderDetailBtnClick{
+    if ([delegate respondsToSelector:@selector(buyRecoderListCellOrderDetailBtnClick)]){
+        [delegate buyRecoderListCellOrderDetailBtnClick];
+    }
+}
+
+@end

+ 39 - 0
双子星云手机/Class/BuyPhone/WXPayManager.h

@@ -0,0 +1,39 @@
+//
+//  WXPayManager.h
+//  VclustersGemini
+//
+//  Created by APPLE on 2019/9/25.
+//  Copyright © 2019 APPLE. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+#import "WXApi.h"
+NS_ASSUME_NONNULL_BEGIN
+
+@class WXPayManager;
+
+@protocol WXPayManagerDelegate <NSObject>
+
+@optional
+
+-(void)onResp:(BaseResp*)resp payManager:(WXPayManager*)payManager;
+
+- (void)getWXLoginParamsFromManager;
+
+@end
+
+@interface WXPayManager : NSObject <WXApiDelegate>
+
+/**微信登录参数*/
+@property (nonatomic, strong) NSMutableDictionary   *loginParams;
+
+@property (nonatomic,weak)id <WXPayManagerDelegate> delegate;
+
++(WXPayManager *)shareInstance;
+
+/**微信授权登录*/
+- (void)authorizeWXLoginWithVC:(UIViewController *)vc;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 85 - 0
双子星云手机/Class/BuyPhone/WXPayManager.m

@@ -0,0 +1,85 @@
+//
+//  WXPayManager.m
+//  VclustersGemini
+//
+//  Created by APPLE on 2019/9/25.
+//  Copyright © 2019 APPLE. All rights reserved.
+//
+
+#import "WXPayManager.h"
+#import "UseAccountManage.h"
+
+static WXPayManager *shareInstance = nil;
+
+
+@interface WXPayManager ()<WXApiDelegate>
+{
+    ;
+}
+@end
+
+
+@implementation WXPayManager
+@synthesize delegate;
+
++(WXPayManager *)shareInstance
+{
+    static dispatch_once_t onceToken;
+    
+    dispatch_once(&onceToken, ^{
+        shareInstance = [[WXPayManager alloc]init];
+        
+    });
+    
+    return shareInstance;
+}
+
+
+-(void)onReq:(BaseReq*)req
+{
+    ;
+}
+
+
+-(void)onResp:(BaseResp*)resp
+{
+//    WXSuccess           = 0,    /**< 成功    */
+//    WXErrCodeCommon     = -1,   /**< 普通错误类型    */
+//    WXErrCodeUserCancel = -2,   /**< 用户点击取消并返回    */
+//    WXErrCodeSentFail   = -3,   /**< 发送失败    */
+//    WXErrCodeAuthDeny   = -4,   /**< 授权失败    */
+//    WXErrCodeUnsupport  = -5,   /**< 微信不支持    */
+    
+    if([resp isKindOfClass:[PayResp class]]){ // 微信支付
+        //支付返回结果,实际支付结果需要去微信服务器端查询
+        NSString *strMsg = [NSString stringWithFormat:@"支付结果"];
+        
+        if ([delegate respondsToSelector:@selector(onResp:payManager:)])
+        {
+            [delegate onResp:resp payManager:self];
+        }
+    }
+}
+
+#pragma mark 微信登录
+// 1、sendAuthReq向微信发送请求
+- (void)authorizeWXLoginWithVC:(UIViewController *)vc {
+    
+    SendAuthReq *req = [[SendAuthReq alloc] init];
+    req.scope = @"snsapi_userinfo";
+    req.state = @"App";
+    [WXApi sendAuthReq:req viewController:vc delegate:[WXPayManager shareInstance] completion:^(BOOL success) {
+        ;
+    }];
+}
+
+
+#pragma mark 懒加载
+- (NSMutableDictionary *)loginParams {
+    if (!_loginParams) {
+        _loginParams = [NSMutableDictionary dictionary];
+    }
+    return _loginParams;;
+}
+
+@end

+ 23 - 0
双子星云手机/CloudPlayer/AlertVC/NewPeopleWelfareViewController.h

@@ -0,0 +1,23 @@
+//
+//  NewPeopleWelfareViewController.h
+//  隐私保护
+//
+//  Created by APPLE on 2023/8/30.
+//
+
+#import "BaseViewController.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@protocol NewPeopleWelfareViewControllerDelegate <NSObject>
+
+- (void)downBtnBtnClickPressed;
+
+@end
+
+@interface NewPeopleWelfareViewController : BaseViewController
+@property (nonatomic,weak)id <NewPeopleWelfareViewControllerDelegate> delegate;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 169 - 0
双子星云手机/CloudPlayer/AlertVC/NewPeopleWelfareViewController.m

@@ -0,0 +1,169 @@
+//
+//  NewPeopleWelfareViewController.m
+//  隐私保护
+//
+//  Created by APPLE on 2023/8/30.
+//
+
+#import "NewPeopleWelfareViewController.h"
+#import <Masonry.h>
+
+@interface NewPeopleWelfareViewController ()
+
+@end
+
+@implementation NewPeopleWelfareViewController
+@synthesize delegate;
+
+- (void)viewDidLoad {
+    [super viewDidLoad];
+    // Do any additional setup after loading the view.
+    
+    [self drawAnyView];
+}
+
+- (void)drawAnyView{
+    [self.view setBackgroundColor:HW000000Color60];
+    
+    [self.toolBar setHidden:YES];
+    [self.navigationBar setHidden:YES];
+    
+    UIImageView *alertBg = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"new_people_welfare_bg"]];
+    [alertBg setUserInteractionEnabled:YES];
+    [self.view addSubview:alertBg];
+    [alertBg mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.centerY.equalTo(self.view.mas_centerY).offset(-30*HAUTOSCALE);
+        make.centerX.equalTo(self.view.mas_centerX);
+        make.width.mas_equalTo(324);
+        make.height.mas_equalTo(323);
+    }];
+    
+    /*新人福利*/
+    UILabel *topLabel = [[UILabel alloc] init];
+    [topLabel setText:NSLocalizedString(@"new_people_welfare_title",nil)];
+    [topLabel setTextColor:HW0458E3Color];
+    [topLabel setFont:[UIFont boldSystemFontOfSize:26.f]];
+    [alertBg addSubview:topLabel];
+    [topLabel mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.top.mas_equalTo(41.f);
+        make.left.mas_equalTo(40.f);
+    }];
+    
+    NSInteger  welfareDay = 3;
+    NSString *leftStr = @"赠送您";
+    NSString *medileStr = @"三天";
+    NSString *rightStr = @"的试用会员";
+    
+    UILabel *detaileLabel = [[UILabel alloc] init];
+    [detaileLabel setFont:[UIFont boldSystemFontOfSize:12]];
+    [alertBg addSubview:detaileLabel];
+    [detaileLabel mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.top.mas_equalTo(76.f);
+        make.left.mas_equalTo(40.f);
+    }];
+    NSString *showStr = [[leftStr stringByAppendingString:medileStr] stringByAppendingString:rightStr];
+    NSMutableAttributedString *string = [[NSMutableAttributedString alloc] initWithString:showStr attributes: @{NSForegroundColorAttributeName:HW2F3972Color}];
+    
+    [string addAttributes:@{NSForegroundColorAttributeName:HWDD4E4EColor} range:NSMakeRange(leftStr.length, medileStr.length)];
+    [detaileLabel setAttributedText:string];
+    
+    UIImageView *alertMiddleBg = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"new_people_welfare_middle_bg"]];
+    [alertBg addSubview:alertMiddleBg];
+    [alertMiddleBg mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.top.mas_equalTo(120.f);
+        make.centerX.equalTo(alertBg.mas_centerX);
+        make.width.mas_equalTo(240);
+        make.height.mas_equalTo(33);
+    }];
+    
+    /*会员特权*/
+    UILabel *middleTopLabel = [[UILabel alloc] init];
+    [middleTopLabel setTextColor:HWFFFFFFColor];
+    [middleTopLabel setFont:[UIFont systemFontOfSize:12.f]];
+    [middleTopLabel setTextAlignment:(NSTextAlignmentCenter)];
+    [alertBg addSubview:middleTopLabel];
+    [middleTopLabel mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.top.mas_equalTo(126.f);
+        make.centerX.equalTo(alertBg.mas_centerX);
+    }];
+    [middleTopLabel setText:NSLocalizedString(@"buy_home_fun_title",nil)];
+    
+    /*功能列表*/
+    NSArray *titleAry = @[@"11111",@"22222",@"33333",@"444444",@"5555",@"66666"];
+    for (NSInteger nFori = 0; nFori < titleAry.count; nFori++) {
+        UIButton *flagBtn = [[UIButton alloc] init];
+        [flagBtn setImage:[UIImage imageNamed:@"buy_home_flag_fun"] forState:(UIControlStateNormal)];
+        [flagBtn setTitleColor:HW666666Color forState:(UIControlStateNormal)];
+        [flagBtn.titleLabel setFont:[UIFont systemFontOfSize:12.f]];
+        [flagBtn setTitle:[titleAry objectAtIndex:nFori] forState:(UIControlStateNormal)];
+        [flagBtn setContentHorizontalAlignment:(UIControlContentHorizontalAlignmentLeft)];
+        [alertBg addSubview:flagBtn];
+        
+        /*计算位置*/
+        NSInteger x_place = nFori%2;
+        NSInteger y_palce = nFori/2;
+        [flagBtn mas_makeConstraints:^(MASConstraintMaker *make) {
+            if (x_place == 0){
+                make.left.mas_equalTo(55.f);
+            }else{
+                make.left.equalTo(alertBg.mas_centerX).offset(10);
+            }
+            make.width.mas_equalTo(140);
+            make.top.mas_equalTo(157 + y_palce*(18.f+8.f));
+            make.height.mas_equalTo(18);
+        }];
+    }
+    
+    /*开始体验按钮*/
+    UIButton *downBtn = [[UIButton alloc] init];
+    downBtn.frame = CGRectMake(0, 0, 184.f, 36.f);
+
+    // gradient
+    CAGradientLayer *gl = [CAGradientLayer layer];
+    gl.frame = CGRectMake(0,0,184.f,36.f);
+    gl.startPoint = CGPointMake(0, 0.5);
+    gl.endPoint = CGPointMake(1, 0.5);
+    gl.colors = @[(__bridge id)HW0CDEFDColor.CGColor, (__bridge id)HW058DFBColor.CGColor];
+    gl.locations = @[@(0), @(1.0f)];
+    
+    [downBtn.layer addSublayer:gl];
+    [downBtn addTarget:self action:@selector(downBtnBtnClick) forControlEvents:(UIControlEventTouchUpInside)];
+    [downBtn setTitle:NSLocalizedString(@"new_people_welfare_start_use",nil) forState:(UIControlStateNormal)];
+    [downBtn setTitleColor:[UIColor whiteColor] forState:(UIControlStateNormal)];
+    [downBtn.titleLabel setFont:[UIFont systemFontOfSize:14.f]];
+    [downBtn.layer setCornerRadius:8.f];
+    downBtn.clipsToBounds = YES;
+    [alertBg addSubview:downBtn];
+    [downBtn mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.centerX.equalTo(self.view.mas_centerX);
+        make.width.mas_equalTo(184.f);
+        make.bottom.mas_equalTo(-20.f);
+        make.height.mas_equalTo(36.f);
+    }];
+}
+
+- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
+    [self dismissViewControllerAnimated:YES completion:^{
+        ;
+    }];
+}
+
+- (void)downBtnBtnClick{
+    [self dismissViewControllerAnimated:YES completion:^{
+        if ([self->delegate respondsToSelector:@selector(downBtnBtnClickPressed)]){
+            [self->delegate downBtnBtnClickPressed];
+        }
+    }];
+}
+
+/*
+#pragma mark - Navigation
+
+// In a storyboard-based application, you will often want to do a little preparation before navigation
+- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
+    // Get the new view controller using [segue destinationViewController].
+    // Pass the selected object to the new view controller.
+}
+*/
+
+@end

+ 27 - 0
双子星云手机/CloudPlayer/AlertVC/NoEnoughTimeViewController.h

@@ -0,0 +1,27 @@
+//
+//  NoEnoughTimeViewController.h
+//  隐私保护
+//
+//  Created by APPLE on 2023/8/30.
+//
+
+#import "BaseViewController.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@protocol NoEnoughTimeViewControllerDelegate <NSObject>
+
+- (void)exchangeBtnClickPressed;
+
+@end
+
+@interface NoEnoughTimeViewController : BaseViewController
+@property (nonatomic,weak)id <NoEnoughTimeViewControllerDelegate> delegate;
+@property (nonatomic ,strong)NSArray *privilegeList;
+
+/*云机到期会保留数据多少天*/
+@property (nonatomic ,assign)NSInteger expirationReminder;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 196 - 0
双子星云手机/CloudPlayer/AlertVC/NoEnoughTimeViewController.m

@@ -0,0 +1,196 @@
+//
+//  NoEnoughTimeViewController.m
+//  隐私保护
+//
+//  Created by APPLE on 2023/8/30.
+//
+
+#import "NoEnoughTimeViewController.h"
+#import <Masonry.h>
+
+@interface NoEnoughTimeViewController ()
+
+@end
+
+@implementation NoEnoughTimeViewController
+@synthesize delegate;
+@synthesize privilegeList;
+@synthesize expirationReminder;/*云机到期会保留数据多少天*/
+
+- (void)viewDidLoad {
+    [super viewDidLoad];
+    // Do any additional setup after loading the view.
+    
+    [self drawAnyView];
+}
+
+- (void)drawAnyView{
+    [self.view setBackgroundColor:HW000000Color60];
+    
+    [self.toolBar setHidden:YES];
+    [self.navigationBar setHidden:YES];
+        
+    UIImageView *alertBg = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"new_people_welfare_bg"]];
+    [alertBg setUserInteractionEnabled:YES];
+    [self.view addSubview:alertBg];
+    [alertBg mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.centerY.equalTo(self.view.mas_centerY).offset(-30*HAUTOSCALE);
+        make.centerX.equalTo(self.view.mas_centerX);
+        make.width.mas_equalTo(324);
+        make.height.mas_equalTo(323);
+    }];
+    
+//    @synthesize privilegeList;
+//    @synthesize expirationReminder;/*云机到期会保留数据多少天*/
+    
+    NSString *leftStr = NSLocalizedString(@"no_enough_time_vip_tips",nil);
+    NSString *medileStr = [NSString stringWithFormat:@"%ld",expirationReminder];
+    NSString *rightStr = NSLocalizedString(@"buy_vip_package_detail_day",nil);
+    
+    NSString *strShow = [[leftStr stringByAppendingString:medileStr] stringByAppendingString:rightStr];
+    
+    /*即将过期*/
+    UILabel *topLabel = [[UILabel alloc] init];
+    [topLabel setText:strShow];
+    [topLabel setTextColor:HW0458E3Color];
+    [topLabel setFont:[UIFont boldSystemFontOfSize:18.f]];
+    [alertBg addSubview:topLabel];
+    [topLabel mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.top.mas_equalTo(44.f);
+        make.left.mas_equalTo(40.f);
+    }];
+    
+    UILabel *detaileLabel = [[UILabel alloc] init];
+    [detaileLabel setFont:[UIFont boldSystemFontOfSize:12]];
+    [alertBg addSubview:detaileLabel];
+    [detaileLabel setTextColor:HW2F3972Color];
+    [detaileLabel setText:NSLocalizedString(@"no_enough_time_lost_vip",nil)];
+    [detaileLabel mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.top.mas_equalTo(76.f);
+        make.left.mas_equalTo(40.f);
+    }];
+    
+    UIImageView *alertMiddleBg = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"new_people_welfare_middle_bg"]];
+    [alertBg addSubview:alertMiddleBg];
+    [alertMiddleBg mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.top.mas_equalTo(120.f);
+        make.centerX.equalTo(alertBg.mas_centerX);
+        make.width.mas_equalTo(240);
+        make.height.mas_equalTo(33);
+    }];
+    
+    /*会员特权*/
+    UILabel *middleTopLabel = [[UILabel alloc] init];
+    [middleTopLabel setTextColor:HWFFFFFFColor];
+    [middleTopLabel setFont:[UIFont systemFontOfSize:12.f]];
+    [middleTopLabel setTextAlignment:(NSTextAlignmentCenter)];
+    [alertBg addSubview:middleTopLabel];
+    [middleTopLabel mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.top.mas_equalTo(126.f);
+        make.centerX.equalTo(alertBg.mas_centerX);
+    }];
+    [middleTopLabel setText:NSLocalizedString(@"buy_home_fun_title",nil)];
+    
+    /*功能列表*/
+    for (NSInteger nFori = 0; nFori < privilegeList.count; nFori++) {
+        UIButton *flagBtn = [[UIButton alloc] init];
+        [flagBtn setImage:[UIImage imageNamed:@"buy_home_flag_fun"] forState:(UIControlStateNormal)];
+        [flagBtn setTitleColor:HW666666Color forState:(UIControlStateNormal)];
+        [flagBtn.titleLabel setFont:[UIFont systemFontOfSize:12.f]];
+        [flagBtn setTitle:[privilegeList objectAtIndex:nFori] forState:(UIControlStateNormal)];
+        [flagBtn setContentHorizontalAlignment:(UIControlContentHorizontalAlignmentLeft)];
+        [alertBg addSubview:flagBtn];
+        
+        /*计算位置*/
+        NSInteger x_place = nFori%2;
+        NSInteger y_palce = nFori/2;
+        [flagBtn mas_makeConstraints:^(MASConstraintMaker *make) {
+            if (x_place == 0){
+                make.left.mas_equalTo(55.f);
+            }else{
+                make.left.equalTo(alertBg.mas_centerX).offset(10);
+            }
+            make.width.mas_equalTo(140);
+            make.top.mas_equalTo(157 + y_palce*(18.f+8.f));
+            make.height.mas_equalTo(18);
+        }];
+    }
+    
+    /*续费按钮*/
+    UIButton *exchangeBtn = [[UIButton alloc] init];
+    exchangeBtn.frame = CGRectMake(0, 0, 120.f, 36.f);
+
+    // gradient
+    CAGradientLayer *gl = [CAGradientLayer layer];
+    gl.frame = CGRectMake(0,0,120.f,36.f);
+    gl.startPoint = CGPointMake(0, 0.5);
+    gl.endPoint = CGPointMake(1, 0.5);
+    gl.colors = @[(__bridge id)HW0CDEFDColor.CGColor, (__bridge id)HW058DFBColor.CGColor];
+    gl.locations = @[@(0), @(1.0f)];
+    
+    [exchangeBtn.layer addSublayer:gl];
+    [exchangeBtn addTarget:self action:@selector(exchangeBtnClick) forControlEvents:(UIControlEventTouchUpInside)];
+    [exchangeBtn setTitle:NSLocalizedString(@"no_enough_time_exchange",nil) forState:(UIControlStateNormal)];
+    [exchangeBtn setTitleColor:[UIColor whiteColor] forState:(UIControlStateNormal)];
+    [exchangeBtn.titleLabel setFont:[UIFont systemFontOfSize:14.f]];
+    [exchangeBtn.layer setCornerRadius:8.f];
+    exchangeBtn.clipsToBounds = YES;
+    [alertBg addSubview:exchangeBtn];
+    [exchangeBtn mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.equalTo(self.view.mas_centerX).offset(6);
+        make.width.mas_equalTo(120.f);
+        make.bottom.mas_equalTo(-20.f);
+        make.height.mas_equalTo(36.f);
+    }];
+    
+    /*残忍拒绝*/
+    UIButton *noExchangeBtn = [[UIButton alloc] init];
+    [noExchangeBtn addTarget:self action:@selector(noExchangeBtnClick) forControlEvents:(UIControlEventTouchUpInside)];
+    [noExchangeBtn setTitle:NSLocalizedString(@"no_enough_time_no_exchange",nil) forState:(UIControlStateNormal)];
+    [noExchangeBtn setTitleColor:HW999999Color forState:(UIControlStateNormal)];
+    [noExchangeBtn.titleLabel setFont:[UIFont systemFontOfSize:14.f]];
+    [noExchangeBtn.layer setCornerRadius:8.f];
+    [noExchangeBtn setBackgroundColor:HWE3E8F1Color];
+    noExchangeBtn.clipsToBounds = YES;
+    [alertBg addSubview:noExchangeBtn];
+    [noExchangeBtn mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.right.equalTo(self.view.mas_centerX).offset(-6);
+        make.width.mas_equalTo(120.f);
+        make.bottom.mas_equalTo(-20.f);
+        make.height.mas_equalTo(36.f);
+    }];
+}
+
+//- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
+//    [self dismissViewControllerAnimated:YES completion:^{
+//        ;
+//    }];
+//}
+
+- (void)exchangeBtnClick{
+    [self dismissViewControllerAnimated:YES completion:^{
+        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
+            if ([self->delegate respondsToSelector:@selector(exchangeBtnClickPressed)]){
+                [self->delegate exchangeBtnClickPressed];
+            }
+        });
+    }];
+}
+
+- (void)noExchangeBtnClick{
+    [self dismissViewControllerAnimated:YES completion:^{
+        ;
+    }];
+}
+
+/*
+#pragma mark - Navigation
+
+// In a storyboard-based application, you will often want to do a little preparation before navigation
+- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
+    // Get the new view controller using [segue destinationViewController].
+    // Pass the selected object to the new view controller.
+}
+*/
+
+@end

+ 10 - 0
双子星云手机/CloudPlayer/CloudPhoneAPI.h

@@ -260,4 +260,14 @@
 #define SMSVerCodeRegisterAndLoginAPI  @"/api/user/v1/user/register"
 
 #define AppVersionCheckAPI       @"/api/publics/v1/client/upgrade/version"  /*app新版本检测API*/
+
+
+#define GetUserPhoneInfoAPI       @"/api/resources/user/cloud/getUserPhoneInfo"
+
+#define PostPhonePackageInfoAPI   @"/api/pay/v1/menu/rule/getInfo"
+
+#define PostCreateOrderAPI        @"/api/pay/v1/order/create"/*创建订单*/
+
+#define GetPayOrderAPI            @"/api/pay/v1/order/pullOrder"/*拉起订单支付*/
+
 #endif /* CloudPhoneAPI_h */

+ 50 - 0
双子星云手机/CloudPlayer/Model/PhoneTimeInfoModel.h

@@ -0,0 +1,50 @@
+//
+//  PhoneTimeInfoModel.h
+//  VclustersGemini
+//
+//  Created by APPLE on 2020/10/9.
+//  Copyright © 2020 APPLE. All rights reserved.
+//
+
+#import "SuperModel.h"
+#import "BGFMDB.h" //添加该头文件,本类就具有了存储功能.
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface PhoneTimeInfoModel : SuperModel
+
+/**
+ * @brief 云机剩余时长 单位秒S
+ */
+@property (nonatomic, assign) NSInteger cloudPhoneTime;
+
+/**
+ * @brief  赠送时长  单位秒S
+ */
+@property(nonatomic, assign)NSInteger experienceTime;
+
+/**
+ * @brief  弹窗提醒多少天回收云机
+ */
+@property(nonatomic, assign)NSInteger expirationReminder;
+
+/**
+ * @brief  特权信息
+ */
+@property(nonatomic, copy)NSArray *privilegeList;
+
+/**
+ * @brief  云机状态( 0:不存在 1:有效时间 2:有效时间不足 3:过期未回收 )
+ */
+@property(nonatomic, assign)NSInteger whetherPhoneStatus;
+
+
+@end
+
+@interface PhoneTimeInfoDataModel : SuperModel
+
+@property(nonatomic, copy)PhoneTimeInfoModel *data;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 25 - 0
双子星云手机/CloudPlayer/Model/PhoneTimeInfoModel.m

@@ -0,0 +1,25 @@
+//
+//  PhoneTimeInfoModel.m
+//  VclustersGemini
+//
+//  Created by APPLE on 2020/10/9.
+//  Copyright © 2020 APPLE. All rights reserved.
+//
+
+#import "PhoneTimeInfoModel.h"
+
+@implementation PhoneTimeInfoModel
+
+
++ (BOOL)propertyIsOptional:(NSString *)propertyName{
+    return YES;
+}
+
+
+@end
+
+@implementation PhoneTimeInfoDataModel
+
+
+@end
+

+ 65 - 38
双子星云手机/CloudPlayer/PlayerViewController.mm

@@ -45,6 +45,9 @@
 #import "P2PDataManager.h"
 
 #import "MySetViewController.h"
+#import "PhoneTimeInfoModel.h"
+#import "NoEnoughTimeViewController.h"
+#import "BuyVIPViewController.h"
 
 typedef enum : NSUInteger {
     BITRATE_EXTREME_SPEED = 2,//极速
@@ -77,6 +80,7 @@ NSString *ipConnect;
 RecoderManagerDelegate,
 AudioRecoderMamagerDelegate,
 RCLiveSteamManagerDelegate,
+NoEnoughTimeViewControllerDelegate,
 UITextFieldDelegate>
 {
 //    __block int _ihandle;
@@ -157,7 +161,44 @@ UITextFieldDelegate>
     if (@available(iOS 11.0, *)) {  // 兼容低版本ios
         [self setNeedsUpdateOfHomeIndicatorAutoHidden];
     }
-
+    
+    /*请求 云机弹窗时间*/
+    [[UseAccountManage shareInstance] CommonGetWithCallBackCode:GetUserPhoneInfoAPI
+                                                     Parameters:nil
+                                                        success:^(id  _Nonnull responseObject) {
+        PhoneTimeInfoDataModel *model = [[PhoneTimeInfoDataModel alloc] initWithDictionary:responseObject error:nil];
+        if (model.status.intValue == 0){
+            
+            if (model.data.experienceTime > 0){/*弹窗赠送信息*/
+                ;
+            }else{
+                if (model.data.whetherPhoneStatus == 0){/*云机被回收 直接开通*/
+                    [HWDataManager setBoolWithKey:Const_Have_No_VaildTime value:YES];
+                    [[NSNotificationCenter defaultCenter] postNotificationName:PhoneNoVailTimeNotification object:nil userInfo:[responseObject safeDictionaryForKey:@"data"]];
+                }else if (model.data.whetherPhoneStatus == 3){/*云机未被回收 无有效时间  续费*/
+                    [HWDataManager setBoolWithKey:Const_Have_No_VaildTime value:YES];
+                    [[NSNotificationCenter defaultCenter] postNotificationName:PhoneNoVailTimeNotification object:nil userInfo:[responseObject safeDictionaryForKey:@"data"]];
+                }else if (model.data.whetherPhoneStatus == 2){/*没有充足的有效时间*/
+                    [HWDataManager setBoolWithKey:Const_Have_No_VaildTime value:NO];
+                    /*没有充足的有效时间*/
+                    NoEnoughTimeViewController *nextVC = [[NoEnoughTimeViewController alloc] init];
+                    nextVC.delegate = self;
+                    nextVC.privilegeList = model.data.privilegeList;
+                    nextVC.expirationReminder = model.data.expirationReminder;
+                    nextVC.modalPresentationStyle = UIModalPresentationCustom;
+                    [self presentViewController:nextVC animated:YES completion:^{
+                        nextVC.view.superview.backgroundColor = [UIColor clearColor];
+                    }];
+                }else{/*有效时间充足*/
+                    [HWDataManager setBoolWithKey:Const_Have_No_VaildTime value:NO];
+                }
+            }
+        }
+    }
+                                                        failure:^(NSError * _Nonnull error) {
+        ;
+    }];
+    
     /*请求设备列表*/
     [[UseAccountManage shareInstance] CommonGetWithCallBackCode:LoadDeviceAPI Parameters:[NSMutableDictionary new] success:^(id  _Nonnull responseObject) {
         CloduPhoneListDataModel *model = [[CloduPhoneListDataModel alloc] initWithDictionary:responseObject error:nil];
@@ -1165,12 +1206,10 @@ UITextFieldDelegate>
 
 - (void)liveStreamManagerOutPut:(RCLiveSteamManager *)manager didOutPutAudioData:(NSData *)pcmData {
     @autoreleasepool {
-        if (mySelf&&!(mySelf->haveBack))
-        {
+        if (mySelf&&!(mySelf->haveBack)){
             [mySelf->connectLock lock];
 
-            if (!mySelf->pcmPlayer)
-            {
+            if (!mySelf->pcmPlayer){
                 mySelf->pcmPlayer = [[RCPCMPlayer alloc] initWithAudioBufferSize:4096 mSampleRate:44100 mChannelsPerFrame:2];
                 
                 mySelf.isNeedShowVoiceBar = NO;
@@ -1182,8 +1221,7 @@ UITextFieldDelegate>
                 });
             }
 
-            if (pcmData)
-            {
+            if (pcmData){
                 mySelf.isNeedShowVoiceBar = NO;
                 
                 [mySelf->pcmPlayer play:pcmData];
@@ -1192,7 +1230,7 @@ UITextFieldDelegate>
                     mySelf.isNeedShowVoiceBar = YES;
                 });
             }
-            
+        
             [mySelf->connectLock unlock];
         }
     }
@@ -1202,20 +1240,14 @@ UITextFieldDelegate>
     HLog(@"\n------状态回调---state = %d--", state);
     //[[VclCrash sharedInstance] writeContent:[NSString stringWithFormat:@"_connectDisconnect连接返回句柄 = %d--state--=%d-",ihandle,state]];
     
-    switch (state)
-    {
-        case 0:/*连接已释放*/
-        {
-
+    switch (state){
+        case 0:/*连接已释放*/{
         }
             break;
-        case 1:/*正在连接*/
-        {
-            
+        case 1:/*正在连接*/{
         }
             break;
-        case 2:/*连接成功*/
-        {
+        case 2:/*连接成功*/{
             HLog(@"\n-----_%s------SSSSSSSSSSS连接成功",__FUNCTION__);
             
             if (self.isFirstEnterPhone) {
@@ -1226,33 +1258,25 @@ UITextFieldDelegate>
                 
                 self.isFirstEnterPhone = NO;
             }
-
         }
             break;
-        case 3:/*正在渲染*/
-        {
-            
+        case 3:/*正在渲染*/{
         }
             break;
-        case 4:/*正在关闭*/
-        {
-            
+        case 4:/*正在关闭*/{
         }
             break;
-        case 5:/*已关闭*/
-        {
+        case 5:/*已关闭*/{
         }
             break;
-        case 6:
-        {
-                    mainBlock(^{
-                        [self showNewIndicator];
-                        [self tryAgain];
-                    });
+        case 6:{
+            mainBlock(^{
+                [self showNewIndicator];
+                [self tryAgain];
+            });
         }
             break;
-        case ConnectStateVerifyErr:
-        {
+        case ConnectStateVerifyErr:{
             HLog(@"\n------token异常----重新超分-----");
             /*鉴权失败  进行超分操作*/
             /*先清除当前的token*/
@@ -1282,8 +1306,6 @@ UITextFieldDelegate>
             [self extensionPhoneGetRBD];
         }
             break;
-            
-            
         default:
             break;
     }
@@ -1777,7 +1799,7 @@ NSDate *lastVideoTome;/*上一帧数据时间*/
     [[NSNotificationCenter defaultCenter] postNotificationName:PlayerViewControlBtnTouchEndNotification object:nil userInfo:nil];
     
     HLog(@"__________%s__________",__func__);
-
+    [[UIApplication sharedApplication] setStatusBarHidden:NO];
     MySetViewController *nextVC = [[MySetViewController alloc] init];
     [self.navigationController pushViewController:nextVC animated:YES];
     self.isNeedRecyclResource = NO;
@@ -3057,5 +3079,10 @@ static int  couneeee = 0;
     return YES;
 }
 
+- (void)exchangeBtnClickPressed{
+    [[UIApplication sharedApplication] setStatusBarHidden:NO];
+    BuyVIPViewController *nextVC = [[BuyVIPViewController alloc] init];
+    [self.navigationController pushViewController:nextVC animated:YES];
+}
 
 @end

+ 16 - 0
双子星云手机/CloudPlayer/View/PlayerLoadingView.h

@@ -0,0 +1,16 @@
+//
+//  PlayerLoadingView.h
+//  隐私保护
+//
+//  Created by APPLE on 2023/8/30.
+//
+
+#import <UIKit/UIKit.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface PlayerLoadingView : UIView
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 130 - 0
双子星云手机/CloudPlayer/View/PlayerLoadingView.m

@@ -0,0 +1,130 @@
+//
+//  PlayerLoadingView.m
+//  隐私保护
+//
+//  Created by APPLE on 2023/8/30.
+//
+
+#import "PlayerLoadingView.h"
+#import "FLAnimatedImageView.h"
+#import "FLAnimatedImage.h"
+#import <Masonry.h>
+
+@interface PlayerLoadingView(){
+    UIView               *wattingView;
+    BOOL                 needSowWattingView;
+    FLAnimatedImageView  *wattingViewImageView;
+    UILabel  *tipsLabel;
+}
+
+@end
+
+@implementation PlayerLoadingView
+
+/*
+// Only override drawRect: if you perform custom drawing.
+// An empty implementation adversely affects performance during animation.
+- (void)drawRect:(CGRect)rect {
+    // Drawing code
+}
+*/
+
+- (id)initWithFrame:(CGRect)frame{
+    self = [super initWithFrame:frame];
+    
+    [self drawAnyView];
+    
+    return self;
+}
+
+- (void)drawAnyView{
+    [self setBackgroundColor:HW111111Color];
+    
+    HLog(@"Tan +++++开");
+    self->wattingView =  [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
+    [self->wattingView setBackgroundColor:RGBACOLOR(0.f, 0.f, 0.f, 0.7)];
+    [self->wattingView.layer setCornerRadius:10.f];
+    self->wattingView.hidden = NO;
+    
+      FLAnimatedImage *image = [FLAnimatedImage animatedImageWithGIFData:[NSData dataWithContentsOfURL:[[NSBundle mainBundle] URLForResource:@"loadingWhiteGif" withExtension:@"gif"]]];
+      FLAnimatedImageView  *upView =  [[FLAnimatedImageView alloc] init];
+      [upView setFrame:CGRectMake((100 - 65.f)/2.f, (100 - 65.f)/2.f, 65.f, 65.f)];
+      [upView setContentMode:UIViewContentModeScaleAspectFill];
+      [upView setBackgroundColor:[ UIColor clearColor]];
+      upView.animatedImage = image;
+      [self->wattingView addSubview:upView];
+
+    [self addSubview:self->wattingView];
+    [self->wattingView mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.centerX.equalTo(self.mas_centerX);
+        make.top.mas_equalTo(239.f*HAUTOSCALE);
+        make.width.mas_equalTo(100.f);
+        make.height.mas_equalTo(100.f);
+    }];
+    
+    /*文字*/
+    tipsLabel = [[UILabel alloc] init];
+    [tipsLabel setTextColor:HWCFD1D4Color];
+    [tipsLabel setTextAlignment:(NSTextAlignmentCenter)];
+    [tipsLabel setFont:[UIFont systemFontOfSize:14.f]];
+    [self addSubview:tipsLabel];
+    [tipsLabel mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.mas_equalTo(20.f);
+        make.top.equalTo(wattingView.mas_bottom).offset(50);
+        make.right.mas_equalTo(-20.f);
+    }];
+    
+    /*重试按钮*/
+    UIButton *reTryBtn = [[UIButton alloc] init];
+    reTryBtn.frame = CGRectMake(0, 0, 126.f, 35.f);
+
+    // gradient
+    CAGradientLayer *gl = [CAGradientLayer layer];
+    gl.frame = CGRectMake(0,0,126.f,35.f);
+    gl.startPoint = CGPointMake(0, 0.5);
+    gl.endPoint = CGPointMake(1, 0.5);
+    gl.colors = @[(__bridge id)HW0CDEFDColor.CGColor, (__bridge id)HW058DFBColor.CGColor];
+    gl.locations = @[@(0), @(1.0f)];
+    
+    [reTryBtn.layer addSublayer:gl];
+    [reTryBtn addTarget:self action:@selector(reTryBtnClick) forControlEvents:(UIControlEventTouchUpInside)];
+    [reTryBtn setTitle:NSLocalizedString(@"player_retry",nil) forState:(UIControlStateNormal)];
+    [reTryBtn setTitleColor:[UIColor whiteColor] forState:(UIControlStateNormal)];
+    [reTryBtn.titleLabel setFont:[UIFont systemFontOfSize:14.f]];
+    [reTryBtn.layer setCornerRadius:8.f];
+    reTryBtn.clipsToBounds = YES;
+    [self addSubview:reTryBtn];
+    [reTryBtn mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.centerX.equalTo(self.mas_centerX);
+        make.width.mas_equalTo(126.f);
+        make.top.equalTo(tipsLabel.mas_bottom).offset(54.f);
+        make.height.mas_equalTo(35.f);
+    }];
+    
+    /*残忍拒绝*/
+    UIButton *otherBtn = [[UIButton alloc] init];
+    [otherBtn addTarget:self action:@selector(otherBtnClick) forControlEvents:(UIControlEventTouchUpInside)];
+    [otherBtn setTitle:NSLocalizedString(@"player_see_other",nil) forState:(UIControlStateNormal)];
+    [otherBtn setTitleColor:HW999999Color forState:(UIControlStateNormal)];
+    [otherBtn.titleLabel setFont:[UIFont systemFontOfSize:14.f]];
+    [otherBtn.layer setCornerRadius:8.f];
+    [otherBtn setBackgroundColor:HWE3E8F1Color];
+    otherBtn.clipsToBounds = YES;
+    [self addSubview:otherBtn];
+    [otherBtn mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.centerX.equalTo(self.mas_centerX);
+        make.width.mas_equalTo(126.f);
+        make.top.equalTo(reTryBtn.mas_bottom).offset(16.f);
+        make.height.mas_equalTo(35.f);
+    }];
+}
+
+- (void)reTryBtnClick{
+    ;
+}
+
+- (void)otherBtnClick{
+    ;
+}
+
+@end

二進制
双子星云手机/Vendor/AlipaySDK.framework/AlipaySDK


二進制
双子星云手机/Vendor/AlipaySDK.framework/AlipaySDK-inside-Info.plist


+ 56 - 0
双子星云手机/Vendor/AlipaySDK.framework/Headers/AFServiceCenter.h

@@ -0,0 +1,56 @@
+//
+//  AFServiceCenter.h
+//  AFServiceSDK
+//
+//  Created by jiajunchen on 02/01/2018.
+//  Copyright © 2018 antfin. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+@class AFServiceResponse;
+
+/**
+ SDK支持的业务枚举值
+
+ - AFServiceEInvoice: 电子发票
+ - AFServiceAuth: 账户授权
+ */
+typedef NS_ENUM(NSUInteger, AFService) {
+    AFServiceEInvoice,
+    AFServiceAuth,
+    AFServiceDeduct
+};
+
+
+extern NSString * const kAFServiceOptionBizParams;      // 钱包服务调用入参
+extern NSString * const kAFServiceOptionCallbackScheme; // 业务回跳当前app的scheme
+extern NSString * const kAFServiceOptionNotUseLanding;  // 不使用支付宝提示下载页做补偿,为true时需要商户自己处理用户未安装支付宝的情况
+extern NSString * const kAFServiceBizParamsKeyUrl;      // 独立签约入参url
+
+typedef void(^AFServiceResultBlock)(AFServiceResponse *response);
+
+@interface AFServiceCenter : NSObject
+
+/**
+ 调用钱包服务
+
+ @param service 业务service, 见AFService枚举值
+ @param params  参数Dictionary, key值详情参见kAFServiceOptionBizParams、kAFServiceOptionCallbackScheme注释
+ @param block   业务结果回调的block, block参数是AFServiceResponse类型,业务结果通过result属性获取,如果未用户未安装支付宝并且kAFServiceOptionNotUseLanding未设置为true,会使用H5landing页做补偿,这种情况下不会有block回调结果。
+ */
++ (void)callService:(AFService)service
+         withParams:(NSDictionary *)params
+      andCompletion:(AFServiceResultBlock)block;
+
+
+/**
+ 处理钱包服务回跳APP的URL
+
+ @param url 回跳URL
+ @param block 业务结果回掉的block,详情见调用接口入参上的block。注意此接口上的block只有在跳转钱包后,当前APP被系统回收的情况下回跳才生效
+ */
++ (void)handleResponseURL:(NSURL *)url
+           withCompletion:(AFServiceResultBlock)block;
+
+@end

+ 43 - 0
双子星云手机/Vendor/AlipaySDK.framework/Headers/AFServiceResponse.h

@@ -0,0 +1,43 @@
+//
+//  AFServiceResponse.h
+//  AFServiceSDK
+//
+//  Created by jiajunchen on 08/01/2018.
+//  Copyright © 2018 antfin. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+/**
+ 钱包服务调用结果状态吗
+
+ - AFResSuccess: 默认值,业务调用成功,结果数据参见result字段
+ - AFResInvalidService: service枚举值错误
+ - AFResInvalidURL: 钱包回跳URL错误
+ - AFResRepeatCall: 业务重复调用(3s内)
+ - AFResOpenURLErr: 跳转失败
+ */
+typedef NS_ENUM(NSUInteger, AFResCode) {
+    AFResSuccess = 0,
+    AFResInvalidService = 100,
+    AFResInvalidURL,
+    AFResRepeatCall,
+    AFResOpenURLErr,
+};
+
+
+@interface AFServiceResponse : NSObject
+
+
+/**
+ 业务调用状态吗
+ */
+@property (nonatomic, assign) AFResCode responseCode;
+
+
+/**
+ 业务结果Dictionary, 内容请参考具体业务方接入文档
+ */
+@property (readonly) NSDictionary *result;
+
+@end

+ 33 - 0
双子星云手机/Vendor/AlipaySDK.framework/Headers/APayAuthInfo.h

@@ -0,0 +1,33 @@
+//
+//  APAuthInfo.h
+//  APAuth
+//
+//  Created by antfin on 17-10-24.
+//  Copyright (c) 2017年 AntFin. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+@interface APayAuthInfo : NSObject
+
+@property(nonatomic, copy)NSString *appID;
+@property(nonatomic, copy)NSString *pid;
+@property(nonatomic, copy)NSString *redirectUri;
+
+/**
+ *  初始化AuthInfo
+ *
+ *  @param appIDStr     应用ID
+ *  @param pidStr       商户ID   可不填
+ *  @param uriStr       授权的应用回调地址  比如:alidemo://auth
+ *
+ *  @return authinfo实例
+ */
+- (id)initWithAppID:(NSString *)appIDStr
+                pid:(NSString *)pidStr
+        redirectUri:(NSString *)uriStr;
+
+- (NSString *)description;
+- (NSString *)wapDescription;
+
+@end

+ 223 - 0
双子星云手机/Vendor/AlipaySDK.framework/Headers/AlipaySDK.h

@@ -0,0 +1,223 @@
+//
+//  AlipaySDK.h
+//  AlipaySDK
+//
+//  Created by antfin on 17-10-24.
+//  Copyright (c) 2017年 AntFin. All rights reserved.
+//
+
+
+////////////////////////////////////////////////////////
+///////////////// 支付宝标准版本支付SDK ///////////////////
+///////// version:15.7.9  motify:2020.07.27///////////
+////////////////////////////////////////////////////////
+
+#import <UIKit/UIKit.h>
+#import "APayAuthInfo.h"
+#import "AFServiceCenter.h"
+#import "AFServiceResponse.h"
+
+typedef void(^CompletionBlock)(NSDictionary *resultDic);
+
+typedef enum {
+    ALIPAY_TIDFACTOR_IMEI,
+    ALIPAY_TIDFACTOR_IMSI,
+    ALIPAY_TIDFACTOR_TID,
+    ALIPAY_TIDFACTOR_CLIENTKEY,
+    ALIPAY_TIDFACTOR_VIMEI,
+    ALIPAY_TIDFACTOR_VIMSI,
+    ALIPAY_TIDFACTOR_CLIENTID,
+    ALIPAY_TIDFACTOR_APDID,
+    ALIPAY_TIDFACTOR_MAX
+} AlipayTidFactor;
+
+@interface AlipaySDK : NSObject
+
+/**
+ *  创建支付单例服务
+ *
+ *  @return 返回单例对象
+ */
++ (AlipaySDK *)defaultService;
+
+/**
+ *  用于设置SDK使用的window,如果没有自行创建window无需设置此接口
+ */
+@property (nonatomic, weak) UIWindow *targetWindow;
+
+//////////////////////////////////////////////////////////////////////////////////////////////
+//////////////////////////支付宝支付相关接口/////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////////////////////
+
+/**
+ *  支付接口
+ *
+ *  @param orderStr        支付订单信息字串
+ *  @param schemeStr       调用支付的app注册在info.plist中的scheme
+ *  @param completionBlock 支付结果回调Block,用于wap支付结果回调
+                           跳转支付宝支付时只有当processOrderWithPaymentResult接口的completionBlock为nil时会使用这个bolock
+ */
+- (void)payOrder:(NSString *)orderStr
+      fromScheme:(NSString *)schemeStr
+        callback:(CompletionBlock)completionBlock;
+
+/**
+ *  支付接口 v2
+ *
+ *  @param orderStr        支付订单信息字串
+ *  @param dynamicLaunch   是否使用动态配置策略跳转支付宝支付
+ *  @param schemeStr       调用支付的app注册在info.plist中的scheme
+ *  @param completionBlock 支付结果回调Block,用于wap支付结果回调
+ 跳转支付宝支付时只有当processOrderWithPaymentResult接口的completionBlock为nil时会使用这个bolock
+ */
+- (void)payOrder:(NSString *)orderStr
+   dynamicLaunch:(BOOL)dynamicLaunch
+      fromScheme:(NSString *)schemeStr
+        callback:(CompletionBlock)completionBlock;
+
+/**
+ *  处理支付宝app支付后跳回商户app携带的支付结果Url
+ *
+ *  @param resultUrl        支付宝app返回的支付结果url
+ *  @param completionBlock  支付结果回调 为nil时默认使用支付接口的completionBlock
+ */
+- (void)processOrderWithPaymentResult:(NSURL *)resultUrl
+                      standbyCallback:(CompletionBlock)completionBlock;
+
+/**
+ *  获取交易token。
+ *
+ *  @return 交易token,若无则为空。
+ */
+- (NSString *)fetchTradeToken;
+
+
+//////////////////////////////////////////////////////////////////////////////////////////////
+//////////////////////////支付宝授权 2.0 相关接口////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////////////////////
+
+/**
+ *  快登授权2.0
+ *
+ *  @param infoStr          授权请求信息字串
+ *  @param schemeStr        调用授权的app注册在info.plist中的scheme
+ *  @param completionBlock  授权结果回调,需要调用方在appDelegate中调用processAuth_V2Result:standbyCallback:方法获取授权结果
+ *                          若在授权过程中,调用方应用被系统终止则此block无效(此时会调用'processAuth_V2Result:standbyCallback:'传入的standbyCallback)
+ */
+- (void)auth_V2WithInfo:(NSString *)infoStr
+             fromScheme:(NSString *)schemeStr
+               callback:(CompletionBlock)completionBlock;
+
+/**
+ *  处理支付宝app授权后跳回商户app携带的授权结果Url
+ *
+ *  @param resultUrl        支付宝app返回的授权结果url
+ *  @param completionBlock  授权结果回调,用于处理跳转支付宝授权过程中商户APP被系统终止的情况
+ */
+- (void)processAuth_V2Result:(NSURL *)resultUrl
+             standbyCallback:(CompletionBlock)completionBlock;
+
+
+//////////////////////////////////////////////////////////////////////////////////////////////
+//////////////////////////支付宝授权 1.0 相关接口////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////////////////////
+
+
+/**
+ *  快登授权
+ *  @param authInfo         授权相关信息
+ *  @param completionBlock  授权结果回调,若在授权过程中,调用方应用被系统终止,则此block无效,
+                            需要调用方在appDelegate中调用processAuth_V2Result:standbyCallback:方法获取授权结果
+ */
+- (void)authWithInfo:(APayAuthInfo *)authInfo
+            callback:(CompletionBlock)completionBlock;
+
+/**
+ *  处理支付宝app授权后跳回商户app携带的授权结果Url
+ *
+ *  @param resultUrl        支付宝app返回的授权结果url
+ *  @param completionBlock  授权结果回调
+ */
+- (void)processAuthResult:(NSURL *)resultUrl
+          standbyCallback:(CompletionBlock)completionBlock;
+
+
+//////////////////////////////////////////////////////////////////////////////////////////////
+//////////////////////////支付宝 h5 支付转 native 支付接口////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////////////////////
+/**
+ *  从h5链接中获取订单串并支付接口(自版本15.4.0起,推荐使用该接口)
+ *
+ *  @param urlStr     拦截的 url string
+ *
+ *  @return YES为成功获取订单信息并发起支付流程;NO为无法获取订单信息,输入url是普通url
+ */
+- (BOOL)payInterceptorWithUrl:(NSString *)urlStr
+                   fromScheme:(NSString *)schemeStr
+                     callback:(CompletionBlock)completionBlock;
+
+
+
+//////////////////////////////////////////////////////////////////////////////////////////////
+//////////////////////////支付宝 tid 相关信息获取接口/////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////////////////////
+
+/**
+ *  获取当前tid相关信息
+ *
+ *  @return tid相关信息
+ */
+- (NSString*)queryTidFactor:(AlipayTidFactor)factor;
+
+
+
+//////////////////////////////////////////////////////////////////////////////////////////////
+//////////////////////////支付宝支付环境相关信息接口//////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////////////////////
+
+/**
+ *  是否已经使用过
+ *
+ *  @return YES为已经使用过,NO反之
+ */
+- (BOOL)isLogined;
+
+/**
+ *  获取当前版本号
+ *
+ *  @return 当前版本字符串
+ */
+- (NSString *)currentVersion;
+
+/**
+ *  測試所用,realse包无效
+ *
+ *  @param url  测试环境
+ */
+- (void)setUrl:(NSString *)url;
+
+/**
+ *  支付前主动更新本地配置
+ *
+ *  @param block 更新请求结果回调
+ */
+- (void)fetchSdkConfigWithBlock:(void(^)(BOOL success))block;
+
+
+typedef void(^APLogBlock)(NSString *log);
+
+/**
+*   接收AlipaySDK的log信息
+*
+*  @param logBlock 打印log的回调block
+*/
++ (void)startLogWithBlock:(APLogBlock)logBlock;
+
+/**
+*   停止输出log,会释放logBlock
+*
+*
+*/
++ (void)stopLog;
+
+@end

+ 65 - 0
双子星云手机/Vendor/RSATool.h

@@ -0,0 +1,65 @@
+/*
+ @author: ideawu
+ @link: https://github.com/ideawu/Objective-C-RSA
+*/
+
+#import <Foundation/Foundation.h>
+
+/**加密/解密 工具类 (AES RSA Base64 MD5)*/
+@interface RSATool : NSObject
+
+
+#pragma mark RSATool 自带方法
+// return base64 encoded string
++ (NSString *)encryptString:(NSString *)str publicKey:(NSString *)pubKey;
+// return raw data
++ (NSData *)encryptData:(NSData *)data publicKey:(NSString *)pubKey;
+// return base64 encoded string
++ (NSString *)encryptString:(NSString *)str privateKey:(NSString *)privKey;
+// return raw data
++ (NSData *)encryptData:(NSData *)data privateKey:(NSString *)privKey;
+
+// decrypt base64 encoded string, convert result to string(not base64 encoded)
++ (NSString *)decryptString:(NSString *)str publicKey:(NSString *)pubKey;
++ (NSData *)decryptData:(NSData *)data publicKey:(NSString *)pubKey;
++ (NSString *)decryptString:(NSString *)str privateKey:(NSString *)privKey;
++ (NSData *)decryptData:(NSData *)data privateKey:(NSString *)privKey;
+
+
+#pragma mark 封装加解密方法:RSA➕AES➕Base64➕MD5➕RSA
+/**AES加密 key-salt*/
++ (NSString *)AES128Encrypt:(NSString *)plainText key:(NSString *)key;
+/**AES解密 key-salt*/
++ (NSString *)AES128Decrypt:(NSString *)encryptText key:(NSString *)key;
+
+/**RSA加密-publicKey-公钥 (公钥加密 私钥解密)*/
++ (NSString *)RSAEncrypt:(NSString *)plainText key:(NSString *)publicKey;
+/**RSA解密-privateKey-私钥 (公钥加密 私钥解密)*/
++ (NSString *)RSADecrypt:(NSString *)encryptText key:(NSString *)privateKey;
+
+/**RSA私钥签名-privateKey-私钥 (私钥签名 公钥验签)*/
++ (NSString *)RSASignEncrypt:(NSString *)plainText key:(NSString *)privateKey;
+/**RSA公钥验签-publicKey-公钥(私钥签名 公钥验签)encryptText-密文 plainText-明文*/
++ (BOOL)RSASignDecrypt:(NSString *)encryptText Encrypt:(NSString *)plainText key:(NSString *)publicKey;
+
+/**base64加密*/
++ (NSString *)Base64Encrypt:(NSString *)plainText;
+/**base64解密*/
++ (NSString *)Base64Decrypt:(NSString *)encryptText;
+
+/**md5加密*/
++ (NSString *)md5Encrypt:(NSString *)plainText;
+
+#pragma mark  其他
+/**传入一个原始字典,依据ascii码从小到大排序,回传一个排好序的待签名字符串*/
++ (NSString *)sortArrWithDictionary:(NSDictionary *)dictionary;
+
+/**删除字符串里的换行符 \r 和 \n */
++ (NSString *)deleteNewlineCharactersWithString:(NSString *)text;
+
+#pragma mark  登录密码加密算法:MD5➕RSA
+//+ (NSString *)getRSAStringFrom:(NSString *)pwd;
+
++ (NSData *)sha256:(NSString *)str;
++ (NSMutableString *)sha256_64:(NSString *)str;
+@end

文件差異過大導致無法顯示
+ 841 - 0
双子星云手机/Vendor/RSATool.m


+ 43 - 2
双子星云手机/zh-Hans.lproj/Localizable.strings

@@ -103,8 +103,10 @@
 "buy_home_fun_title"   = "会员特权";
 
 "buy_home_cell_get_vip"   = "开通会员";
+"buy_home_cell_exchange_vip"   = "续费会员";
 "buy_home_cell_get_vip_detail"   = "开通会员尊享VIP权益";
 "buy_home_cell_get_vip_do"   = "去开通";
+"buy_home_cell_exchange_vip_do"   = "去续费";
 
 "buy_home_cell_get_vip_free_get"   = "免费领会员";
 "buy_home_cell_get_vip_invite"   = "去邀请";
@@ -114,6 +116,45 @@
 "buy_vip_top_title"   = "欢迎您,尊贵的";
 "buy_vip_top_vaildtime"   = "到期时间:";
 "buy_vip_top_buy_btn"   = "立即开通VIP";
+"buy_vip_package_detail_day"   = "天";
 
-//NSLocalizedString(@"buy_vip_top_buy_btn",nil)
-//NSLocalizedString(@"buy_vip_top_vaildtime",nil)
+"buy_vip_pay_result_paying"   = "支付中";
+"buy_vip_pay_result_pay_success"   = "支付成功";
+"buy_vip_pay_result_pay_faile"   = "支付失败";
+
+"buy_vip_pay_result_detail_success"   = "您已获得专属隐私空间,保障您的隐私安全";
+"buy_vip_pay_result_detail_faile"   = "请检查后重新支付";
+
+"buy_vip_pay_result_back_vip"   = "返回会员页面";
+"buy_vip_pay_result_ge_recoder"   = "查看购买记录";
+"buy_vip_buy_recoder_title"   = "购买记录";
+"buy_vip_buy_recoder_cell_oerder_title"   = "订单编号:";
+"buy_vip_buy_recoder_cell_have_pay"   = "已付款";
+"buy_vip_buy_recoder_cell_see_detaile"   = "查看详情";
+"buy_vip_buy_recoder_cell_buy_detaile"   = "购买详情";
+"buy_vip_buy_recoder_detaile_buy_time"   = "购买时间";
+"buy_vip_buy_recoder_detaile_expect_time"   = "到期时间";
+"buy_vip_buy_recoder_detaile_order_number"   = "订单号";
+"buy_vip_buy_recoder_detaile_pay_states"   = "支付状态";
+"buy_vip_buy_recoder_detaile_pay_type"   = "支付方式";
+"buy_vip_buy_no_vaildtime"   = "已到期";
+"buy_vip_buy_no_vaildtime"   = "已到期";
+"buy_vip_buy_dtat_will_lost"   = "你的数据即将丢失:";
+
+
+"new_people_welfare_title"   = "新人福利";
+"new_people_welfare_start_use"   = "开始体验";
+"no_enough_time_lost_vip"   = "即将失去以下特权";
+"no_enough_time_exchange"   = "立即续费";
+"no_enough_time_no_exchange"   = "残忍拒绝";
+"no_enough_time_vip_tips"   = "VIP有效期不足";
+
+"player_retry"   = "点击重试";
+"player_see_other"   = "看下其他功能";
+
+"other_comment_ok"         = "确定";
+
+
+
+//NSLocalizedString(@"buy_vip_buy_no_vaildtime",nil)
+//NSLocalizedString(@"buy_vip_package_detail_day",nil)