discount_controller.dart 4.3 KB

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