controller.dart 8.1 KB

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