discount_controller.dart 4.6 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 implements PaymentStatusCallback {
  18. final RxList<StoreItem> storeItems = <StoreItem>[].obs;
  19. final RxList<PaymentWay> paymentWays = <PaymentWay>[].obs;
  20. final Rxn<StoreItem> currentSelectedStoreItem = Rxn<StoreItem>();
  21. final Rxn<PaymentWay> currentSelectedPaymentWay = Rxn<PaymentWay>();
  22. RxBool isFree = false.obs;
  23. @override
  24. Future<void> onInit() async {
  25. super.onInit();
  26. initStoreIndexData();
  27. }
  28. @override
  29. void onReady() {
  30. // TODO: implement onReady
  31. super.onReady();
  32. EventHandler.report(EventId.event_02005);
  33. }
  34. void initStoreIndexData() {
  35. LoadingDialog.show();
  36. storeRepository.storeIndex().then((indexData) async {
  37. storeItems.clear();
  38. storeItems.addAll(indexData.items);
  39. currentSelectedStoreItem.value =
  40. storeItems.isNotEmpty ? storeItems.first : null;
  41. paymentWays.clear();
  42. paymentWays.addAll(indexData.paymentWays);
  43. currentSelectedPaymentWay.value =
  44. paymentWays.isNotEmpty ? paymentWays.first : null;
  45. var freeAppleId = "";
  46. for (var item in storeItems) {
  47. if (item.freeTrialName != null) {
  48. freeAppleId = item.appleGoodsId;
  49. }
  50. }
  51. isFree.value = await ApplePay().check(freeAppleId);
  52. LoadingDialog.hide();
  53. });
  54. }
  55. void onBuyClick() async {
  56. EventHandler.report(EventId.event_02006);
  57. StoreItem? storeItem = currentSelectedStoreItem.value;
  58. if (storeItem == null) {
  59. // ToastUtil.showToast(StringName.storeChoiceGoods.tr);
  60. return;
  61. }
  62. PaymentWay? paymentWay = currentSelectedPaymentWay.value;
  63. if (paymentWay == null) {
  64. // ToastUtil.showToast(StringName.storeChoicePayment.tr);
  65. return;
  66. }
  67. int payPlatform = paymentWay.payPlatform;
  68. int payMethod = paymentWay.payMethod;
  69. LoadingDialog.show();
  70. try {
  71. // OrderPayResponse response =
  72. storeRepository.orderPay(storeItem.id, payPlatform, payMethod).then((response) async {
  73. dynamic payInfo;
  74. String outTradeNo = response.outTradeNo;
  75. if (payPlatform == PayPlatform.apple) {
  76. payInfo = ApplePayInfo(
  77. storeItem.appleGoodsId,
  78. storeItem.subscribable == 1
  79. ? ProductType.nonConsumable
  80. : ProductType.consumable,
  81. response.appAccountToken);
  82. }
  83. final result = await ApplePay().purchase(productId: storeItem.appleGoodsId, appAccountToken: response.appAccountToken);
  84. if (result["success"] == true) {
  85. var receipt = result['receipt'];
  86. print('购买成功: ${result['receipt']}');
  87. checkPaymentStatus(outTradeNo, paymentWay, storeItem, receiptData: receipt);
  88. } else {
  89. LoadingDialog.hide();
  90. ToastUtil.show("Pay Error, Please try again");
  91. print('购买失败: ${result['error']}');
  92. }
  93. }).catchError((error) {
  94. LoadingDialog.hide();
  95. ErrorHandler.toastError(error);
  96. });
  97. } catch (error) {
  98. LoadingDialog.hide();
  99. }
  100. }
  101. void checkPaymentStatus(
  102. String orderNo, PaymentWay paymentWay, StoreItem storeItemBean,
  103. {String? receiptData}) {
  104. paymentStatusManager.registerPaymentSuccessCallback(orderNo, this);
  105. paymentStatusManager.checkPaymentStatus(orderNo, paymentWay, storeItemBean,
  106. receiptData: receiptData);
  107. }
  108. @override
  109. void onPaymentSuccess(String orderNo, PaymentWay paymentWay, StoreItem storeItemBean) {
  110. // TODO: implement onPaymentSuccess
  111. LoadingDialog.hide();
  112. ToastUtil.show("Pay success");
  113. // 300ms后关闭弹窗
  114. Future.delayed(Duration(seconds: 3), () {
  115. userRepository.getUserInfo();
  116. });
  117. Get.back();
  118. }
  119. @override
  120. void onPaymentError(Error error) {
  121. // TODO: implement onPaymentError
  122. LoadingDialog.hide();
  123. ErrorHandler.toastError(error);
  124. }
  125. }