controller.dart 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  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
  113. if (payPlatform == PayPlatform.apple) {
  114. payInfo = ApplePayInfo(
  115. storeItem.appleGoodsId,
  116. storeItem.subscribable == 1
  117. ? ProductType.nonConsumable
  118. : ProductType.consumable,
  119. response.appAccountToken);
  120. }
  121. Future.delayed(const Duration(seconds: 30), () {
  122. LoadingDialog.hide();
  123. });
  124. AgilePay.startPay(payInfo, success: (String? result) {
  125. LoadingDialog.show(StringName.storeQueryPayState.tr);
  126. checkPaymentStatus(outTradeNo, paymentWay, storeItem,
  127. receiptData: result);
  128. Future.delayed(const Duration(seconds: 30), () {
  129. LoadingDialog.hide();
  130. });
  131. }, payError: (int error, String? errorMessage) {
  132. debugPrint('zk---payError: $error, $errorMessage');
  133. errorPayToast(error);
  134. errorEventReport(payMethod);
  135. LoadingDialog.hide();
  136. }, error: (int errno, String? error) {
  137. debugPrint('zk---error: $errno, $error');
  138. errorPayToast(errno);
  139. errorEventReport(payMethod);
  140. LoadingDialog.hide();
  141. });
  142. } catch (error) {
  143. LoadingDialog.hide();
  144. if (error is ServerErrorException &&
  145. error.code == ErrorCode.errorCodeNoLogin) {
  146. ToastUtil.showToast(StringName.errorCodeNoLogin.tr);
  147. LoginPage.start(fromType: LoginFromType.store);
  148. } else {
  149. ToastUtil.showToast(StringName.storePayError.tr);
  150. }
  151. }
  152. }
  153. void errorEventReport(int payMethod) {
  154. // if (payMethod == PayMethod.wechat) {
  155. // EventHandler.report(EventId.event_104003, params: {'id': '001'});
  156. // } else if (payMethod == PayMethod.alipay) {
  157. // EventHandler.report(EventId.event_104003, params: {'id': '002'});
  158. // } else
  159. if (payMethod == PayMethod.apple) {
  160. EventHandler.report(EventId.event_104003, params: {'id': '003'});
  161. }
  162. }
  163. void errorPayToast(int errno) {
  164. if (errno == AgilePayCode.payCodeNotSupport) {
  165. ToastUtil.showToast(StringName.storePayNotSupport.tr);
  166. } else if (errno == AgilePayCode.payCodeCancelError) {
  167. ToastUtil.showToast(StringName.storePayUserCancel.tr);
  168. } else if (errno == AgilePayCode.payCodeWxEnvError) {
  169. // ToastUtil.showToast(StringName.storePayWxEvnError.tr);
  170. } else if (errno == AgilePayCode.payCodeNotConnectStore) {
  171. ToastUtil.showToast(StringName.storePayNotConnectstore.tr);
  172. } else {
  173. ToastUtil.showToast(StringName.storePayError.tr);
  174. }
  175. }
  176. void checkPaymentStatus(
  177. String orderNo, PaymentWay paymentWay, StoreItem storeItemBean,
  178. {String? receiptData}) {
  179. paymentStatusManager.registerPaymentSuccessCallback(orderNo, this);
  180. paymentStatusManager.checkPaymentStatus(orderNo, paymentWay, storeItemBean,
  181. receiptData: receiptData);
  182. }
  183. @override
  184. void onClose() {
  185. super.onClose();
  186. paymentStatusManager.unregisterPaymentSuccessCallback(this);
  187. }
  188. @override
  189. void onPaymentSuccess(
  190. String orderNo, PaymentWay paymentWay, StoreItem storeItemBean) {
  191. LoadingDialog.hide();
  192. ToastUtil.showToast(StringName.storePaySuccess.tr);
  193. Map<String, dynamic> params = {};
  194. // if (paymentWay.payMethod == PayMethod.wechat) {
  195. // params['id'] = '001';
  196. // } else if (paymentWay.payMethod == PayMethod.alipay) {
  197. // params['id'] = '002';
  198. // } else
  199. if (paymentWay.payMethod == PayMethod.apple) {
  200. params['id'] = '003';
  201. }
  202. if (fromType == StoreFromType.home) {
  203. params['from_id'] = '011';
  204. } else if (fromType == StoreFromType.mine) {
  205. params['from_id'] = '012';
  206. } else if (fromType == StoreFromType.analyse) {
  207. params['from_id'] = '013';
  208. } else if (fromType == StoreFromType.record) {
  209. params['from_id'] = '014';
  210. }
  211. EventHandler.report(EventId.event_104002, params: params);
  212. Get.back();
  213. }
  214. }