Browse Source

ios引力引擎获取idfa

leon 1 year ago
parent
commit
fbbbf19f4c

+ 4 - 0
assets/string/base/string.xml

@@ -112,4 +112,8 @@
     <string name="talk_add_agenda_content_hint">请输入待办内容</string>
     <string name="talk_add_agenda_content_hint">请输入待办内容</string>
     <string name="talk_add_agenda_name_hint">请输入待办人</string>
     <string name="talk_add_agenda_name_hint">请输入待办人</string>
     <string name="talk_add_agenda_name_title">负责人</string>
     <string name="talk_add_agenda_name_title">负责人</string>
+    <string name="store_choice_goods">请选择电量</string>
+    <string name="store_choice_payment">请选择支付方式</string>
+    <string name="store_pay_loading">请求中...</string>
+    <string name="store_pay_user_cancel">用户取消支付</string>
 </resources>
 </resources>

+ 6 - 0
lib/data/api/atmob_api.dart

@@ -8,6 +8,7 @@ import 'package:electronic_assistant/data/api/request/agenda_todo_request.dart';
 import 'package:electronic_assistant/data/api/request/agenda_update_request.dart';
 import 'package:electronic_assistant/data/api/request/agenda_update_request.dart';
 import 'package:electronic_assistant/data/api/request/chat_history_request.dart';
 import 'package:electronic_assistant/data/api/request/chat_history_request.dart';
 import 'package:electronic_assistant/data/api/request/login_request.dart';
 import 'package:electronic_assistant/data/api/request/login_request.dart';
+import 'package:electronic_assistant/data/api/request/order_pay_request.dart';
 import 'package:electronic_assistant/data/api/request/talk_create_request.dart';
 import 'package:electronic_assistant/data/api/request/talk_create_request.dart';
 import 'package:electronic_assistant/data/api/request/talk_delete_request.dart';
 import 'package:electronic_assistant/data/api/request/talk_delete_request.dart';
 import 'package:electronic_assistant/data/api/request/talk_generate_request.dart';
 import 'package:electronic_assistant/data/api/request/talk_generate_request.dart';
@@ -24,6 +25,7 @@ import 'package:electronic_assistant/data/api/response/chat_history_response.dar
 import 'package:electronic_assistant/data/api/response/example_info_response.dart';
 import 'package:electronic_assistant/data/api/response/example_info_response.dart';
 import 'package:electronic_assistant/data/api/response/home_info_response.dart';
 import 'package:electronic_assistant/data/api/response/home_info_response.dart';
 import 'package:electronic_assistant/data/api/response/login_response.dart';
 import 'package:electronic_assistant/data/api/response/login_response.dart';
+import 'package:electronic_assistant/data/api/response/order_pay_response.dart';
 import 'package:electronic_assistant/data/api/response/store_index_response.dart';
 import 'package:electronic_assistant/data/api/response/store_index_response.dart';
 import 'package:electronic_assistant/data/api/response/talk_check_electric_response.dart';
 import 'package:electronic_assistant/data/api/response/talk_check_electric_response.dart';
 import 'package:electronic_assistant/data/api/response/talk_info_response.dart';
 import 'package:electronic_assistant/data/api/response/talk_info_response.dart';
@@ -134,6 +136,10 @@ abstract class AtmobApi {
   @POST("/project/secretary/v1/item/list")
   @POST("/project/secretary/v1/item/list")
   Future<BaseResponse<StoreIndexResponse>> storeIndex(
   Future<BaseResponse<StoreIndexResponse>> storeIndex(
       @Body() AppBaseRequest request);
       @Body() AppBaseRequest request);
+
+  @POST("/project/secretary/v1/order/pay")
+  Future<BaseResponse<OrderPayResponse>> orderPay(
+      @Body() OrderPayRequest request);
 }
 }
 
 
 final atmobApi = AtmobApi(defaultDio, baseUrl: Constants.baseUrl);
 final atmobApi = AtmobApi(defaultDio, baseUrl: Constants.baseUrl);

+ 21 - 0
lib/data/api/request/order_pay_request.dart

@@ -0,0 +1,21 @@
+import 'package:electronic_assistant/base/app_base_request.dart';
+import 'package:json_annotation/json_annotation.dart';
+
+part 'order_pay_request.g.dart';
+
+@JsonSerializable()
+class OrderPayRequest extends AppBaseRequest {
+  @JsonKey(name: 'itemId')
+  int itemId;
+
+  @JsonKey(name: 'payPlatform')
+  int payPlatform;
+
+  @JsonKey(name: 'payMethod')
+  int payMethod;
+
+  OrderPayRequest(this.itemId, this.payPlatform, this.payMethod);
+
+  @override
+  Map<String, dynamic> toJson() => _$OrderPayRequestToJson(this);
+}

+ 47 - 0
lib/data/api/response/order_pay_response.dart

@@ -0,0 +1,47 @@
+import 'package:json_annotation/json_annotation.dart';
+
+part 'order_pay_response.g.dart';
+
+@JsonSerializable()
+class OrderPayResponse {
+  @JsonKey(name: 'outTradeNo')
+  String outTradeNo;
+
+  @JsonKey(name: 'wechatPayQrcodeUrl')
+  String? wechatPayQrcodeUrl;
+
+  @JsonKey(name: 'wechatPayRedirectUrl')
+  String? wechatPayRedirectUrl;
+
+  @JsonKey(name: 'wechatPayPrepayJson')
+  String? wechatPayPrepayJson;
+
+  @JsonKey(name: 'alipayQrcodeHtml')
+  String? alipayQrcodeHtml;
+
+  @JsonKey(name: 'aliPaySubmitHtml')
+  String? aliPaySubmitHtml;
+
+  @JsonKey(name: 'alipayOrderString')
+  String? alipayOrderString;
+
+  @JsonKey(name: 'appAccountToken')
+  String? appAccountToken;
+
+  @JsonKey(name: 'wechatPayH5Url')
+  String? wechatPayH5Url;
+
+  OrderPayResponse(
+      this.outTradeNo,
+      this.wechatPayQrcodeUrl,
+      this.wechatPayRedirectUrl,
+      this.wechatPayPrepayJson,
+      this.alipayQrcodeHtml,
+      this.aliPaySubmitHtml,
+      this.alipayOrderString,
+      this.appAccountToken,
+      this.wechatPayH5Url);
+
+  factory OrderPayResponse.fromJson(Map<String, dynamic> json) =>
+      _$OrderPayResponseFromJson(json);
+}

+ 47 - 0
lib/data/bean/wechat_payment_sign_bean.dart

@@ -0,0 +1,47 @@
+import 'dart:convert';
+
+import 'package:json_annotation/json_annotation.dart';
+
+part 'wechat_payment_sign_bean.g.dart';
+
+@JsonSerializable()
+class WechatPaymentSignBean {
+  @JsonKey(name: 'appId')
+  String appId;
+
+  @JsonKey(name: 'nonceStr')
+  String nonceStr;
+
+  @JsonKey(name: 'package')
+  String package;
+
+  @JsonKey(name: 'partnerId')
+  String partnerId;
+
+  @JsonKey(name: 'prepayId')
+  String prepayId;
+
+  @JsonKey(name: 'sign')
+  String sign;
+
+  @JsonKey(name: 'timeStamp')
+  String timeStamp;
+
+  WechatPaymentSignBean({
+    this.appId = '',
+    this.nonceStr = '',
+    this.package = '',
+    this.partnerId = '',
+    this.prepayId = '',
+    this.sign = '',
+    this.timeStamp = '',
+  });
+
+  static WechatPaymentSignBean stringToBean(String jsonStr) {
+    final Map<String, dynamic> json = jsonDecode(jsonStr);
+    return WechatPaymentSignBean.fromJson(json);
+  }
+
+  factory WechatPaymentSignBean.fromJson(Map<String, dynamic> json) =>
+      _$WechatPaymentSignBeanFromJson(json);
+}

+ 14 - 4
lib/data/consts/constants.dart

@@ -22,10 +22,6 @@ class Constants {
 
 
   static const String userAgreement =
   static const String userAgreement =
       "https://cdn.v8dashen.com/static/xt-xm-clause.html";
       "https://cdn.v8dashen.com/static/xt-xm-clause.html";
-
-  static const int paymentMethodAlipay = 1;
-
-  static const int paymentMethodWechat = 2;
 }
 }
 
 
 String getBaseUrl() {
 String getBaseUrl() {
@@ -40,3 +36,17 @@ String getBaseUrl() {
       return Constants._devBaseUrl;
       return Constants._devBaseUrl;
   }
   }
 }
 }
+
+class PayPlatform {
+  static const int android = 1;
+  static const int ios = 2;
+  static const int qrCode = 4;
+}
+
+class PayMethod {
+  static const int alipay = 1;
+  static const int wechat = 2;
+  static const int ios = 3;
+  static const int google = 4;
+  static const int douYin = 5;
+}

+ 9 - 0
lib/data/repositories/store_repository.dart

@@ -4,6 +4,8 @@ import 'package:electronic_assistant/data/bean/store_item.dart';
 import 'package:electronic_assistant/utils/http_handler.dart';
 import 'package:electronic_assistant/utils/http_handler.dart';
 
 
 import '../../base/app_base_request.dart';
 import '../../base/app_base_request.dart';
+import '../api/request/order_pay_request.dart';
+import '../api/response/order_pay_response.dart';
 
 
 class StoreRepository {
 class StoreRepository {
   StoreRepository._();
   StoreRepository._();
@@ -17,6 +19,13 @@ class StoreRepository {
         .storeIndex(AppBaseRequest())
         .storeIndex(AppBaseRequest())
         .then(HttpHandler.handle(false));
         .then(HttpHandler.handle(false));
   }
   }
+
+  Future<OrderPayResponse> orderPay(
+      int itemId, int payPlatform, int payMethod) {
+    return atmobApi
+        .orderPay(OrderPayRequest(itemId, payPlatform, payMethod))
+        .then(HttpHandler.handle(false));
+  }
 }
 }
 
 
 final StoreRepository storeRepository = StoreRepository._();
 final StoreRepository storeRepository = StoreRepository._();

+ 2 - 2
lib/dialog/loading_dialog.dart

@@ -1,8 +1,8 @@
 import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
 import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
 
 
 class LoadingDialog {
 class LoadingDialog {
-  static void show(String msg) {
-    SmartDialog.showLoading(msg: msg, backDismiss: false);
+  static void show(String msg, {bool backDismiss = false}) {
+    SmartDialog.showLoading(msg: msg, backDismiss: backDismiss);
   }
   }
 
 
   static void hide() {
   static void hide() {

+ 83 - 1
lib/module/store/controller.dart

@@ -1,9 +1,25 @@
 import 'package:electronic_assistant/base/base_controller.dart';
 import 'package:electronic_assistant/base/base_controller.dart';
 import 'package:electronic_assistant/data/bean/payment_way.dart';
 import 'package:electronic_assistant/data/bean/payment_way.dart';
 import 'package:electronic_assistant/data/repositories/store_repository.dart';
 import 'package:electronic_assistant/data/repositories/store_repository.dart';
+import 'package:electronic_assistant/resource/string.gen.dart';
+import 'package:electronic_assistant/router/app_pages.dart';
+import 'package:electronic_assistant/sdk/pay/agile_pay.dart';
+import 'package:electronic_assistant/sdk/pay/alipay/ali_pay_info.dart';
+import 'package:electronic_assistant/sdk/pay/applepay/apple_pay_info.dart';
+import 'package:electronic_assistant/sdk/pay/code/agile_pay_code.dart';
+import 'package:electronic_assistant/utils/error_handler.dart';
+import 'package:electronic_assistant/utils/http_handler.dart';
+import 'package:electronic_assistant/utils/toast_util.dart';
 import 'package:get/get.dart';
 import 'package:get/get.dart';
 
 
+import '../../data/api/response/order_pay_response.dart';
 import '../../data/bean/store_item.dart';
 import '../../data/bean/store_item.dart';
+import '../../data/bean/wechat_payment_sign_bean.dart';
+import '../../data/consts/constants.dart';
+import '../../data/consts/error_code.dart';
+import '../../dialog/loading_dialog.dart';
+import '../../sdk/pay/listener/agile_pay_state.dart';
+import '../../sdk/pay/wxpay/wechat_pay_info.dart';
 
 
 class StoreController extends BaseController {
 class StoreController extends BaseController {
   final isExpanded = false.obs;
   final isExpanded = false.obs;
@@ -46,5 +62,71 @@ class StoreController extends BaseController {
     currentSelectedPaymentWay.value = paymentWay;
     currentSelectedPaymentWay.value = paymentWay;
   }
   }
 
 
-  onBuyClick() {}
+  onBuyClick() async {
+    StoreItem? storeItem = currentSelectedStoreItem.value;
+    if (storeItem == null) {
+      ToastUtil.showToast(StringName.storeChoiceGoods.tr);
+      return;
+    }
+    PaymentWay? paymentWay = currentSelectedPaymentWay.value;
+    if (paymentWay == null) {
+      ToastUtil.showToast(StringName.storeChoicePayment.tr);
+      return;
+    }
+    int payPlatform = paymentWay.payPlatform;
+    int payMethod = paymentWay.payMethod;
+    LoadingDialog.show(StringName.storePayLoading.tr);
+    try {
+      OrderPayResponse response =
+          await storeRepository.orderPay(storeItem.id, payPlatform, payMethod);
+
+      dynamic payInfo;
+
+      if (payPlatform == PayPlatform.android) {
+        if (payMethod == PayMethod.alipay) {
+          payInfo = AliPayInfo(response.alipayOrderString!);
+        } else if (payMethod == PayMethod.wechat) {
+          WechatPaymentSignBean bean =
+              WechatPaymentSignBean.stringToBean(response.wechatPayPrepayJson!);
+          payInfo = WechatPayInfo(
+              appId: bean.appId,
+              partnerId: bean.partnerId,
+              prepayId: bean.prepayId,
+              package: bean.package,
+              noncestr: bean.nonceStr,
+              timestamp: bean.timeStamp,
+              sign: bean.sign);
+        }
+      } else if (payPlatform == PayPlatform.ios) {
+        // payInfo = ApplePayInfo();
+      }
+      AgilePay.startPay(payInfo, success: (String? result) {
+        ToastUtil.showToast('支付成功');
+        LoadingDialog.hide();
+      }, payError: (int error, String? errorMessage) {
+        LoadingDialog.hide();
+      }, error: (int errno, String? error) {
+        if (errno == AgilePayCode.payCodeCancelError) {
+          ToastUtil.showToast(StringName.storePayUserCancel.tr);
+        }
+        LoadingDialog.hide();
+      });
+    } catch (error) {
+      if (error is ServerErrorException &&
+          error.code == ErrorCode.errorCodeNoLogin) {
+        ToastUtil.showToast(StringName.errorCodeNoLogin.tr);
+        Get.toNamed(RoutePath.login);
+      } else {
+        ErrorHandler.toastError(error);
+      }
+    } finally {
+      LoadingDialog.hide();
+    }
+  }
+
+  @override
+  void onClose() {
+    super.onClose();
+    AgilePay.dispose();
+  }
 }
 }

+ 7 - 7
lib/module/store/view.dart

@@ -533,13 +533,13 @@ class StorePage extends BasePage<StoreController> {
 extension on PaymentWay {
 extension on PaymentWay {
   get _icon {
   get _icon {
     switch (payMethod) {
     switch (payMethod) {
-      // case Constants.paymentMethodAlipay:
-      //   return Assets.images.iconStoreAlipay.image(width: 20.w, height: 20.w);
-      // case Constants.paymentMethodWechat:
-      //   return Assets.images.iconStoreWechatPay
-      //       .image(width: 20.w, height: 20.w);
-      // default:
-      //   return Container();
+      case Constants.paymentMethodAlipay:
+        return Assets.images.iconStoreAlipay.image(width: 20.w, height: 20.w);
+      case Constants.paymentMethodWechat:
+        return Assets.images.iconStoreWechatPay
+            .image(width: 20.w, height: 20.w);
+      default:
+        return Container();
     }
     }
   }
   }
 }
 }

+ 11 - 3
lib/sdk/pay/agile_pay.dart

@@ -11,7 +11,11 @@ import 'listener/agile_pay_state.dart';
 class AgilePay {
 class AgilePay {
   static IAgilePay? realPay;
   static IAgilePay? realPay;
 
 
-  static void startPay(dynamic payInfo, AgilePayState payState) {
+  static void startPay(dynamic payInfo,
+      {required AgilePaySuccess success,
+      required AgilePayError payError,
+      required AgileError error,
+      AgilePayBefore? before}) {
     IAgilePay? iAgilePay;
     IAgilePay? iAgilePay;
 
 
     if (payInfo is AliPayInfo) {
     if (payInfo is AliPayInfo) {
@@ -23,10 +27,14 @@ class AgilePay {
     }
     }
     realPay = iAgilePay;
     realPay = iAgilePay;
     if (iAgilePay != null) {
     if (iAgilePay != null) {
-      iAgilePay.setPayListener(payState);
+      iAgilePay.setPayListener(AgilePayStateImpl(
+          paySuccessListener: success,
+          payErrorListener: payError,
+          errorListener: error,
+          payBeforeListener: before));
       iAgilePay.pay();
       iAgilePay.pay();
     } else {
     } else {
-      payState.payError(AgilePayCode.payCodeNotSupport,
+      payError(AgilePayCode.payCodeNotSupport,
           AgilePayCode.getMessageByCode(AgilePayCode.payCodeNotSupport));
           AgilePayCode.getMessageByCode(AgilePayCode.payCodeNotSupport));
     }
     }
   }
   }

+ 0 - 5
lib/sdk/pay/alipay/alipay.dart

@@ -20,11 +20,6 @@ class Alipay extends AgilePayStateInfo implements IAgilePay {
   void _listenPay(AlipayResp resp) {
   void _listenPay(AlipayResp resp) {
     final String content = 'pay: ${resp.resultStatus} - ${resp.result}';
     final String content = 'pay: ${resp.resultStatus} - ${resp.result}';
     debugPrint('agilePay-alipay---> $content');
     debugPrint('agilePay-alipay---> $content');
-    if (!_paySubs.isPaused) {
-      sendError(AgilePayCode.payCodeCancelError,
-          AgilePayCode.getMessageByCode(AgilePayCode.payCodeCancelError));
-      return;
-    }
     try {
     try {
       int code = AgilePayCode.payCodeOtherError;
       int code = AgilePayCode.payCodeOtherError;
       if (resp.resultStatus == AgilePayCode.payCodeAlipaySuccess) {
       if (resp.resultStatus == AgilePayCode.payCodeAlipaySuccess) {

+ 1 - 2
lib/sdk/pay/applepay/apple_pay_info.dart

@@ -1,6 +1,5 @@
 import '../assist/apple_or_google_pay_info.dart';
 import '../assist/apple_or_google_pay_info.dart';
-import '../assist/product_type.dart';
 
 
 class ApplePayInfo extends AppleOrGooglePayInfo {
 class ApplePayInfo extends AppleOrGooglePayInfo {
-  ApplePayInfo(super.productId, super.type);
+  ApplePayInfo(super.productId, super.type, super.accountToken);
 }
 }

+ 6 - 2
lib/sdk/pay/assist/apple_or_google_pay.dart

@@ -49,10 +49,14 @@ abstract class AppleOrGooglePay extends AgilePayStateInfo {
         bool isSend;
         bool isSend;
         if (_payInfo.type == ProductType.consumable) {
         if (_payInfo.type == ProductType.consumable) {
           isSend = await _iap.buyConsumable(
           isSend = await _iap.buyConsumable(
-              purchaseParam: PurchaseParam(productDetails: element));
+              purchaseParam: PurchaseParam(
+                  productDetails: element,
+                  applicationUserName: _payInfo.accountToken));
         } else {
         } else {
           isSend = await _iap.buyNonConsumable(
           isSend = await _iap.buyNonConsumable(
-              purchaseParam: PurchaseParam(productDetails: element));
+              purchaseParam: PurchaseParam(
+                  productDetails: element,
+                  applicationUserName: _payInfo.accountToken));
         }
         }
         if (!isSend) {
         if (!isSend) {
           sendError(
           sendError(

+ 5 - 1
lib/sdk/pay/assist/apple_or_google_pay_info.dart

@@ -5,9 +5,13 @@ class AppleOrGooglePayInfo {
 
 
   final ProductType _type;
   final ProductType _type;
 
 
-  AppleOrGooglePayInfo(this._productId, this._type);
+  final String? _accountToken;
+
+  AppleOrGooglePayInfo(this._productId, this._type, this._accountToken);
 
 
   String get productId => _productId;
   String get productId => _productId;
 
 
   ProductType get type => _type;
   ProductType get type => _type;
+
+  String? get accountToken => _accountToken;
 }
 }

+ 41 - 0
lib/sdk/pay/listener/agile_pay_state.dart

@@ -7,3 +7,44 @@ abstract class AgilePayState {
 
 
   void payBefore();
   void payBefore();
 }
 }
+
+typedef AgilePayBefore = void Function();
+typedef AgilePaySuccess = void Function(String? result);
+typedef AgilePayError = void Function(int error, String? errorMessage);
+typedef AgileError = void Function(int errno, String? error);
+
+class AgilePayStateImpl implements AgilePayState {
+  AgileError errorListener;
+
+  AgilePayError payErrorListener;
+
+  AgilePaySuccess paySuccessListener;
+
+  AgilePayBefore? payBeforeListener;
+
+  AgilePayStateImpl(
+      {required this.errorListener,
+      required this.payErrorListener,
+      required this.paySuccessListener,
+      this.payBeforeListener});
+
+  @override
+  void error(int errno, String? error) {
+    errorListener.call(errno, error);
+  }
+
+  @override
+  void payError(int error, String? errorMessage) {
+    payErrorListener.call(error, errorMessage);
+  }
+
+  @override
+  void paySuccess(String? result) {
+    paySuccessListener.call(result);
+  }
+
+  @override
+  void payBefore() {
+    payBeforeListener?.call();
+  }
+}

+ 0 - 5
lib/sdk/pay/wxpay/wechat_pay.dart

@@ -21,11 +21,6 @@ class WechatPay extends AgilePayStateInfo implements IAgilePay {
     if (resp is WechatPayResp) {
     if (resp is WechatPayResp) {
       final String content = 'pay: ${resp.errorCode} ${resp.errorMsg}';
       final String content = 'pay: ${resp.errorCode} ${resp.errorMsg}';
       debugPrint('agilePay-wechat---> $content');
       debugPrint('agilePay-wechat---> $content');
-      if (!_respSubs.isPaused) {
-        sendError(AgilePayCode.payCodeCancelError,
-            AgilePayCode.getMessageByCode(AgilePayCode.payCodeCancelError));
-        return;
-      }
       if (resp.errorCode == WechatResp.kErrorCodeSuccess) {
       if (resp.errorCode == WechatResp.kErrorCodeSuccess) {
         sendPaySuccess(resp.returnKey);
         sendPaySuccess(resp.returnKey);
       } else if (resp.errorCode == WechatResp.kErrorCodeUserCancel) {
       } else if (resp.errorCode == WechatResp.kErrorCodeUserCancel) {

+ 18 - 9
lib/sdk/pay/wxpay/wechat_pay_info.dart

@@ -6,15 +6,24 @@ class WechatPayInfo {
   String _noncestr; // 随机字符串
   String _noncestr; // 随机字符串
   String _timestamp; // 时间戳
   String _timestamp; // 时间戳
   String _sign; // 签名
   String _sign; // 签名
-  String? _universalLink;
-
-  WechatPayInfo(this._appId, this._partnerId, this._prepayId, this._package,
-      this._noncestr, this._timestamp, this._sign,
-      {String? universalLink}) {
-    _universalLink = universalLink;
-  }
-
-  String? get universalLink => _universalLink;
+  String? universalLink;
+
+  WechatPayInfo({
+    required String appId,
+    required String partnerId,
+    required String prepayId,
+    required String package,
+    required String noncestr,
+    required String timestamp,
+    required String sign,
+    this.universalLink,
+  })  : _appId = appId,
+        _partnerId = partnerId,
+        _prepayId = prepayId,
+        _package = package,
+        _noncestr = noncestr,
+        _timestamp = timestamp,
+        _sign = sign;
 
 
   String get appId => _appId;
   String get appId => _appId;