discount_controller.dart 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. import 'package:apple_pay/apple_pay.dart';
  2. import 'package:clean/base/base_controller.dart';
  3. import 'package:clean/data/bean/payment_way.dart';
  4. import 'package:clean/data/bean/store_item.dart';
  5. import 'package:clean/data/consts/constants.dart';
  6. import 'package:clean/data/repositories/store_repository.dart';
  7. import 'package:clean/data/repositories/user_repository.dart';
  8. import 'package:clean/dialog/loading_dialog.dart';
  9. import 'package:clean/module/store/payment_status_manager.dart';
  10. import 'package:clean/sdk/pay/applepay/apple_pay_info.dart';
  11. import 'package:clean/sdk/pay/assist/product_type.dart';
  12. import 'package:clean/utils/error_handler.dart';
  13. import 'package:clean/utils/toast_util.dart';
  14. import 'package:get/get.dart';
  15. import '../../../data/consts/event_report_id.dart';
  16. import '../../../handler/event_handler.dart';
  17. class DiscountController extends BaseController
  18. implements PaymentStatusCallback {
  19. final RxList<StoreItem> storeItems = <StoreItem>[].obs;
  20. final RxList<PaymentWay> paymentWays = <PaymentWay>[].obs;
  21. final Rxn<StoreItem> currentSelectedStoreItem = Rxn<StoreItem>();
  22. final Rxn<PaymentWay> currentSelectedPaymentWay = Rxn<PaymentWay>();
  23. RxBool isFree = isGoodsFree().obs;
  24. @override
  25. Future<void> onInit() async {
  26. super.onInit();
  27. initStoreIndexData();
  28. }
  29. @override
  30. void onReady() {
  31. // TODO: implement onReady
  32. super.onReady();
  33. EventHandler.report(EventId.event_02005);
  34. }
  35. void initStoreIndexData() {
  36. LoadingDialog.showLoading();
  37. storeRepository.storeIndex().timeout(Duration(seconds: 60)).then((indexData) async {
  38. storeItems.clear();
  39. storeItems.addAll(indexData.items);
  40. currentSelectedStoreItem.value =
  41. storeItems.isNotEmpty ? storeItems.first : null;
  42. paymentWays.clear();
  43. paymentWays.addAll(indexData.paymentWays);
  44. currentSelectedPaymentWay.value =
  45. paymentWays.isNotEmpty ? paymentWays.first : null;
  46. var freeAppleId = "";
  47. for (var item in storeItems) {
  48. if (item.freeTrialName != null) {
  49. freeAppleId = item.appleGoodsId;
  50. }
  51. }
  52. // isFree.value = await ApplePay().check(freeAppleId);
  53. LoadingDialog.hide();
  54. }, onError: (_) {
  55. LoadingDialog.hide();
  56. ToastUtil.show("Connect Error");
  57. });
  58. }
  59. void onBuyClick() async {
  60. EventHandler.report(EventId.event_02006);
  61. StoreItem? storeItem = currentSelectedStoreItem.value;
  62. if (storeItem == null) {
  63. // ToastUtil.showToast(StringName.storeChoiceGoods.tr);
  64. return;
  65. }
  66. PaymentWay? paymentWay = currentSelectedPaymentWay.value;
  67. if (paymentWay == null) {
  68. // ToastUtil.showToast(StringName.storeChoicePayment.tr);
  69. return;
  70. }
  71. int payPlatform = paymentWay.payPlatform;
  72. int payMethod = paymentWay.payMethod;
  73. LoadingDialog.showLoading();
  74. try {
  75. // OrderPayResponse response =
  76. storeRepository
  77. .orderPay(storeItem.id, payPlatform, payMethod)
  78. .then((response) async {
  79. dynamic payInfo;
  80. String outTradeNo = response.outTradeNo;
  81. if (payPlatform == PayPlatform.apple) {
  82. payInfo = ApplePayInfo(
  83. storeItem.appleGoodsId,
  84. storeItem.subscribable == 1
  85. ? ProductType.nonConsumable
  86. : ProductType.consumable,
  87. response.appAccountToken);
  88. }
  89. final result = await ApplePay().purchase(
  90. productId: storeItem.appleGoodsId,
  91. appAccountToken: response.appAccountToken);
  92. if (result["success"] == true) {
  93. var receipt = result['receipt'];
  94. print('购买成功: ${result['receipt']}');
  95. checkPaymentStatus(outTradeNo, paymentWay, storeItem,
  96. receiptData: receipt);
  97. } else {
  98. LoadingDialog.hide();
  99. ToastUtil.show("Pay Error, Please try again");
  100. print('购买失败: ${result['error']}');
  101. }
  102. }).catchError((error) {
  103. LoadingDialog.hide();
  104. ErrorHandler.toastError(error);
  105. });
  106. } catch (error) {
  107. LoadingDialog.hide();
  108. }
  109. }
  110. void checkPaymentStatus(
  111. String orderNo, PaymentWay paymentWay, StoreItem storeItemBean,
  112. {String? receiptData}) {
  113. paymentStatusManager.registerPaymentSuccessCallback(orderNo, this);
  114. paymentStatusManager.checkPaymentStatus(orderNo, paymentWay, storeItemBean,
  115. receiptData: receiptData);
  116. }
  117. @override
  118. void onPaymentSuccess(
  119. String orderNo, PaymentWay paymentWay, StoreItem storeItemBean) {
  120. // TODO: implement onPaymentSuccess
  121. LoadingDialog.hide();
  122. ToastUtil.show("Pay success");
  123. // 300ms后关闭弹窗
  124. Future.delayed(Duration(seconds: 3), () {
  125. userRepository.getUserInfo();
  126. });
  127. Get.back();
  128. }
  129. @override
  130. void onPaymentError(Error error) {
  131. // TODO: implement onPaymentError
  132. LoadingDialog.hide();
  133. ErrorHandler.toastError(error);
  134. }
  135. }