new_discount_controller.dart 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023
  1. import 'dart:io';
  2. import 'package:agile_pay/flutter_pay.dart';
  3. import 'package:apple_pay/apple_pay.dart';
  4. import 'package:carousel_slider/carousel_controller.dart';
  5. import 'package:carousel_slider/carousel_options.dart';
  6. import 'package:flutter/material.dart';
  7. import 'package:get/get.dart';
  8. import 'package:injectable/injectable.dart';
  9. import 'package:keyboard/base/base_controller.dart';
  10. import 'package:keyboard/data/bean/character_info.dart';
  11. import 'package:keyboard/data/repository/config_repository.dart';
  12. import 'package:keyboard/module/login/login_page.dart';
  13. import 'package:keyboard/module/store/new_discount/member_card_bean.dart';
  14. import 'package:keyboard/utils/method_chanel_ios_util.dart';
  15. import 'package:keyboard/widget/platform_util.dart';
  16. import '../../../data/api/response/user_info_response.dart';
  17. import '../../../data/bean/goods_info.dart';
  18. import '../../../data/bean/member_info.dart';
  19. import '../../../data/bean/pay_way_info.dart';
  20. import '../../../data/bean/wechat_payment_sign_bean.dart';
  21. import '../../../data/consts/constants.dart';
  22. import '../../../data/consts/error_code.dart';
  23. import '../../../data/consts/event_report.dart';
  24. import '../../../data/consts/payment_type.dart';
  25. import '../../../data/repository/account_repository.dart';
  26. import '../../../data/repository/config_repository.dart';
  27. import '../../../data/repository/store_repository.dart';
  28. import '../../../dialog/alipay_qr_code_dialog.dart';
  29. import '../../../dialog/loading_dialog.dart';
  30. import '../../../dialog/login/login_dialog.dart';
  31. import '../../../dialog/member_agreement_dialog.dart';
  32. import '../../../dialog/payment_fail_dialog.dart';
  33. import '../../../dialog/payment_success_dialog.dart';
  34. import '../../../dialog/wechat_qr_code_dialog.dart';
  35. import '../../../handler/event_handler.dart';
  36. import '../../../resource/assets.gen.dart';
  37. import '../../../resource/string.gen.dart';
  38. import '../../../utils/async_util.dart';
  39. import '../../../utils/atmob_log.dart';
  40. import '../../../utils/http_handler.dart';
  41. import '../../../utils/payment_status_manager.dart';
  42. import '../../../utils/toast_util.dart';
  43. import '../store_banner_bean.dart';
  44. import '../subscribe/recover_subscribe_dialog.dart';
  45. import '../suprise/surprise_dialog.dart';
  46. import '../ticket/discount_ticket_dialog.dart';
  47. import 'new_discount_page.dart';
  48. @injectable
  49. class NewDiscountController extends BaseController
  50. implements PaymentStatusCallback {
  51. final String tag = "NewDiscountController";
  52. final StoreRepository storeRepository;
  53. final AccountRepository accountRepository;
  54. final ConfigRepository configRepository;
  55. final PaymentStatusManager paymentStatusManager;
  56. RxList<GoodsInfo> get goodsInfoList =>
  57. storeRepository.newDiscountGoodsInfoList;
  58. RxList<PayWayInfo> get payWayList => storeRepository.newDiscountPayWayList;
  59. final Rxn<GoodsInfo> _selectedGoodsInfoItem = Rxn<GoodsInfo>();
  60. GoodsInfo? get selectedGoodsInfoItem => _selectedGoodsInfoItem.value;
  61. final Rxn<PayWayInfo> _selectedPayWay = Rxn<PayWayInfo>();
  62. PayWayInfo? get selectedPayWay => _selectedPayWay.value;
  63. CancelableFuture? _storeDataFuture;
  64. bool get isLogin => accountRepository.isLogin.value;
  65. final isAgree = false.obs;
  66. MemberInfo? get memberStatusInfo => accountRepository.memberStatusInfo.value;
  67. UserInfoResponse? get userInfo => accountRepository.userInfo.value;
  68. final RxList<GoodsInfo> filteredGoodsList = <GoodsInfo>[].obs;
  69. RxList<CharacterInfo> get _charactersList => storeRepository.charactersList;
  70. List<CharacterInfo> get charactersList => _charactersList;
  71. final CarouselSliderController carouselSliderController =
  72. CarouselSliderController();
  73. final RxInt _currentBanner = 0.obs;
  74. int get currentBannerIndex => _currentBanner.value;
  75. late final RxBool isDiscount = false.obs;
  76. /// 轮播图控制器
  77. final List<AssetGenImage> bannerList = [
  78. Assets.images.iconNewDiscountBanner1,
  79. Assets.images.iconNewDiscountBanner2,
  80. Assets.images.iconNewDiscountBanner3,
  81. ];
  82. final List<MemberCardBean> memberCardList = [
  83. MemberCardBean(
  84. imageUrl: Assets.images.iconNewDiscountMembershipCard1,
  85. title: StringName.newDiscountMemberCard1Title,
  86. desc: StringName.newDiscountMemberCard1Desc,
  87. gradient: LinearGradient(
  88. begin: Alignment(0.50, -0.00),
  89. end: Alignment(0.50, 1.00),
  90. colors: [const Color(0xFFF1EDFF), const Color(0xFFFAF8FF)],
  91. ),
  92. ),
  93. MemberCardBean(
  94. imageUrl: Assets.images.iconNewDiscountMembershipCard2,
  95. title: StringName.newDiscountMemberCard2Title,
  96. desc: StringName.newDiscountMemberCard2Desc,
  97. gradient: LinearGradient(
  98. begin: Alignment(0.50, -0.00),
  99. end: Alignment(0.50, 1.00),
  100. colors: [const Color(0xFFDCF4C0), const Color(0xFFFAFFF3)],
  101. ),
  102. ),
  103. MemberCardBean(
  104. imageUrl: Assets.images.iconNewDiscountMembershipCard3,
  105. title: StringName.newDiscountMemberCard3Title,
  106. desc: StringName.newDiscountMemberCard3Desc,
  107. gradient: LinearGradient(
  108. begin: Alignment(0.50, -0.00),
  109. end: Alignment(0.50, 1.00),
  110. colors: [const Color(0xFFF9DBFF), const Color(0xFFFFFBFE)],
  111. ),
  112. ),
  113. MemberCardBean(
  114. imageUrl: Assets.images.iconNewDiscountMembershipCard4,
  115. title: StringName.newDiscountMemberCard4Title,
  116. desc: StringName.newDiscountMemberCard4Desc,
  117. gradient: LinearGradient(
  118. begin: Alignment(0.50, -0.00),
  119. end: Alignment(0.50, 1.00),
  120. colors: [const Color(0xFFDBECFF), const Color(0xFFFBFBFF)],
  121. ),
  122. ),
  123. MemberCardBean(
  124. imageUrl: Assets.images.iconNewDiscountMembershipCard5,
  125. title: StringName.newDiscountMemberCard5Title,
  126. desc: StringName.newDiscountMemberCard5Desc,
  127. gradient: LinearGradient(
  128. begin: Alignment(0.50, -0.00),
  129. end: Alignment(0.50, 1.00),
  130. colors: [const Color(0xFFFFF7DB), const Color(0xFFFFFDFB)],
  131. ),
  132. ),
  133. ];
  134. NewDiscountController(
  135. this.storeRepository,
  136. this.accountRepository,
  137. this.configRepository,
  138. this.paymentStatusManager,
  139. );
  140. onBannerChanged(int index, CarouselPageChangedReason reason) {
  141. _currentBanner.value = index;
  142. }
  143. void refreshStoreData() {
  144. storeRepository.refreshNewDiscountGoodsInfoList();
  145. }
  146. Future<void> updateFilteredGoodsList() async {
  147. if (_selectedPayWay.value == null) {
  148. return;
  149. }
  150. _selectedGoodsInfoItem.value = null;
  151. int selectedPayWayId = _selectedPayWay.value!.id;
  152. filteredGoodsList.assignAll(
  153. goodsInfoList.where((goods) {
  154. return goods.payOptionIds == null ||
  155. goods.payOptionIds!.contains(selectedPayWayId);
  156. }).toList(),
  157. );
  158. if (filteredGoodsList.isNotEmpty) {
  159. _selectedGoodsInfoItem.value = filteredGoodsList.first;
  160. var isHasDiscount = await MethodChanelIOSUtil.isHasDiscount(goodsInfoList.first.appleGoodsId);
  161. isDiscount.value = isHasDiscount;
  162. }
  163. }
  164. void onGoodsItemClick(GoodsInfo goodsInfo) {
  165. _selectedGoodsInfoItem.value = goodsInfo;
  166. debugPrint("'item: ${goodsInfo.toJson()}");
  167. }
  168. void clickPayWaySwitch() {
  169. if (payWayList.isNotEmpty) {
  170. int currentIndex = payWayList.indexOf(
  171. _selectedPayWay.value ?? payWayList.first,
  172. );
  173. int nextIndex = (currentIndex + 1) % payWayList.length;
  174. _selectedPayWay.value = payWayList[nextIndex];
  175. updateFilteredGoodsList(); // 切换支付方式后,更新商品列表
  176. }
  177. }
  178. void clickBack() {
  179. EventHandler.report(EventId.event_02002);
  180. Get.back();
  181. }
  182. void clickPayNow() {
  183. EventHandler.report(EventId.event_02001);
  184. if (selectedGoodsInfoItem == null) {
  185. ToastUtil.show(StringName.memberPleaseChoiceGoods);
  186. return;
  187. }
  188. if (selectedPayWay == null) {
  189. ToastUtil.show(StringName.memberPleaseChoicePayment);
  190. return;
  191. }
  192. if (!isAgree.value) {
  193. MemberAgreementDialog.show(
  194. btnConfirm: () {
  195. isAgree.value = true;
  196. clickPayNow();
  197. },
  198. );
  199. return;
  200. }
  201. AtmobLog.d(tag, 'clickPayNow: ${selectedGoodsInfoItem!.toJson()}');
  202. final buyGoods = selectedGoodsInfoItem!;
  203. final buyPayWay = selectedPayWay!;
  204. int goodsId = buyGoods.id;
  205. int payPlatform = buyPayWay.payPlatform;
  206. int payMethod = buyPayWay.payMethod;
  207. int payWayType = getPayWayType(
  208. payMethod: payMethod,
  209. payPlatform: payPlatform,
  210. );
  211. LoadingDialog.show(StringName.payLoading);
  212. storeRepository
  213. .submitAndRequestPay(
  214. goodsId: goodsId,
  215. payPlatform: payPlatform,
  216. payMethod: payMethod,
  217. )
  218. .then((response) {
  219. if (payWayType == PayWayType.paymentWayWechat) {
  220. _onWeChatPay(
  221. response.outTradeNo,
  222. response.wechatPayPrepayJson!,
  223. payMethod,
  224. buyGoods,
  225. buyPayWay,
  226. );
  227. } else if (payWayType == PayWayType.paymentWayWechatScan) {
  228. _onWechatScanPay(
  229. response.outTradeNo,
  230. response.wechatPayQrcodeUrl!,
  231. buyPayWay,
  232. buyGoods,
  233. );
  234. } else if (payWayType == PayWayType.paymentWayAlipay) {
  235. _onAliPay(
  236. response.outTradeNo,
  237. response.alipayOrderString!,
  238. payMethod,
  239. buyGoods,
  240. buyPayWay,
  241. );
  242. } else if (payWayType == PayWayType.paymentWayAlipayScan) {
  243. _onAliScanPay(
  244. response.outTradeNo,
  245. response.alipayQrcodeHtml!,
  246. buyPayWay,
  247. buyGoods,
  248. );
  249. } else if (payWayType == PayWayType.paymentWayApple) {
  250. _onApplePay(
  251. response.outTradeNo,
  252. response.appAccountToken ?? "",
  253. buyPayWay,
  254. buyGoods,
  255. );
  256. } else {
  257. ToastUtil.show(StringName.payNotSupport);
  258. }
  259. })
  260. .catchError((error) {
  261. LoadingDialog.hide();
  262. if (error is ServerErrorException) {
  263. if (error.code == ErrorCode.payOrderError) {
  264. refreshStoreData();
  265. ToastUtil.show(error.message);
  266. } else if (error.code == ErrorCode.noLoginError) {
  267. ToastUtil.show(StringName.accountNoLogin);
  268. if (PlatformUtil.isIOS) {
  269. LoginPage.start();
  270. } else {
  271. LoginDialog.show();
  272. }
  273. } else {
  274. ToastUtil.show(error.message);
  275. paymentFail();
  276. }
  277. } else {
  278. ToastUtil.show(StringName.memberPaymentFailed);
  279. paymentFail();
  280. }
  281. })
  282. .whenComplete(() {
  283. if (PlatformUtil.isAndroid) {
  284. LoadingDialog.hide();
  285. }
  286. });
  287. }
  288. void paymentFail() {
  289. PaymentFailDialog.show(
  290. btnConfirm: () {
  291. clickPayNow();
  292. },
  293. );
  294. }
  295. void _onAliScanPay(
  296. String outTradeNo,
  297. String qrHtml,
  298. PayWayInfo payWayInfo,
  299. GoodsInfo goodsInfo,
  300. ) {
  301. AlipayQrCodeDialog.show(
  302. qrCodeHtml: qrHtml,
  303. loadSuccessCallback: () {
  304. checkPaymentStatus(outTradeNo, payWayInfo, goodsInfo);
  305. },
  306. onCloseCallback: () async {
  307. //关闭后再持续查询几秒
  308. CustomLoadingDialog.show();
  309. await Future.delayed(Duration(seconds: 4));
  310. paymentStatusManager.removePollingSubscription(outTradeNo);
  311. CustomLoadingDialog.hide();
  312. },
  313. );
  314. }
  315. void _onAliPay(
  316. String outTradeNo,
  317. String payJson,
  318. int payMethod,
  319. GoodsInfo buyGoods,
  320. PayWayInfo buyPayWay,
  321. ) {
  322. final payInfo = AliPayInfo(payJson);
  323. requestSdkPay(payInfo, outTradeNo, payMethod, buyGoods, buyPayWay);
  324. }
  325. void _onWeChatPay(
  326. String outTradeNo,
  327. String payJson,
  328. int payMethod,
  329. GoodsInfo buyGoods,
  330. PayWayInfo buyPayWay,
  331. ) {
  332. final bean = WechatPaymentSignBean.stringToBean(payJson);
  333. final payInfo = WechatPayInfo(
  334. appId: bean.appId,
  335. partnerId: bean.partnerId,
  336. prepayId: bean.prepayId,
  337. package: bean.package,
  338. noncestr: bean.nonceStr,
  339. timestamp: bean.timeStamp,
  340. sign: bean.sign,
  341. );
  342. requestSdkPay(payInfo, outTradeNo, payMethod, buyGoods, buyPayWay);
  343. }
  344. void _onWechatScanPay(
  345. String outTradeNo,
  346. String qrCodeUrl,
  347. PayWayInfo payWayInfo,
  348. GoodsInfo goodsInfo,
  349. ) {
  350. WechatQrCodeDialog.show(
  351. qrCodeUrl: qrCodeUrl,
  352. loadSuccessCallback: () {
  353. checkPaymentStatus(outTradeNo, payWayInfo, goodsInfo);
  354. },
  355. onCloseCallback: () async {
  356. //关闭后再持续查询几秒
  357. CustomLoadingDialog.show();
  358. await Future.delayed(Duration(seconds: 4));
  359. paymentStatusManager.removePollingSubscription(outTradeNo);
  360. CustomLoadingDialog.hide();
  361. },
  362. );
  363. }
  364. Future<void> _onApplePay(
  365. String outTradeNo,
  366. String appAccountToken,
  367. PayWayInfo payWayInfo,
  368. GoodsInfo goodsInfo,
  369. ) async {
  370. final result = await ApplePay().purchase(
  371. productId: goodsInfo.appleGoodsId,
  372. appAccountToken: appAccountToken,
  373. );
  374. if (result["success"] == true) {
  375. var receipt = result['receipt'];
  376. print('购买成功: ${result['receipt']}');
  377. checkPaymentStatus(
  378. outTradeNo,
  379. payWayInfo,
  380. goodsInfo,
  381. receiptData: receipt,
  382. );
  383. } else {
  384. LoadingDialog.hide();
  385. ToastUtil.show("支付失败,请稍后重试");
  386. print('购买失败: ${result['error']}');
  387. }
  388. }
  389. void checkPaymentStatus(
  390. String orderNo,
  391. PayWayInfo payWayInfo,
  392. GoodsInfo goodsInfo, {
  393. String? receiptData,
  394. }) {
  395. paymentStatusManager.registerPaymentSuccessCallback(orderNo, this);
  396. paymentStatusManager.checkPaymentStatus(
  397. orderNo,
  398. payWayInfo,
  399. goodsInfo,
  400. receiptData: receiptData,
  401. );
  402. }
  403. void requestSdkPay(
  404. dynamic payInfo,
  405. String outTradeNo,
  406. int payMethod,
  407. GoodsInfo buyGoods,
  408. PayWayInfo buyPayWay,
  409. ) {
  410. AgilePay.startPay(
  411. payInfo,
  412. success: (String? result) {
  413. LoadingDialog.show(StringName.payQuerypayState);
  414. checkPaymentStatus(
  415. outTradeNo,
  416. buyPayWay,
  417. buyGoods,
  418. receiptData: result,
  419. );
  420. },
  421. payError: (int error, String? errorMessage) {
  422. debugPrint('zk---payError: $error, $errorMessage');
  423. paymentFail();
  424. errorPayToast(error);
  425. errorEventReport(payMethod);
  426. },
  427. error: (int errno, String? error) {
  428. debugPrint('zk---error: $errno, $error');
  429. errorPayToast(errno);
  430. errorEventReport(payMethod);
  431. },
  432. );
  433. }
  434. void errorEventReport(int payMethod) {
  435. if (payMethod == PayMethod.wechat) {
  436. // EventHandler.report();
  437. } else if (payMethod == PayMethod.alipay) {
  438. // EventHandler.report();
  439. } else if (payMethod == PayMethod.apple) {
  440. // EventHandler.report();
  441. }
  442. }
  443. void errorPayToast(int errno) {
  444. if (errno == AgilePayCode.payCodeNotSupport) {
  445. ToastUtil.show(StringName.payNotSupport);
  446. } else if (errno == AgilePayCode.payCodeCancelError) {
  447. ToastUtil.show(StringName.payUserCancel);
  448. } else if (errno == AgilePayCode.payCodeWxEnvError) {
  449. ToastUtil.show(StringName.payWxEvnError);
  450. } else if (errno == AgilePayCode.payCodeNotConnectStore) {
  451. ToastUtil.show(StringName.payNotConnectStore);
  452. } else {
  453. ToastUtil.show(StringName.payError);
  454. }
  455. }
  456. @override
  457. void onReady() {
  458. super.onReady();
  459. EventHandler.report(EventId.event_02000);
  460. // refreshStoreData();
  461. }
  462. @override
  463. void onInit() {
  464. super.onInit();
  465. if (goodsInfoList.isNotEmpty) {
  466. _selectedGoodsInfoItem.value = goodsInfoList.first;
  467. }
  468. if (payWayList.isNotEmpty) {
  469. _selectedPayWay.value = payWayList.first;
  470. updateFilteredGoodsList();
  471. }
  472. ever<List<GoodsInfo>>(goodsInfoList, (list) {
  473. if (list.isNotEmpty) {
  474. _selectedGoodsInfoItem.value = list.first;
  475. }
  476. });
  477. ever<List<PayWayInfo>>(payWayList, (list) {
  478. if (list.isNotEmpty) {
  479. _selectedPayWay.value = list.first;
  480. updateFilteredGoodsList();
  481. }
  482. });
  483. }
  484. @override
  485. void onClose() {
  486. super.onClose();
  487. _storeDataFuture?.cancel();
  488. paymentStatusManager.unregisterPaymentSuccessCallback(this);
  489. if (!isFirstIntoDiscount() && !accountRepository.isVipUser) {
  490. if (PlatformUtil.isAndroid) {
  491. SurpriseDialog.show(
  492. clickConfirm: () {
  493. NewDiscountPage.start();
  494. },
  495. clickCancel: () {},
  496. );
  497. }
  498. if (PlatformUtil.isIOS) {
  499. DiscountTicketDialog.show(
  500. clickConfirm: () {
  501. NewDiscountPage.start();
  502. },
  503. clickCancel: () {},
  504. );
  505. }
  506. } else {
  507. setFirstIntoDiscount(false);
  508. }
  509. }
  510. @override
  511. void onPaymentSuccess(
  512. String orderNo,
  513. PayWayInfo payWayInfo,
  514. GoodsInfo goodsInfo,
  515. ) {
  516. if (PlatformUtil.isIOS) {
  517. accountRepository.refreshUserInfo();
  518. // 300ms后关闭弹窗
  519. Future.delayed(Duration(seconds: 2), () {
  520. LoadingDialog.hide();
  521. AtmobLog.d(tag, 'onPaymentSuccess: $orderNo');
  522. Get.back();
  523. PaymentSuccessDialog.show(
  524. goodsInfo: goodsInfo,
  525. btnConfirm: () {
  526. AtmobLog.d(tag, 'onGoodsItemClick: ${goodsInfo.toJson()}');
  527. },
  528. );
  529. });
  530. } else {
  531. LoadingDialog.hide();
  532. AtmobLog.d(tag, 'onPaymentSuccess: $orderNo');
  533. Get.back();
  534. PaymentSuccessDialog.show(
  535. goodsInfo: goodsInfo,
  536. btnConfirm: () {
  537. AtmobLog.d(tag, 'onGoodsItemClick: ${goodsInfo.toJson()}');
  538. },
  539. );
  540. }
  541. }
  542. @override
  543. void onPaymentError(Error error) {
  544. // TODO: implement onPaymentError
  545. if (PlatformUtil.isIOS) {
  546. LoadingDialog.hide();
  547. ErrorHandler.toastError(error);
  548. }
  549. }
  550. /// 恢复订阅
  551. Future<void> clickRestore() async {
  552. PayWayInfo? paymentWay = _selectedPayWay.value;
  553. if (paymentWay == null) {
  554. return;
  555. }
  556. int payPlatform = paymentWay.payPlatform;
  557. int payMethod = paymentWay.payMethod;
  558. CustomLoadingDialog.show();
  559. Future.delayed(const Duration(seconds: 20), () {
  560. CustomLoadingDialog.hide();
  561. ToastUtil.show("没有发现可恢复的记录");
  562. });
  563. final result = await ApplePay().restore();
  564. if (result["success"] == true) {
  565. // CustomLoadingDialog.hide();
  566. var receipt = result['receipt'];
  567. print('查找恢复记录成功: ${result['receipt']}');
  568. checkRestoreStatus(receipt);
  569. } else {
  570. CustomLoadingDialog.hide();
  571. ToastUtil.show("恢复失败");
  572. print('恢复失败: ${result['error']}');
  573. }
  574. // 显示恢复订阅弹窗
  575. // RecoverSubscribeDialog.show("周会员2025年3月6日到期。", () {
  576. // AtmobLog.d(tag, "恢复订阅弹窗 => 点击确认");
  577. // });
  578. }
  579. /// 检查恢复订阅结果
  580. Future<void> checkRestoreStatus(String? receiptData) async {
  581. PayWayInfo? paymentWay = _selectedPayWay.value;
  582. if (paymentWay == null) {
  583. // ToastUtil.showToast(StringName.storeChoicePayment.tr);
  584. return;
  585. }
  586. if (receiptData == null) {
  587. return;
  588. }
  589. int payPlatform = paymentWay.payPlatform;
  590. int payMethod = paymentWay.payMethod;
  591. // var code = await storeRepository.resume(payPlatform, payMethod, receiptData);
  592. storeRepository
  593. .subscribeResume(payPlatform, payMethod, receiptData)
  594. .then((data) {
  595. CustomLoadingDialog.hide();
  596. ToastUtil.show("恢复成功");
  597. accountRepository.getUserInfo();
  598. Get.back();
  599. })
  600. .catchError((error) {
  601. CustomLoadingDialog.hide();
  602. ToastUtil.show("恢复失败");
  603. });
  604. // if (code == 0) {
  605. // CustomLoadingDialog.hide();
  606. // ToastUtil.show("Restore success");
  607. // userRepository.getUserInfo();
  608. // Get.back();
  609. // } else {
  610. // CustomLoadingDialog.hide();
  611. // ToastUtil.show("Restore fail");
  612. // }
  613. }
  614. /// 恢复订阅
  615. Future<void> clickRestore() async {
  616. PayWayInfo? paymentWay = _selectedPayWay.value;
  617. if (paymentWay == null) {
  618. return;
  619. }
  620. int payPlatform = paymentWay.payPlatform;
  621. int payMethod = paymentWay.payMethod;
  622. CustomLoadingDialog.show();
  623. Future.delayed(const Duration(seconds: 20), () {
  624. CustomLoadingDialog.hide();
  625. ToastUtil.show("Restore record not found");
  626. });
  627. final result = await ApplePay().restore();
  628. if (result["success"] == true) {
  629. // CustomLoadingDialog.hide();
  630. var receipt = result['receipt'];
  631. print('查找恢复记录成功: ${result['receipt']}');
  632. checkRestoreStatus(receipt);
  633. } else {
  634. CustomLoadingDialog.hide();
  635. ToastUtil.show("Pay Error");
  636. print('恢复失败: ${result['error']}');
  637. }
  638. // 显示恢复订阅弹窗
  639. // RecoverSubscribeDialog.show("周会员2025年3月6日到期。", () {
  640. // AtmobLog.d(tag, "恢复订阅弹窗 => 点击确认");
  641. // });
  642. }
  643. /// 检查恢复订阅结果
  644. Future<void> checkRestoreStatus(String? receiptData) async {
  645. PayWayInfo? paymentWay = _selectedPayWay.value;
  646. if (paymentWay == null) {
  647. // ToastUtil.showToast(StringName.storeChoicePayment.tr);
  648. return;
  649. }
  650. if (receiptData == null) {
  651. return;
  652. }
  653. int payPlatform = paymentWay.payPlatform;
  654. int payMethod = paymentWay.payMethod;
  655. // var code = await storeRepository.resume(payPlatform, payMethod, receiptData);
  656. storeRepository.subscribeResume(payPlatform, payMethod, receiptData).then((data) {
  657. CustomLoadingDialog.hide();
  658. ToastUtil.show("Restore success");
  659. accountRepository.getUserInfo();
  660. Get.back();
  661. }).catchError((error) {
  662. CustomLoadingDialog.hide();
  663. ToastUtil.show("Restore fail");
  664. });
  665. // if (code == 0) {
  666. // CustomLoadingDialog.hide();
  667. // ToastUtil.show("Restore success");
  668. // userRepository.getUserInfo();
  669. // Get.back();
  670. // } else {
  671. // CustomLoadingDialog.hide();
  672. // ToastUtil.show("Restore fail");
  673. // }
  674. }
  675. /// 恢复订阅
  676. Future<void> clickRestore() async {
  677. PayWayInfo? paymentWay = _selectedPayWay.value;
  678. if (paymentWay == null) {
  679. return;
  680. }
  681. int payPlatform = paymentWay.payPlatform;
  682. int payMethod = paymentWay.payMethod;
  683. CustomLoadingDialog.show();
  684. Future.delayed(const Duration(seconds: 20), () {
  685. CustomLoadingDialog.hide();
  686. ToastUtil.show("Restore record not found");
  687. });
  688. final result = await ApplePay().restore();
  689. if (result["success"] == true) {
  690. // CustomLoadingDialog.hide();
  691. var receipt = result['receipt'];
  692. print('查找恢复记录成功: ${result['receipt']}');
  693. checkRestoreStatus(receipt);
  694. } else {
  695. CustomLoadingDialog.hide();
  696. ToastUtil.show("Pay Error");
  697. print('恢复失败: ${result['error']}');
  698. }
  699. // 显示恢复订阅弹窗
  700. // RecoverSubscribeDialog.show("周会员2025年3月6日到期。", () {
  701. // AtmobLog.d(tag, "恢复订阅弹窗 => 点击确认");
  702. // });
  703. }
  704. /// 检查恢复订阅结果
  705. Future<void> checkRestoreStatus(String? receiptData) async {
  706. PayWayInfo? paymentWay = _selectedPayWay.value;
  707. if (paymentWay == null) {
  708. // ToastUtil.showToast(StringName.storeChoicePayment.tr);
  709. return;
  710. }
  711. if (receiptData == null) {
  712. return;
  713. }
  714. int payPlatform = paymentWay.payPlatform;
  715. int payMethod = paymentWay.payMethod;
  716. // var code = await storeRepository.resume(payPlatform, payMethod, receiptData);
  717. storeRepository.subscribeResume(payPlatform, payMethod, receiptData).then((data) {
  718. CustomLoadingDialog.hide();
  719. ToastUtil.show("Restore success");
  720. accountRepository.getUserInfo();
  721. Get.back();
  722. }).catchError((error) {
  723. CustomLoadingDialog.hide();
  724. ToastUtil.show("Restore fail");
  725. });
  726. // if (code == 0) {
  727. // CustomLoadingDialog.hide();
  728. // ToastUtil.show("Restore success");
  729. // userRepository.getUserInfo();
  730. // Get.back();
  731. // } else {
  732. // CustomLoadingDialog.hide();
  733. // ToastUtil.show("Restore fail");
  734. // }
  735. }
  736. /// 恢复订阅
  737. Future<void> clickRestore() async {
  738. PayWayInfo? paymentWay = _selectedPayWay.value;
  739. if (paymentWay == null) {
  740. return;
  741. }
  742. int payPlatform = paymentWay.payPlatform;
  743. int payMethod = paymentWay.payMethod;
  744. CustomLoadingDialog.show();
  745. Future.delayed(const Duration(seconds: 20), () {
  746. CustomLoadingDialog.hide();
  747. ToastUtil.show("没有发现可恢复的记录");
  748. });
  749. final result = await ApplePay().restore();
  750. if (result["success"] == true) {
  751. // CustomLoadingDialog.hide();
  752. var receipt = result['receipt'];
  753. print('查找恢复记录成功: ${result['receipt']}');
  754. checkRestoreStatus(receipt);
  755. } else {
  756. CustomLoadingDialog.hide();
  757. ToastUtil.show("恢复失败");
  758. print('恢复失败: ${result['error']}');
  759. }
  760. // 显示恢复订阅弹窗
  761. // RecoverSubscribeDialog.show("周会员2025年3月6日到期。", () {
  762. // AtmobLog.d(tag, "恢复订阅弹窗 => 点击确认");
  763. // });
  764. }
  765. /// 检查恢复订阅结果
  766. Future<void> checkRestoreStatus(String? receiptData) async {
  767. PayWayInfo? paymentWay = _selectedPayWay.value;
  768. if (paymentWay == null) {
  769. // ToastUtil.showToast(StringName.storeChoicePayment.tr);
  770. return;
  771. }
  772. if (receiptData == null) {
  773. return;
  774. }
  775. int payPlatform = paymentWay.payPlatform;
  776. int payMethod = paymentWay.payMethod;
  777. // var code = await storeRepository.resume(payPlatform, payMethod, receiptData);
  778. storeRepository
  779. .subscribeResume(payPlatform, payMethod, receiptData)
  780. .then((data) {
  781. CustomLoadingDialog.hide();
  782. ToastUtil.show("恢复成功");
  783. accountRepository.getUserInfo();
  784. Get.back();
  785. })
  786. .catchError((error) {
  787. CustomLoadingDialog.hide();
  788. ToastUtil.show("恢复失败");
  789. });
  790. // if (code == 0) {
  791. // CustomLoadingDialog.hide();
  792. // ToastUtil.show("Restore success");
  793. // userRepository.getUserInfo();
  794. // Get.back();
  795. // } else {
  796. // CustomLoadingDialog.hide();
  797. // ToastUtil.show("Restore fail");
  798. // }
  799. }
  800. /// 恢复订阅
  801. Future<void> clickRestore() async {
  802. PayWayInfo? paymentWay = _selectedPayWay.value;
  803. if (paymentWay == null) {
  804. return;
  805. }
  806. int payPlatform = paymentWay.payPlatform;
  807. int payMethod = paymentWay.payMethod;
  808. CustomLoadingDialog.show();
  809. Future.delayed(const Duration(seconds: 20), () {
  810. CustomLoadingDialog.hide();
  811. ToastUtil.show("Restore record not found");
  812. });
  813. final result = await ApplePay().restore();
  814. if (result["success"] == true) {
  815. // CustomLoadingDialog.hide();
  816. var receipt = result['receipt'];
  817. print('查找恢复记录成功: ${result['receipt']}');
  818. checkRestoreStatus(receipt);
  819. } else {
  820. CustomLoadingDialog.hide();
  821. ToastUtil.show("Pay Error");
  822. print('恢复失败: ${result['error']}');
  823. }
  824. // 显示恢复订阅弹窗
  825. // RecoverSubscribeDialog.show("周会员2025年3月6日到期。", () {
  826. // AtmobLog.d(tag, "恢复订阅弹窗 => 点击确认");
  827. // });
  828. }
  829. /// 检查恢复订阅结果
  830. Future<void> checkRestoreStatus(String? receiptData) async {
  831. PayWayInfo? paymentWay = _selectedPayWay.value;
  832. if (paymentWay == null) {
  833. // ToastUtil.showToast(StringName.storeChoicePayment.tr);
  834. return;
  835. }
  836. if (receiptData == null) {
  837. return;
  838. }
  839. int payPlatform = paymentWay.payPlatform;
  840. int payMethod = paymentWay.payMethod;
  841. // var code = await storeRepository.resume(payPlatform, payMethod, receiptData);
  842. storeRepository.subscribeResume(payPlatform, payMethod, receiptData).then((data) {
  843. CustomLoadingDialog.hide();
  844. ToastUtil.show("Restore success");
  845. accountRepository.getUserInfo();
  846. Get.back();
  847. }).catchError((error) {
  848. CustomLoadingDialog.hide();
  849. ToastUtil.show("Restore fail");
  850. });
  851. // if (code == 0) {
  852. // CustomLoadingDialog.hide();
  853. // ToastUtil.show("Restore success");
  854. // userRepository.getUserInfo();
  855. // Get.back();
  856. // } else {
  857. // CustomLoadingDialog.hide();
  858. // ToastUtil.show("Restore fail");
  859. // }
  860. }
  861. /// 恢复订阅
  862. Future<void> clickRestore() async {
  863. PayWayInfo? paymentWay = _selectedPayWay.value;
  864. if (paymentWay == null) {
  865. return;
  866. }
  867. int payPlatform = paymentWay.payPlatform;
  868. int payMethod = paymentWay.payMethod;
  869. CustomLoadingDialog.show();
  870. Future.delayed(const Duration(seconds: 20), () {
  871. CustomLoadingDialog.hide();
  872. ToastUtil.show("Restore record not found");
  873. });
  874. final result = await ApplePay().restore();
  875. if (result["success"] == true) {
  876. // CustomLoadingDialog.hide();
  877. var receipt = result['receipt'];
  878. print('查找恢复记录成功: ${result['receipt']}');
  879. checkRestoreStatus(receipt);
  880. } else {
  881. CustomLoadingDialog.hide();
  882. ToastUtil.show("Pay Error");
  883. print('恢复失败: ${result['error']}');
  884. }
  885. // 显示恢复订阅弹窗
  886. // RecoverSubscribeDialog.show("周会员2025年3月6日到期。", () {
  887. // AtmobLog.d(tag, "恢复订阅弹窗 => 点击确认");
  888. // });
  889. }
  890. /// 检查恢复订阅结果
  891. Future<void> checkRestoreStatus(String? receiptData) async {
  892. PayWayInfo? paymentWay = _selectedPayWay.value;
  893. if (paymentWay == null) {
  894. // ToastUtil.showToast(StringName.storeChoicePayment.tr);
  895. return;
  896. }
  897. if (receiptData == null) {
  898. return;
  899. }
  900. int payPlatform = paymentWay.payPlatform;
  901. int payMethod = paymentWay.payMethod;
  902. // var code = await storeRepository.resume(payPlatform, payMethod, receiptData);
  903. storeRepository.subscribeResume(payPlatform, payMethod, receiptData).then((data) {
  904. CustomLoadingDialog.hide();
  905. ToastUtil.show("Restore success");
  906. accountRepository.getUserInfo();
  907. Get.back();
  908. }).catchError((error) {
  909. CustomLoadingDialog.hide();
  910. ToastUtil.show("Restore fail");
  911. });
  912. // if (code == 0) {
  913. // CustomLoadingDialog.hide();
  914. // ToastUtil.show("Restore success");
  915. // userRepository.getUserInfo();
  916. // Get.back();
  917. // } else {
  918. // CustomLoadingDialog.hide();
  919. // ToastUtil.show("Restore fail");
  920. // }
  921. }
  922. }