controller.dart 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  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/consts/event_report_id.dart';
  4. import 'package:electronic_assistant/data/repositories/store_repository.dart';
  5. import 'package:electronic_assistant/handler/event_handler.dart';
  6. import 'package:electronic_assistant/module/login/view.dart';
  7. import 'package:electronic_assistant/module/store/payment_status_manager.dart';
  8. import 'package:electronic_assistant/module/store/view.dart';
  9. import 'package:electronic_assistant/resource/string.gen.dart';
  10. import 'package:electronic_assistant/sdk/pay/agile_pay.dart';
  11. import 'package:electronic_assistant/sdk/pay/alipay/ali_pay_info.dart';
  12. import 'package:electronic_assistant/sdk/pay/applepay/apple_pay_info.dart';
  13. import 'package:electronic_assistant/sdk/pay/code/agile_pay_code.dart';
  14. import 'package:electronic_assistant/utils/http_handler.dart';
  15. import 'package:electronic_assistant/utils/toast_util.dart';
  16. import 'package:flutter/widgets.dart';
  17. import 'package:get/get.dart';
  18. import '../../data/api/response/order_pay_response.dart';
  19. import '../../data/api/response/user_info_response.dart';
  20. import '../../data/bean/store_item.dart';
  21. import '../../data/bean/wechat_payment_sign_bean.dart';
  22. import '../../data/consts/constants.dart';
  23. import '../../data/consts/error_code.dart';
  24. import '../../data/repositories/account_repository.dart';
  25. import '../../dialog/loading_dialog.dart';
  26. import '../../sdk/pay/assist/product_type.dart';
  27. import '../../sdk/pay/wxpay/wechat_pay_info.dart';
  28. class StoreController extends BaseController implements PaymentStatusCallback {
  29. final isExpanded = false.obs;
  30. final RxList<StoreItem> storeItems = <StoreItem>[].obs;
  31. final RxList<PaymentWay> paymentWays = <PaymentWay>[].obs;
  32. final Rxn<StoreItem> currentSelectedStoreItem = Rxn<StoreItem>();
  33. final Rxn<PaymentWay> currentSelectedPaymentWay = Rxn<PaymentWay>();
  34. final RxBool isPaymentWayExpanded = true.obs;
  35. final Rxn<UserInfoResponse> _userInfo = accountRepository.userInfo;
  36. UserInfoResponse? get userInfo => _userInfo.value;
  37. StoreFromType? fromType;
  38. @override
  39. void onInit() {
  40. super.onInit();
  41. initStoreIndexData();
  42. }
  43. @override
  44. void onReady() {
  45. super.onReady();
  46. _initArgs();
  47. }
  48. void _initArgs() {
  49. fromType = Get.arguments?['fromType'];
  50. if (fromType == StoreFromType.home) {
  51. EventHandler.report(EventId.event_104001, params: {'id': '001'});
  52. } else if (fromType == StoreFromType.mine) {
  53. EventHandler.report(EventId.event_104001, params: {'id': '002'});
  54. } else if (fromType == StoreFromType.analyse) {
  55. EventHandler.report(EventId.event_104001, params: {'id': '003'});
  56. } else if (fromType == StoreFromType.record) {
  57. EventHandler.report(EventId.event_104001, params: {'id': '004'});
  58. }
  59. }
  60. void initStoreIndexData() {
  61. storeRepository.storeIndex().then((indexData) {
  62. storeItems.clear();
  63. storeItems.addAll(indexData.items);
  64. currentSelectedStoreItem.value =
  65. storeItems.isNotEmpty ? storeItems.first : null;
  66. paymentWays.clear();
  67. paymentWays.addAll(indexData.paymentWays);
  68. currentSelectedPaymentWay.value =
  69. paymentWays.isNotEmpty ? paymentWays.first : null;
  70. });
  71. }
  72. onStoreItemClick(StoreItem storeItem) {
  73. currentSelectedStoreItem.value = storeItem;
  74. }
  75. void onPaymentWayItemClick(PaymentWay paymentWay) {
  76. currentSelectedPaymentWay.value = paymentWay;
  77. }
  78. onBuyClick() async {
  79. StoreItem? storeItem = currentSelectedStoreItem.value;
  80. if (storeItem == null) {
  81. ToastUtil.showToast(StringName.storeChoiceGoods.tr);
  82. return;
  83. }
  84. PaymentWay? paymentWay = currentSelectedPaymentWay.value;
  85. if (paymentWay == null) {
  86. ToastUtil.showToast(StringName.storeChoicePayment.tr);
  87. return;
  88. }
  89. int payPlatform = paymentWay.payPlatform;
  90. int payMethod = paymentWay.payMethod;
  91. LoadingDialog.show(StringName.storePayLoading.tr);
  92. try {
  93. OrderPayResponse response =
  94. await storeRepository.orderPay(storeItem.id, payPlatform, payMethod);
  95. dynamic payInfo;
  96. String outTradeNo = response.outTradeNo;
  97. if (payPlatform == PayPlatform.android) {
  98. if (payMethod == PayMethod.alipay) {
  99. payInfo = AliPayInfo(response.alipayOrderString!);
  100. } else if (payMethod == PayMethod.wechat) {
  101. WechatPaymentSignBean bean =
  102. WechatPaymentSignBean.stringToBean(response.wechatPayPrepayJson!);
  103. payInfo = WechatPayInfo(
  104. appId: bean.appId,
  105. partnerId: bean.partnerId,
  106. prepayId: bean.prepayId,
  107. package: bean.package,
  108. noncestr: bean.nonceStr,
  109. timestamp: bean.timeStamp,
  110. sign: bean.sign);
  111. }
  112. } else if (payPlatform == PayPlatform.apple) {
  113. payInfo = ApplePayInfo(
  114. storeItem.appleGoodsId,
  115. storeItem.subscribable == 1
  116. ? ProductType.nonConsumable
  117. : ProductType.consumable,
  118. response.appAccountToken);
  119. }
  120. Future.delayed(const Duration(seconds: 30), () {
  121. LoadingDialog.hide();
  122. });
  123. AgilePay.startPay(payInfo, success: (String? result) {
  124. LoadingDialog.show(StringName.storeQueryPayState.tr);
  125. checkPaymentStatus(outTradeNo, paymentWay, storeItem,
  126. receiptData: result);
  127. Future.delayed(const Duration(seconds: 30), () {
  128. LoadingDialog.hide();
  129. });
  130. }, payError: (int error, String? errorMessage) {
  131. debugPrint('zk---payError: $error, $errorMessage');
  132. errorPayToast(error);
  133. errorEventReport(payMethod);
  134. LoadingDialog.hide();
  135. }, error: (int errno, String? error) {
  136. debugPrint('zk---error: $errno, $error');
  137. errorPayToast(errno);
  138. errorEventReport(payMethod);
  139. LoadingDialog.hide();
  140. });
  141. } catch (error) {
  142. LoadingDialog.hide();
  143. if (error is ServerErrorException &&
  144. error.code == ErrorCode.errorCodeNoLogin) {
  145. ToastUtil.showToast(StringName.errorCodeNoLogin.tr);
  146. LoginPage.start(fromType: LoginFromType.store);
  147. } else {
  148. ToastUtil.showToast(StringName.storePayError.tr);
  149. }
  150. }
  151. }
  152. void errorEventReport(int payMethod) {
  153. if (payMethod == PayMethod.wechat) {
  154. EventHandler.report(EventId.event_104003, params: {'id': '001'});
  155. } else if (payMethod == PayMethod.alipay) {
  156. EventHandler.report(EventId.event_104003, params: {'id': '002'});
  157. } else if (payMethod == PayMethod.apple) {
  158. EventHandler.report(EventId.event_104003, params: {'id': '003'});
  159. }
  160. }
  161. void errorPayToast(int errno) {
  162. if (errno == AgilePayCode.payCodeNotSupport) {
  163. ToastUtil.showToast(StringName.storePayNotSupport.tr);
  164. } else if (errno == AgilePayCode.payCodeCancelError) {
  165. ToastUtil.showToast(StringName.storePayUserCancel.tr);
  166. } else if (errno == AgilePayCode.payCodeWxEnvError) {
  167. ToastUtil.showToast(StringName.storePayWxEvnError.tr);
  168. } else if (errno == AgilePayCode.payCodeNotConnectStore) {
  169. ToastUtil.showToast(StringName.storePayNotConnectstore.tr);
  170. } else {
  171. ToastUtil.showToast(StringName.storePayError.tr);
  172. }
  173. }
  174. void checkPaymentStatus(
  175. String orderNo, PaymentWay paymentWay, StoreItem storeItemBean,
  176. {String? receiptData}) {
  177. paymentStatusManager.registerPaymentSuccessCallback(orderNo, this);
  178. paymentStatusManager.checkPaymentStatus(orderNo, paymentWay, storeItemBean,
  179. receiptData: receiptData);
  180. }
  181. @override
  182. void onClose() {
  183. super.onClose();
  184. paymentStatusManager.unregisterPaymentSuccessCallback(this);
  185. }
  186. @override
  187. void onPaymentSuccess(
  188. String orderNo, PaymentWay paymentWay, StoreItem storeItemBean) {
  189. LoadingDialog.hide();
  190. ToastUtil.showToast(StringName.storePaySuccess.tr);
  191. Map<String, dynamic> params = {};
  192. if (paymentWay.payMethod == PayMethod.wechat) {
  193. params['id'] = '001';
  194. } else if (paymentWay.payMethod == PayMethod.alipay) {
  195. params['id'] = '002';
  196. } else if (paymentWay.payMethod == PayMethod.apple) {
  197. params['id'] = '003';
  198. }
  199. if (fromType == StoreFromType.home) {
  200. params['from_id'] = '011';
  201. } else if (fromType == StoreFromType.mine) {
  202. params['from_id'] = '012';
  203. } else if (fromType == StoreFromType.analyse) {
  204. params['from_id'] = '013';
  205. } else if (fromType == StoreFromType.record) {
  206. params['from_id'] = '014';
  207. }
  208. EventHandler.report(EventId.event_104002, params: params);
  209. Get.back();
  210. }
  211. }