import 'dart:io'; import 'package:classify_photo/classify_photo.dart'; import 'package:clean/data/repositories/user_repository.dart'; import 'package:clean/module/store/payment_status_manager.dart'; import 'package:flutter/Material.dart'; import 'package:get/get.dart'; import 'package:in_app_purchase/in_app_purchase.dart'; import '../../base/base_controller.dart'; import '../../data/api/response/order_pay_response.dart'; import '../../data/bean/payment_way.dart'; import '../../data/bean/store_item.dart'; import '../../data/consts/constants.dart'; import '../../data/repositories/store_repository.dart'; import '../../dialog/loading_dialog.dart'; import '../../sdk/pay/agile_pay.dart'; import '../../sdk/pay/applepay/apple_pay_info.dart'; import '../../sdk/pay/assist/product_type.dart'; import '../../utils/toast_util.dart'; class StoreController extends BaseController implements PaymentStatusCallback { final RxList storeItems = [].obs; final RxList paymentWays = [].obs; final Rxn currentSelectedStoreItem = Rxn(); final Rxn currentSelectedPaymentWay = Rxn(); @override Future onInit() async { initStoreIndexData(); print(await ClassifyPhoto().checkTrialEligibility()); // AgilePay.check(); } void initStoreIndexData() { storeRepository.storeIndex().then((indexData) { storeItems.clear(); storeItems.addAll(indexData.items); currentSelectedStoreItem.value = storeItems.isNotEmpty ? storeItems.first : null; paymentWays.clear(); paymentWays.addAll(indexData.paymentWays); currentSelectedPaymentWay.value = paymentWays.isNotEmpty ? paymentWays.first : null; }); } Future onRestoreClick() async { PaymentWay? paymentWay = currentSelectedPaymentWay.value; if (paymentWay == null) { // ToastUtil.showToast(StringName.storeChoicePayment.tr); return; } int payPlatform = paymentWay.payPlatform; int payMethod = paymentWay.payMethod; AgilePay.restore(success: (String? result) { LoadingDialog.show(""); checkRestoreStatus(result); Future.delayed(const Duration(seconds: 30), () { LoadingDialog.hide(); }); }, payError: (int error, String? errorMessage) { debugPrint('zk---payError: $error, $errorMessage'); // errorPayToast(error); LoadingDialog.hide(); }, error: (int errno, String? error) { debugPrint('zk---error: $errno, $error'); // errorPayToast(errno); LoadingDialog.hide(); }); } void onBuyClick() async { StoreItem? storeItem = currentSelectedStoreItem.value; if (storeItem == null) { // ToastUtil.showToast(StringName.storeChoiceGoods.tr); return; } PaymentWay? paymentWay = currentSelectedPaymentWay.value; if (paymentWay == null) { // ToastUtil.showToast(StringName.storeChoicePayment.tr); return; } int payPlatform = paymentWay.payPlatform; int payMethod = paymentWay.payMethod; LoadingDialog.show(""); try { OrderPayResponse response = await storeRepository.orderPay(storeItem.id, payPlatform, payMethod); dynamic payInfo; String outTradeNo = response.outTradeNo; if (payPlatform == PayPlatform.apple) { payInfo = ApplePayInfo( storeItem.appleGoodsId, storeItem.subscribable == 1 ? ProductType.nonConsumable : ProductType.consumable, response.appAccountToken); } Future.delayed(const Duration(seconds: 30), () { LoadingDialog.hide(); }); AgilePay.startPay(payInfo, success: (String? result) { LoadingDialog.show(""); checkPaymentStatus(outTradeNo, paymentWay, storeItem, receiptData: result); Future.delayed(const Duration(seconds: 30), () { LoadingDialog.hide(); }); }, payError: (int error, String? errorMessage) { debugPrint('zk---payError: $error, $errorMessage'); // errorPayToast(error); LoadingDialog.hide(); }, error: (int errno, String? error) { debugPrint('zk---error: $errno, $error'); // errorPayToast(errno); LoadingDialog.hide(); }); } catch (error) { LoadingDialog.hide(); // ToastUtil.showToast(StringName.storePayError.tr); } } // 检查恢复订阅结果 void checkRestoreStatus(String? receiptData) { PaymentWay? paymentWay = currentSelectedPaymentWay.value; if (paymentWay == null) { // ToastUtil.showToast(StringName.storeChoicePayment.tr); return; } if (receiptData == null) { return; } int payPlatform = paymentWay.payPlatform; int payMethod = paymentWay.payMethod; var code = storeRepository.resume(payPlatform, payMethod, receiptData); } void checkPaymentStatus( String orderNo, PaymentWay paymentWay, StoreItem storeItemBean, {String? receiptData}) { paymentStatusManager.registerPaymentSuccessCallback(orderNo, this); paymentStatusManager.checkPaymentStatus(orderNo, paymentWay, storeItemBean, receiptData: receiptData); } @override void onPaymentSuccess(String orderNo, PaymentWay paymentWay, StoreItem storeItemBean) { // TODO: implement onPaymentSuccess LoadingDialog.hide(); ToastUtil.show("Pay success"); userRepository.getUserInfo(); Get.back(); } }