controller.dart 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  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/resource/string.gen.dart';
  5. import 'package:electronic_assistant/router/app_pages.dart';
  6. import 'package:electronic_assistant/sdk/pay/agile_pay.dart';
  7. import 'package:electronic_assistant/sdk/pay/alipay/ali_pay_info.dart';
  8. import 'package:electronic_assistant/sdk/pay/applepay/apple_pay_info.dart';
  9. import 'package:electronic_assistant/sdk/pay/code/agile_pay_code.dart';
  10. import 'package:electronic_assistant/utils/error_handler.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/bean/store_item.dart';
  16. import '../../data/bean/wechat_payment_sign_bean.dart';
  17. import '../../data/consts/constants.dart';
  18. import '../../data/consts/error_code.dart';
  19. import '../../dialog/loading_dialog.dart';
  20. import '../../sdk/pay/assist/product_type.dart';
  21. import '../../sdk/pay/listener/agile_pay_state.dart';
  22. import '../../sdk/pay/wxpay/wechat_pay_info.dart';
  23. class StoreController extends BaseController {
  24. final isExpanded = false.obs;
  25. final RxList<StoreItem> storeItems = <StoreItem>[].obs;
  26. final RxList<PaymentWay> paymentWays = <PaymentWay>[].obs;
  27. final Rxn<StoreItem> currentSelectedStoreItem = Rxn<StoreItem>();
  28. final Rxn<PaymentWay> currentSelectedPaymentWay = Rxn<PaymentWay>();
  29. final RxBool isPaymentWayExpanded = false.obs;
  30. @override
  31. void onInit() {
  32. super.onInit();
  33. initStoreIndexData();
  34. }
  35. void initStoreIndexData() {
  36. storeRepository.storeIndex().then((indexData) {
  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. });
  46. }
  47. onStoreItemClick(StoreItem storeItem) {
  48. currentSelectedStoreItem.value = storeItem;
  49. }
  50. void onPaymentWayItemClick(PaymentWay paymentWay) {
  51. currentSelectedPaymentWay.value = paymentWay;
  52. }
  53. onBuyClick() async {
  54. StoreItem? storeItem = currentSelectedStoreItem.value;
  55. if (storeItem == null) {
  56. ToastUtil.showToast(StringName.storeChoiceGoods.tr);
  57. return;
  58. }
  59. PaymentWay? paymentWay = currentSelectedPaymentWay.value;
  60. if (paymentWay == null) {
  61. ToastUtil.showToast(StringName.storeChoicePayment.tr);
  62. return;
  63. }
  64. int payPlatform = paymentWay.payPlatform;
  65. int payMethod = paymentWay.payMethod;
  66. LoadingDialog.show(StringName.storePayLoading.tr);
  67. try {
  68. OrderPayResponse response =
  69. await storeRepository.orderPay(storeItem.id, payPlatform, payMethod);
  70. dynamic payInfo;
  71. if (payPlatform == PayPlatform.android) {
  72. if (payMethod == PayMethod.alipay) {
  73. payInfo = AliPayInfo(response.alipayOrderString!);
  74. } else if (payMethod == PayMethod.wechat) {
  75. WechatPaymentSignBean bean =
  76. WechatPaymentSignBean.stringToBean(response.wechatPayPrepayJson!);
  77. payInfo = WechatPayInfo(
  78. appId: bean.appId,
  79. partnerId: bean.partnerId,
  80. prepayId: bean.prepayId,
  81. package: bean.package,
  82. noncestr: bean.nonceStr,
  83. timestamp: bean.timeStamp,
  84. sign: bean.sign);
  85. }
  86. } else if (payPlatform == PayPlatform.ios) {
  87. payInfo = ApplePayInfo(
  88. storeItem.appleGoodsId,
  89. storeItem.subscribable == 1
  90. ? ProductType.nonConsumable
  91. : ProductType.consumable,
  92. response.appAccountToken);
  93. }
  94. AgilePay.startPay(payInfo, success: (String? result) {
  95. ToastUtil.showToast('支付成功');
  96. LoadingDialog.hide();
  97. }, payError: (int error, String? errorMessage) {
  98. LoadingDialog.hide();
  99. }, error: (int errno, String? error) {
  100. if (errno == AgilePayCode.payCodeCancelError) {
  101. ToastUtil.showToast(StringName.storePayUserCancel.tr);
  102. }
  103. LoadingDialog.hide();
  104. });
  105. } catch (error) {
  106. if (error is ServerErrorException &&
  107. error.code == ErrorCode.errorCodeNoLogin) {
  108. ToastUtil.showToast(StringName.errorCodeNoLogin.tr);
  109. Get.toNamed(RoutePath.login);
  110. } else {
  111. ErrorHandler.toastError(error);
  112. }
  113. } finally {
  114. LoadingDialog.hide();
  115. }
  116. }
  117. @override
  118. void onClose() {
  119. super.onClose();
  120. AgilePay.dispose();
  121. }
  122. }