controller.dart 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  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
  111. if (payPlatform == PayPlatform.apple) {
  112. payInfo = ApplePayInfo(
  113. storeItem.appleGoodsId,
  114. storeItem.subscribable == 1
  115. ? ProductType.nonConsumable
  116. : ProductType.consumable,
  117. response.appAccountToken);
  118. }
  119. Future.delayed(const Duration(seconds: 30), () {
  120. LoadingDialog.hide();
  121. });
  122. AgilePay.startPay(payInfo, success: (String? result) {
  123. LoadingDialog.show(StringName.storeQueryPayState.tr);
  124. checkPaymentStatus(outTradeNo, paymentWay, storeItem,
  125. receiptData: result);
  126. Future.delayed(const Duration(seconds: 30), () {
  127. LoadingDialog.hide();
  128. });
  129. }, payError: (int error, String? errorMessage) {
  130. debugPrint('zk---payError: $error, $errorMessage');
  131. errorPayToast(error);
  132. errorEventReport(payMethod);
  133. LoadingDialog.hide();
  134. }, error: (int errno, String? error) {
  135. debugPrint('zk---error: $errno, $error');
  136. errorPayToast(errno);
  137. errorEventReport(payMethod);
  138. LoadingDialog.hide();
  139. });
  140. } catch (error) {
  141. LoadingDialog.hide();
  142. if (error is ServerErrorException &&
  143. error.code == ErrorCode.errorCodeNoLogin) {
  144. ToastUtil.showToast(StringName.errorCodeNoLogin.tr);
  145. LoginPage.start(fromType: LoginFromType.store);
  146. } else {
  147. ToastUtil.showToast(StringName.storePayError.tr);
  148. }
  149. }
  150. }
  151. void errorEventReport(int payMethod) {
  152. // if (payMethod == PayMethod.wechat) {
  153. // EventHandler.report(EventId.event_104003, params: {'id': '001'});
  154. // } else if (payMethod == PayMethod.alipay) {
  155. // EventHandler.report(EventId.event_104003, params: {'id': '002'});
  156. // } else
  157. 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
  197. if (paymentWay.payMethod == PayMethod.apple) {
  198. params['id'] = '003';
  199. }
  200. if (fromType == StoreFromType.home) {
  201. params['from_id'] = '011';
  202. } else if (fromType == StoreFromType.mine) {
  203. params['from_id'] = '012';
  204. } else if (fromType == StoreFromType.analyse) {
  205. params['from_id'] = '013';
  206. }
  207. EventHandler.report(EventId.event_104002, params: params);
  208. Get.back();
  209. }
  210. }