discount_controller.dart 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  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 canUseFreeTrailPlan = isUserCanStartFreeTrial().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. LoadingDialog.hide();
  47. }, onError: (_) {
  48. LoadingDialog.hide();
  49. ToastUtil.show("Connect Error");
  50. });
  51. }
  52. void onBuyClick() async {
  53. EventHandler.report(EventId.event_02006);
  54. StoreItem? storeItem = currentSelectedStoreItem.value;
  55. if (storeItem == null) {
  56. // ToastUtil.showToast(StringName.storeChoiceGoods.tr);
  57. return;
  58. }
  59. PaymentWay? paymentWay = currentSelectedPaymentWay.value;
  60. if (paymentWay == null) {
  61. // ToastUtil.showToast(StringName.storeChoicePayment.tr);
  62. return;
  63. }
  64. int payPlatform = paymentWay.payPlatform;
  65. int payMethod = paymentWay.payMethod;
  66. LoadingDialog.showLoading();
  67. try {
  68. // OrderPayResponse response =
  69. storeRepository
  70. .orderPay(storeItem.id, payPlatform, payMethod)
  71. .then((response) async {
  72. dynamic payInfo;
  73. String outTradeNo = response.outTradeNo;
  74. if (payPlatform == PayPlatform.apple) {
  75. payInfo = ApplePayInfo(
  76. storeItem.appleGoodsId,
  77. storeItem.subscribable == 1
  78. ? ProductType.nonConsumable
  79. : ProductType.consumable,
  80. response.appAccountToken);
  81. }
  82. final result = await ApplePay().purchase(
  83. productId: storeItem.appleGoodsId,
  84. appAccountToken: response.appAccountToken);
  85. if (result["success"] == true) {
  86. var receipt = result['receipt'];
  87. print('购买成功: ${result['receipt']}');
  88. checkPaymentStatus(outTradeNo, paymentWay, storeItem,
  89. receiptData: receipt);
  90. } else {
  91. LoadingDialog.hide();
  92. ToastUtil.show("Pay Error, Please try again");
  93. print('购买失败: ${result['error']}');
  94. }
  95. }).catchError((error) {
  96. LoadingDialog.hide();
  97. ErrorHandler.toastError(error);
  98. });
  99. } catch (error) {
  100. LoadingDialog.hide();
  101. }
  102. }
  103. void checkPaymentStatus(
  104. String orderNo, PaymentWay paymentWay, StoreItem storeItemBean,
  105. {String? receiptData}) {
  106. paymentStatusManager.registerPaymentSuccessCallback(orderNo, this);
  107. paymentStatusManager.checkPaymentStatus(orderNo, paymentWay, storeItemBean,
  108. receiptData: receiptData);
  109. }
  110. @override
  111. void onPaymentSuccess(
  112. String orderNo, PaymentWay paymentWay, StoreItem storeItemBean) {
  113. // TODO: implement onPaymentSuccess
  114. LoadingDialog.hide();
  115. ToastUtil.show("Pay success");
  116. // 300ms后关闭弹窗
  117. Future.delayed(Duration(seconds: 3), () {
  118. userRepository.getUserInfo();
  119. });
  120. Get.back();
  121. }
  122. @override
  123. void onPaymentError(Error error) {
  124. // TODO: implement onPaymentError
  125. LoadingDialog.hide();
  126. ErrorHandler.toastError(error);
  127. }
  128. }