controller.dart 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. import 'package:electronic_assistant/base/base_controller.dart';
  2. import 'package:electronic_assistant/data/bean/payment_way.dart';
  3. import 'package:electronic_assistant/data/repositories/store_repository.dart';
  4. import 'package:electronic_assistant/module/store/payment_status_manager.dart';
  5. import 'package:electronic_assistant/resource/string.gen.dart';
  6. import 'package:electronic_assistant/router/app_pages.dart';
  7. import 'package:electronic_assistant/sdk/pay/agile_pay.dart';
  8. import 'package:electronic_assistant/sdk/pay/alipay/ali_pay_info.dart';
  9. import 'package:electronic_assistant/sdk/pay/applepay/apple_pay_info.dart';
  10. import 'package:electronic_assistant/sdk/pay/code/agile_pay_code.dart';
  11. import 'package:electronic_assistant/utils/http_handler.dart';
  12. import 'package:electronic_assistant/utils/toast_util.dart';
  13. import 'package:get/get.dart';
  14. import '../../data/api/response/order_pay_response.dart';
  15. import '../../data/api/response/user_info_response.dart';
  16. import '../../data/bean/store_item.dart';
  17. import '../../data/bean/wechat_payment_sign_bean.dart';
  18. import '../../data/consts/constants.dart';
  19. import '../../data/consts/error_code.dart';
  20. import '../../data/repositories/account_repository.dart';
  21. import '../../dialog/loading_dialog.dart';
  22. import '../../sdk/pay/assist/product_type.dart';
  23. import '../../sdk/pay/wxpay/wechat_pay_info.dart';
  24. class StoreController extends BaseController implements PaymentStatusCallback {
  25. final isExpanded = false.obs;
  26. final RxList<StoreItem> storeItems = <StoreItem>[].obs;
  27. final RxList<PaymentWay> paymentWays = <PaymentWay>[].obs;
  28. final Rxn<StoreItem> currentSelectedStoreItem = Rxn<StoreItem>();
  29. final Rxn<PaymentWay> currentSelectedPaymentWay = Rxn<PaymentWay>();
  30. final RxBool isPaymentWayExpanded = false.obs;
  31. final Rxn<UserInfoResponse> _userInfo = accountRepository.userInfo;
  32. UserInfoResponse? get userInfo => _userInfo.value;
  33. @override
  34. void onInit() {
  35. super.onInit();
  36. initStoreIndexData();
  37. }
  38. void initStoreIndexData() {
  39. storeRepository.storeIndex().then((indexData) {
  40. storeItems.clear();
  41. storeItems.addAll(indexData.items);
  42. currentSelectedStoreItem.value =
  43. storeItems.isNotEmpty ? storeItems.first : null;
  44. paymentWays.clear();
  45. paymentWays.addAll(indexData.paymentWays);
  46. currentSelectedPaymentWay.value =
  47. paymentWays.isNotEmpty ? paymentWays.first : null;
  48. });
  49. }
  50. onStoreItemClick(StoreItem storeItem) {
  51. currentSelectedStoreItem.value = storeItem;
  52. }
  53. void onPaymentWayItemClick(PaymentWay paymentWay) {
  54. currentSelectedPaymentWay.value = paymentWay;
  55. }
  56. onBuyClick() async {
  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(StringName.storePayLoading.tr);
  70. try {
  71. OrderPayResponse response =
  72. await storeRepository.orderPay(storeItem.id, payPlatform, payMethod);
  73. dynamic payInfo;
  74. String outTradeNo = response.outTradeNo;
  75. if (payPlatform == PayPlatform.android) {
  76. if (payMethod == PayMethod.alipay) {
  77. payInfo = AliPayInfo(response.alipayOrderString!);
  78. } else if (payMethod == PayMethod.wechat) {
  79. WechatPaymentSignBean bean =
  80. WechatPaymentSignBean.stringToBean(response.wechatPayPrepayJson!);
  81. payInfo = WechatPayInfo(
  82. appId: bean.appId,
  83. partnerId: bean.partnerId,
  84. prepayId: bean.prepayId,
  85. package: bean.package,
  86. noncestr: bean.nonceStr,
  87. timestamp: bean.timeStamp,
  88. sign: bean.sign);
  89. }
  90. } else if (payPlatform == PayPlatform.apple) {
  91. payInfo = ApplePayInfo(
  92. storeItem.appleGoodsId,
  93. storeItem.subscribable == 1
  94. ? ProductType.nonConsumable
  95. : ProductType.consumable,
  96. response.appAccountToken);
  97. }
  98. AgilePay.startPay(payInfo, success: (String? result) {
  99. LoadingDialog.show(StringName.storeQueryPayState.tr);
  100. checkPaymentStatus(outTradeNo, paymentWay, storeItem,
  101. receiptData: result);
  102. Future.delayed(const Duration(seconds: 30), () {
  103. LoadingDialog.hide();
  104. });
  105. }, payError: (int error, String? errorMessage) {
  106. errorPayToast(error);
  107. LoadingDialog.hide();
  108. }, error: (int errno, String? error) {
  109. errorPayToast(errno);
  110. LoadingDialog.hide();
  111. });
  112. } catch (error) {
  113. LoadingDialog.hide();
  114. if (error is ServerErrorException &&
  115. error.code == ErrorCode.errorCodeNoLogin) {
  116. ToastUtil.showToast(StringName.errorCodeNoLogin.tr);
  117. Get.toNamed(RoutePath.login);
  118. } else {
  119. ToastUtil.showToast(StringName.storePayError.tr);
  120. }
  121. }
  122. }
  123. void errorPayToast(int errno) {
  124. if (errno == AgilePayCode.payCodeNotSupport) {
  125. ToastUtil.showToast(StringName.storePayNotSupport.tr);
  126. } else if (errno == AgilePayCode.payCodeCancelError) {
  127. ToastUtil.showToast(StringName.storePayUserCancel.tr);
  128. } else if (errno == AgilePayCode.payCodeWxEnvError) {
  129. ToastUtil.showToast(StringName.storePayWxEvnError.tr);
  130. } else if (errno == AgilePayCode.payCodeNotConnectStore) {
  131. ToastUtil.showToast(StringName.storePayNotConnectstore.tr);
  132. } else {
  133. ToastUtil.showToast(StringName.storePayError.tr);
  134. }
  135. }
  136. void checkPaymentStatus(
  137. String orderNo, PaymentWay paymentWay, StoreItem storeItemBean,
  138. {String? receiptData}) {
  139. paymentStatusManager.registerPaymentSuccessCallback(orderNo, this);
  140. paymentStatusManager.checkPaymentStatus(orderNo, paymentWay, storeItemBean,
  141. receiptData: receiptData);
  142. }
  143. @override
  144. void onClose() {
  145. super.onClose();
  146. AgilePay.dispose();
  147. paymentStatusManager.unregisterPaymentSuccessCallback(this);
  148. }
  149. @override
  150. void onPaymentSuccess(
  151. String orderNo, PaymentWay paymentWay, StoreItem storeItemBean) {
  152. LoadingDialog.hide();
  153. ToastUtil.showToast(StringName.storePaySuccess.tr);
  154. Get.back();
  155. }
  156. }