discount_controller.dart 4.7 KB

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