controller.dart 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  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. }
  57. }
  58. void initStoreIndexData() {
  59. storeRepository.storeIndex().then((indexData) {
  60. storeItems.clear();
  61. storeItems.addAll(indexData.items);
  62. currentSelectedStoreItem.value =
  63. storeItems.isNotEmpty ? storeItems.first : null;
  64. paymentWays.clear();
  65. paymentWays.addAll(indexData.paymentWays);
  66. currentSelectedPaymentWay.value =
  67. paymentWays.isNotEmpty ? paymentWays.first : null;
  68. });
  69. }
  70. onStoreItemClick(StoreItem storeItem) {
  71. currentSelectedStoreItem.value = storeItem;
  72. }
  73. void onPaymentWayItemClick(PaymentWay paymentWay) {
  74. currentSelectedPaymentWay.value = paymentWay;
  75. }
  76. onBuyClick() async {
  77. StoreItem? storeItem = currentSelectedStoreItem.value;
  78. if (storeItem == null) {
  79. ToastUtil.showToast(StringName.storeChoiceGoods.tr);
  80. return;
  81. }
  82. PaymentWay? paymentWay = currentSelectedPaymentWay.value;
  83. if (paymentWay == null) {
  84. ToastUtil.showToast(StringName.storeChoicePayment.tr);
  85. return;
  86. }
  87. int payPlatform = paymentWay.payPlatform;
  88. int payMethod = paymentWay.payMethod;
  89. LoadingDialog.show(StringName.storePayLoading.tr);
  90. try {
  91. OrderPayResponse response =
  92. await storeRepository.orderPay(storeItem.id, payPlatform, payMethod);
  93. dynamic payInfo;
  94. String outTradeNo = response.outTradeNo;
  95. if (payPlatform == PayPlatform.android) {
  96. if (payMethod == PayMethod.alipay) {
  97. payInfo = AliPayInfo(response.alipayOrderString!);
  98. } else if (payMethod == PayMethod.wechat) {
  99. WechatPaymentSignBean bean =
  100. WechatPaymentSignBean.stringToBean(response.wechatPayPrepayJson!);
  101. payInfo = WechatPayInfo(
  102. appId: bean.appId,
  103. partnerId: bean.partnerId,
  104. prepayId: bean.prepayId,
  105. package: bean.package,
  106. noncestr: bean.nonceStr,
  107. timestamp: bean.timeStamp,
  108. sign: bean.sign);
  109. }
  110. } else if (payPlatform == PayPlatform.apple) {
  111. payInfo = ApplePayInfo(
  112. storeItem.appleGoodsId,
  113. storeItem.subscribable == 1
  114. ? ProductType.nonConsumable
  115. : ProductType.consumable,
  116. response.appAccountToken);
  117. }
  118. Future.delayed(const Duration(seconds: 30), () {
  119. LoadingDialog.hide();
  120. });
  121. AgilePay.startPay(payInfo, success: (String? result) {
  122. LoadingDialog.show(StringName.storeQueryPayState.tr);
  123. checkPaymentStatus(outTradeNo, paymentWay, storeItem,
  124. receiptData: result);
  125. Future.delayed(const Duration(seconds: 30), () {
  126. LoadingDialog.hide();
  127. });
  128. }, payError: (int error, String? errorMessage) {
  129. debugPrint('zk---payError: $error, $errorMessage');
  130. errorPayToast(error);
  131. errorEventReport(payMethod);
  132. LoadingDialog.hide();
  133. }, error: (int errno, String? error) {
  134. debugPrint('zk---error: $errno, $error');
  135. errorPayToast(errno);
  136. errorEventReport(payMethod);
  137. LoadingDialog.hide();
  138. });
  139. } catch (error) {
  140. LoadingDialog.hide();
  141. if (error is ServerErrorException &&
  142. error.code == ErrorCode.errorCodeNoLogin) {
  143. ToastUtil.showToast(StringName.errorCodeNoLogin.tr);
  144. LoginPage.start(fromType: LoginFromType.store);
  145. } else {
  146. ToastUtil.showToast(StringName.storePayError.tr);
  147. }
  148. }
  149. }
  150. void errorEventReport(int payMethod) {
  151. if (payMethod == PayMethod.wechat) {
  152. EventHandler.report(EventId.event_104003, params: {'id': '001'});
  153. } else if (payMethod == PayMethod.alipay) {
  154. EventHandler.report(EventId.event_104003, params: {'id': '002'});
  155. } else if (payMethod == PayMethod.apple) {
  156. EventHandler.report(EventId.event_104003, params: {'id': '003'});
  157. }
  158. }
  159. void errorPayToast(int errno) {
  160. if (errno == AgilePayCode.payCodeNotSupport) {
  161. ToastUtil.showToast(StringName.storePayNotSupport.tr, addPostFrame: true);
  162. } else if (errno == AgilePayCode.payCodeCancelError) {
  163. ToastUtil.showToast(StringName.storePayUserCancel.tr, addPostFrame: true);
  164. } else if (errno == AgilePayCode.payCodeWxEnvError) {
  165. ToastUtil.showToast(StringName.storePayWxEvnError.tr, addPostFrame: true);
  166. } else if (errno == AgilePayCode.payCodeNotConnectStore) {
  167. ToastUtil.showToast(StringName.storePayNotConnectstore.tr,
  168. addPostFrame: true);
  169. } else {
  170. ToastUtil.showToast(StringName.storePayError.tr, addPostFrame: true);
  171. }
  172. }
  173. void checkPaymentStatus(
  174. String orderNo, PaymentWay paymentWay, StoreItem storeItemBean,
  175. {String? receiptData}) {
  176. paymentStatusManager.registerPaymentSuccessCallback(orderNo, this);
  177. paymentStatusManager.checkPaymentStatus(orderNo, paymentWay, storeItemBean,
  178. receiptData: receiptData);
  179. }
  180. @override
  181. void onClose() {
  182. super.onClose();
  183. paymentStatusManager.unregisterPaymentSuccessCallback(this);
  184. }
  185. @override
  186. void onPaymentSuccess(
  187. String orderNo, PaymentWay paymentWay, StoreItem storeItemBean) {
  188. LoadingDialog.hide();
  189. ToastUtil.showToast(StringName.storePaySuccess.tr);
  190. Map<String, dynamic> params = {};
  191. if (paymentWay.payMethod == PayMethod.wechat) {
  192. params['id'] = '001';
  193. } else if (paymentWay.payMethod == PayMethod.alipay) {
  194. params['id'] = '002';
  195. } else if (paymentWay.payMethod == PayMethod.apple) {
  196. params['id'] = '003';
  197. }
  198. if (fromType == StoreFromType.home) {
  199. params['from_id'] = '011';
  200. } else if (fromType == StoreFromType.mine) {
  201. params['from_id'] = '012';
  202. } else if (fromType == StoreFromType.analyse) {
  203. params['from_id'] = '013';
  204. }
  205. EventHandler.report(EventId.event_104002, params: params);
  206. Get.back();
  207. }
  208. }