controller.dart 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  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.ios) {
  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. Future.delayed(const Duration(seconds: 30), () {
  102. LoadingDialog.hide();
  103. });
  104. }, payError: (int error, String? errorMessage) {
  105. errorPayToast(error);
  106. LoadingDialog.hide();
  107. }, error: (int errno, String? error) {
  108. errorPayToast(errno);
  109. LoadingDialog.hide();
  110. });
  111. } catch (error) {
  112. LoadingDialog.hide();
  113. if (error is ServerErrorException &&
  114. error.code == ErrorCode.errorCodeNoLogin) {
  115. ToastUtil.showToast(StringName.errorCodeNoLogin.tr);
  116. Get.toNamed(RoutePath.login);
  117. } else {
  118. ToastUtil.showToast(StringName.storePayError.tr);
  119. }
  120. }
  121. }
  122. void errorPayToast(int errno) {
  123. if (errno == AgilePayCode.payCodeNotSupport) {
  124. ToastUtil.showToast(StringName.storePayNotSupport.tr);
  125. } else if (errno == AgilePayCode.payCodeCancelError) {
  126. ToastUtil.showToast(StringName.storePayUserCancel.tr);
  127. } else if (errno == AgilePayCode.payCodeWxEnvError) {
  128. ToastUtil.showToast(StringName.storePayWxEvnError.tr);
  129. } else if (errno == AgilePayCode.payCodeNotConnectStore) {
  130. ToastUtil.showToast(StringName.storePayNotConnectstore.tr);
  131. } else {
  132. ToastUtil.showToast(StringName.storePayError.tr);
  133. }
  134. }
  135. void checkPaymentStatus(
  136. String orderNo, PaymentWay paymentWay, StoreItem storeItemBean) {
  137. paymentStatusManager.registerPaymentSuccessCallback(orderNo, this);
  138. paymentStatusManager.checkPaymentStatus(orderNo, paymentWay, storeItemBean);
  139. }
  140. @override
  141. void onClose() {
  142. super.onClose();
  143. AgilePay.dispose();
  144. paymentStatusManager.unregisterPaymentSuccessCallback(this);
  145. }
  146. @override
  147. void onPaymentSuccess(
  148. String orderNo, PaymentWay paymentWay, StoreItem storeItemBean) {
  149. LoadingDialog.hide();
  150. ToastUtil.showToast(StringName.storePaySuccess.tr);
  151. Get.back();
  152. }
  153. }