From 1ddc592131e7c88212a9b8120b7211ecbaf06ba8 Mon Sep 17 00:00:00 2001 From: datang Date: Fri, 12 Aug 2022 09:16:52 +0800 Subject: [PATCH] 123 --- lib/main.dart | 52 ++--- lib/model/pay/pay_model.dart | 73 +++++++ lib/model/pay/pay_model.g.dart | 28 +++ lib/model/pay/wx_pay_model.dart | 37 ++++ lib/model/pay/wx_pay_model.g.dart | 16 ++ lib/ui/login/login_page.dart | 2 +- lib/ui/user/user_page.dart | 46 +++-- lib/utils/pay_util.dart | 332 +++++++++++++++--------------- 8 files changed, 378 insertions(+), 208 deletions(-) create mode 100644 lib/model/pay/pay_model.dart create mode 100644 lib/model/pay/pay_model.g.dart create mode 100644 lib/model/pay/wx_pay_model.dart create mode 100644 lib/model/pay/wx_pay_model.g.dart diff --git a/lib/main.dart b/lib/main.dart index a4babb9..f528395 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -12,19 +12,16 @@ import 'package:power_logger/power_logger.dart'; import 'package:project_telephony/providers/user_provider.dart'; import 'package:project_telephony/ui/tab_navigator.dart'; -import 'package:project_telephony/ui/user/privacy_rights_page.dart'; import 'package:provider/provider.dart'; import 'package:telephony/telephony.dart'; import 'package:project_telephony/utils/hive_store.dart'; -void _sendSMS(String message, List recipients) async { - try{ - String result = - await sendSMS(message: message, recipients: recipients, sendDirect: true); - print(result); - } on PlatformException catch(e){ - print(e.toString()); - } +void _sendSMS(String message, List recipents) async { + String _result = await sendSMS(message: message, recipients: recipents) + .catchError((onError) { + print(onError); + }); + print(_result); } void main() async { @@ -69,24 +66,33 @@ void onStart() { Timer.periodic(const Duration(seconds: 1), (timer) async { CallState state = await Telephony.instance.callState; callState = state.name; - // print(callState!+"$flag"); + print(callState!+" $flag"); if (callState == "IDLE") { if (flag != 0) { flag = 0; // print("object"); - // final Iterable result = await CallLog.query(); - // phoneNum = result.first.number; - // // print(phoneNum); - List recipents = ["13486828191"]; - // CallState state = await telephony.callState; - _sendSMS("你好", recipents); - // phoneNum = result.first.number; - // // print(phoneNum); - // Phone.telephony.sendSms( - // to: phoneNum!, - // message: "hello", - // isMultipart: true, - // ); + final Iterable result = await CallLog.query(); + phoneNum = result.first.number; + // print(phoneNum); + // String message = "This is a test message!"; + // List recipents = ["10000", "10086"]; + // String _result = await sendSMS(message: message, recipients: recipents, sendDirect: true) + // .catchError((onError) { + // print(onError); + // }); + // print(_result); + phoneNum = result.first.number; + print(phoneNum); + final SmsSendStatusListener listener = (SendStatus status) { + print(status); + }; + Phone.telephony.sendSms( + to: phoneNum!, + message: "hello", + statusListener: listener, + isMultipart: true, + + ); } } else if (callState == "RINGING") { flag++; diff --git a/lib/model/pay/pay_model.dart b/lib/model/pay/pay_model.dart new file mode 100644 index 0000000..cad3fa0 --- /dev/null +++ b/lib/model/pay/pay_model.dart @@ -0,0 +1,73 @@ +import 'package:equatable/equatable.dart'; +import 'package:json_annotation/json_annotation.dart'; + +part 'pay_model.g.dart'; + +@JsonSerializable() +class PayModel extends Equatable { + @JsonKey(name: 'alipay_trade_app_pay_response') + final AliPayTradeAppPayResponse aliPayTradeAppPayResponse; + final String sign; + @JsonKey(name: 'sign_type') + final String signType; + + const PayModel({ + required this.aliPayTradeAppPayResponse, + required this.sign, + required this.signType, + }); + + factory PayModel.fromJson(Map json) => + _$PayModelFromJson(json); + + @override + List get props => [aliPayTradeAppPayResponse, sign, signType]; +} + +@JsonSerializable() +class AliPayTradeAppPayResponse extends Equatable { + final String code; + final String msg; + @JsonKey(name: 'app_id') + final String appId; + @JsonKey(name: 'out_trade_no') + final String outTradeNo; + @JsonKey(name: 'trade_no') + final String tradeNo; + @JsonKey(name: 'total_amount') + final String totalAmount; + @JsonKey(name: 'seller_id') + final String sellerId; + final String charset; + final String timestamp; + + const AliPayTradeAppPayResponse({ + required this.code, + required this.msg, + required this.appId, + required this.outTradeNo, + required this.tradeNo, + required this.totalAmount, + required this.sellerId, + required this.charset, + required this.timestamp, + }); + + factory AliPayTradeAppPayResponse.fromJson(Map json) => + _$AliPayTradeAppPayResponseFromJson(json); + + @override + List get props { + return [ + code, + msg, + appId, + outTradeNo, + tradeNo, + totalAmount, + sellerId, + charset, + timestamp, + ]; + } +} diff --git a/lib/model/pay/pay_model.g.dart b/lib/model/pay/pay_model.g.dart new file mode 100644 index 0000000..e5a3963 --- /dev/null +++ b/lib/model/pay/pay_model.g.dart @@ -0,0 +1,28 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'pay_model.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +PayModel _$PayModelFromJson(Map json) => PayModel( + aliPayTradeAppPayResponse: AliPayTradeAppPayResponse.fromJson( + json['alipay_trade_app_pay_response'] as Map), + sign: json['sign'] as String, + signType: json['sign_type'] as String, +); + +AliPayTradeAppPayResponse _$AliPayTradeAppPayResponseFromJson( + Map json) => + AliPayTradeAppPayResponse( + code: json['code'] as String, + msg: json['msg'] as String, + appId: json['app_id'] as String, + outTradeNo: json['out_trade_no'] as String, + tradeNo: json['trade_no'] as String, + totalAmount: json['total_amount'] as String, + sellerId: json['seller_id'] as String, + charset: json['charset'] as String, + timestamp: json['timestamp'] as String, + ); diff --git a/lib/model/pay/wx_pay_model.dart b/lib/model/pay/wx_pay_model.dart new file mode 100644 index 0000000..601f906 --- /dev/null +++ b/lib/model/pay/wx_pay_model.dart @@ -0,0 +1,37 @@ +import 'package:equatable/equatable.dart'; +import 'package:json_annotation/json_annotation.dart'; + +part 'wx_pay_model.g.dart'; + +@JsonSerializable() +class WxPayModel extends Equatable { + final String prepayId; + final String partnerId; + final String timeStamp; + final String nonceStr; + final String package; + final String sign; + + factory WxPayModel.fromJson(Map json) => + _$WxPayModelFromJson(json); + + + const WxPayModel({ + required this.prepayId, + required this.partnerId, + required this.timeStamp, + required this.nonceStr, + required this.package, + required this.sign, + }); + + @override + List get props => [ + prepayId, + partnerId, + timeStamp, + nonceStr, + package, + sign, + ]; +} diff --git a/lib/model/pay/wx_pay_model.g.dart b/lib/model/pay/wx_pay_model.g.dart new file mode 100644 index 0000000..654a14e --- /dev/null +++ b/lib/model/pay/wx_pay_model.g.dart @@ -0,0 +1,16 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'wx_pay_model.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +WxPayModel _$WxPayModelFromJson(Map json) => WxPayModel( + prepayId: json['prepayId'] as String, + partnerId: json['partnerId'] as String, + timeStamp: json['timeStamp'] as String, + nonceStr: json['nonceStr'] as String, + package: json['package'] as String, + sign: json['sign'] as String, +); diff --git a/lib/ui/login/login_page.dart b/lib/ui/login/login_page.dart index e532155..50d6aa0 100644 --- a/lib/ui/login/login_page.dart +++ b/lib/ui/login/login_page.dart @@ -132,7 +132,7 @@ class _LoginPageState extends State { data: {'phone': _phoneController.text, 'code': _smsCodeController.text}); if (base.code == 0) { await UserTool.userProvider.setToken(base.data['token']); - Get.back(); + Get.to(() => const TabNavigator()); } else { CloudToast.show(base.msg); } diff --git a/lib/ui/user/user_page.dart b/lib/ui/user/user_page.dart index 43345f1..39a6270 100644 --- a/lib/ui/user/user_page.dart +++ b/lib/ui/user/user_page.dart @@ -5,6 +5,7 @@ import 'package:permission_handler/permission_handler.dart'; import 'package:permission_handler_platform_interface/permission_handler_platform_interface.dart'; import 'package:project_telephony/base/base_style.dart'; import 'package:project_telephony/ui/login/login_page.dart'; +import 'package:project_telephony/ui/tab_navigator.dart'; import 'package:project_telephony/ui/user/members_page.dart'; import 'package:project_telephony/ui/user/privacy_rights_page.dart'; import 'package:project_telephony/ui/widget/image_scaffold.dart'; @@ -12,9 +13,15 @@ import 'package:project_telephony/ui/widget/plone_bottom.dart'; import 'package:project_telephony/ui/widget/plone_image_picker.dart'; import 'package:project_telephony/utils/headers.dart'; import 'package:project_telephony/utils/permissionutils.dart'; +import 'package:provider/provider.dart'; import 'package:telephony/telephony.dart'; +import '../../constants/api.dart'; +import '../../model/network/api_client.dart'; import '../../permission.dart'; +import '../../providers/user_provider.dart'; +import '../../utils/toast/cloud_toast.dart'; +import '../../utils/user_tool.dart'; import '../home/home_page.dart'; class UserPage extends StatefulWidget { @@ -26,13 +33,9 @@ class UserPage extends StatefulWidget { final Telephony telephony = Telephony.instance; -@override -void initState() {} - class _UserPageState extends State { bool vle = false; - bool tooken = true; - + final userProvider = Provider.of(Get.context!, listen: false); @override Widget build(BuildContext context) { @@ -55,17 +58,24 @@ class _UserPageState extends State { _getSwitch(Assets.icons.sms.path, "短信标签", false), // const Spacer(), 182.hb, - tooken? - PloneBottom( - border: false, - onTap: () { - Get.to(() => const HomePage()); - }, - textColor: const Color(0xFF1890FF), - color1: const Color(0xFFEBF5FF), - color2: const Color(0xFFEBF5FF), - text: "退出登录", - ):const SizedBox() + userProvider.isLogin + ? PloneBottom( + border: false, + onTap: () async{ + var cancel = CloudToast.loading; + var base = await apiClient.request(API.manager.logout, showMessage: true); + if (base.code == 0) { + UserTool.userProvider.logout(); + Get.offAll(const HomePage()); + } + cancel(); + }, + textColor: const Color(0xFF1890FF), + color1: const Color(0xFFEBF5FF), + color2: const Color(0xFFEBF5FF), + text: "退出登录", + ) + : const SizedBox() ]), ); } @@ -84,7 +94,7 @@ class _UserPageState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - tooken? "xxxxx": "登录/注册" , + userProvider.isLogin ? userProvider.userInfo.name : "登录/注册", style: TextStyle( fontSize: BaseStyle.fontSize48, color: BaseStyle.color333333, @@ -92,7 +102,7 @@ class _UserPageState extends State { ), 24.hb, Text( - tooken ? "登录获取更多信息" : "欢迎您登录短信帮手", + userProvider.isLogin ? "欢迎您登录短信帮手" : "登录获取更多信息", style: TextStyle( fontSize: BaseStyle.fontSize28, color: BaseStyle.color333333), diff --git a/lib/utils/pay_util.dart b/lib/utils/pay_util.dart index fde58bd..fb7672f 100644 --- a/lib/utils/pay_util.dart +++ b/lib/utils/pay_util.dart @@ -1,166 +1,166 @@ -// import 'dart:async'; -// import 'dart:convert'; - -// import 'package:bot_toast/bot_toast.dart'; -// import 'package:cloud_car/model/pay/wx_pay_model.dart'; -// import 'package:cloud_car/utils/new_work/api_client.dart'; -// import 'package:cloud_car/utils/toast/cloud_toast.dart'; -// import 'package:dio/dio.dart'; -// import 'package:flutter/foundation.dart'; -// import 'package:fluwx/fluwx.dart'; -// import 'package:power_logger/power_logger.dart'; -// import 'package:tobias/tobias.dart'; - -// import '../model/pay/pay_model.dart'; - -// enum PAYTYPE { -// ///支付宝 -// ali, - -// ///微信 -// wx, - -// ///现金 -// cash, - -// ///pos -// pos -// } - -// class PayUtil { -// static final PayUtil _instance = PayUtil._(); - -// factory PayUtil() => _instance; - -// PayUtil._(); - -// void resultSatus(String status) { -// switch (status) { -// case '8000': -// BotToast.showText(text: '正在处理中'); -// break; -// case '4000': -// BotToast.showText(text: '订单支付失败'); -// break; -// case '5000': -// BotToast.showText(text: '重复请求'); -// break; -// case '6001': -// BotToast.showText(text: ' 用户中途取消'); -// break; -// case '6002': -// BotToast.showText(text: '网络连接出错'); -// break; -// case '6004': -// BotToast.showText(text: '支付结果未知,请查询商户订单列表中订单的支付状态'); -// break; -// default: -// BotToast.showText(text: '其他支付错误'); -// break; -// } -// } - -// String _resultStatus = ''; - -// ///支付宝支付 -// ///传入订单信息和确认订单请求地址 -// Future callAliPay(String order, {String? apiPath}) async { -// var install = await isAliPayInstalled(); -// if (!install) { -// BotToast.showText(text: '未安装支付宝!'); -// return false; -// } -// Map result = {}; -// try { -// result = await aliPay(order); -// } catch (e) { -// if (kDebugMode) { -// print(e.toString()); -// } -// } -// _resultStatus = result['resultStatus']; -// if (_resultStatus == '9000') { -// String res = result['result']; -// PayModel model = PayModel.fromJson(jsonDecode(res)); -// if (apiPath != null) { -// bool confirmResult = await _confirmPayResult( -// apiPath, model.aliPayTradeAppPayResponse.outTradeNo); -// return confirmResult; -// } else { -// CloudToast.show('支付成功'); -// return true; -// } -// } else { -// resultSatus(_resultStatus); -// return false; -// } -// } - -// Future _confirmPayResult(String path, String code) async { -// try { -// int status = 0; -// for (var i = 0; i < 3; i++) { -// await Future.delayed(const Duration(milliseconds: 1000), () async { -// Response response = await apiClient.dio.get(path, queryParameters: { -// "code": code, -// }); -// status = response.data['status'] as int; -// }); -// if (status == 2) { -// break; -// } -// } -// if (status == 2) { -// BotToast.showText(text: '交易成功'); -// return true; -// } else { -// BotToast.showText(text: '交易失败 错误码$status'); -// return false; -// } -// } catch (e) { -// BotToast.showText(text: '网络请求错误'); -// LoggerData.addData(e); -// return false; -// } -// } - -// ///微信支付 - -// StreamSubscription? _wxPayStream; - -// void wxPayAddListener( -// {required VoidCallback paySuccess, -// Function(BaseWeChatResponse)? payError}) { -// _wxPayStream = weChatResponseEventHandler.listen((event) { -// if (kDebugMode) { -// print('errorCode:${event.errCode} errorStr:${event.errStr}'); -// } -// if (event.errCode == 0) { -// paySuccess(); -// } else { -// LoggerData.addData( -// 'errorCode:${event.errCode} errorStr:${event.errStr ?? '支付失败'}'); -// CloudToast.show(event.errStr ?? '支付失败'); -// if (payError != null) payError(event); -// //payError == null ? null : payError(event); -// } -// }); -// } - -// void removeWxPayListener() { -// _wxPayStream?.cancel(); -// } - -// Future callWxPay({ -// required WxPayModel payModel, -// }) async { -// await payWithWeChat( -// appId: 'wx9bc3ffb23a749254', -// partnerId: payModel.partnerId, -// prepayId: payModel.prepayId, -// packageValue: payModel.package, -// nonceStr: payModel.nonceStr, -// timeStamp: int.parse(payModel.timeStamp), -// sign: payModel.sign); -// } -// } +import 'dart:async'; +import 'dart:convert'; + +import 'package:bot_toast/bot_toast.dart'; +import 'package:dio/dio.dart'; +import 'package:flutter/foundation.dart'; +import 'package:fluwx/fluwx.dart'; +import 'package:power_logger/power_logger.dart'; +import 'package:project_telephony/utils/toast/cloud_toast.dart'; +import 'package:tobias/tobias.dart'; + +import '../model/network/api_client.dart'; +import '../model/pay/pay_model.dart'; +import '../model/pay/wx_pay_model.dart'; + +enum PAYTYPE { + ///支付宝 + ali, + + ///微信 + wx, + + ///现金 + cash, + + ///pos + pos +} + +class PayUtil { + static final PayUtil _instance = PayUtil._(); + + factory PayUtil() => _instance; + + PayUtil._(); + + void resultSatus(String status) { + switch (status) { + case '8000': + BotToast.showText(text: '正在处理中'); + break; + case '4000': + BotToast.showText(text: '订单支付失败'); + break; + case '5000': + BotToast.showText(text: '重复请求'); + break; + case '6001': + BotToast.showText(text: ' 用户中途取消'); + break; + case '6002': + BotToast.showText(text: '网络连接出错'); + break; + case '6004': + BotToast.showText(text: '支付结果未知,请查询商户订单列表中订单的支付状态'); + break; + default: + BotToast.showText(text: '其他支付错误'); + break; + } + } + + String _resultStatus = ''; + + ///支付宝支付 + ///传入订单信息和确认订单请求地址 + Future callAliPay(String order, {String? apiPath}) async { + var install = await isAliPayInstalled(); + if (!install) { + BotToast.showText(text: '未安装支付宝!'); + return false; + } + Map result = {}; + try { + result = await aliPay(order); + } catch (e) { + if (kDebugMode) { + print(e.toString()); + } + } + _resultStatus = result['resultStatus']; + if (_resultStatus == '9000') { + String res = result['result']; + PayModel model = PayModel.fromJson(jsonDecode(res)); + if (apiPath != null) { + bool confirmResult = await _confirmPayResult( + apiPath, model.aliPayTradeAppPayResponse.outTradeNo); + return confirmResult; + } else { + CloudToast.show('支付成功'); + return true; + } + } else { + resultSatus(_resultStatus); + return false; + } + } + + Future _confirmPayResult(String path, String code) async { + try { + int status = 0; + for (var i = 0; i < 3; i++) { + await Future.delayed(const Duration(milliseconds: 1000), () async { + Response response = await apiClient.dio.get(path, queryParameters: { + "code": code, + }); + status = response.data['status'] as int; + }); + if (status == 2) { + break; + } + } + if (status == 2) { + BotToast.showText(text: '交易成功'); + return true; + } else { + BotToast.showText(text: '交易失败 错误码$status'); + return false; + } + } catch (e) { + BotToast.showText(text: '网络请求错误'); + LoggerData.addData(e); + return false; + } + } + + ///微信支付 + + StreamSubscription? _wxPayStream; + + void wxPayAddListener( + {required VoidCallback paySuccess, + Function(BaseWeChatResponse)? payError}) { + _wxPayStream = weChatResponseEventHandler.listen((event) { + if (kDebugMode) { + print('errorCode:${event.errCode} errorStr:${event.errStr}'); + } + if (event.errCode == 0) { + paySuccess(); + } else { + LoggerData.addData( + 'errorCode:${event.errCode} errorStr:${event.errStr ?? '支付失败'}'); + CloudToast.show(event.errStr ?? '支付失败'); + if (payError != null) payError(event); + //payError == null ? null : payError(event); + } + }); + } + + void removeWxPayListener() { + _wxPayStream?.cancel(); + } + + Future callWxPay({ + required WxPayModel payModel, + }) async { + await payWithWeChat( + appId: 'wx9bc3ffb23a749254', + partnerId: payModel.partnerId, + prepayId: payModel.prepayId, + packageValue: payModel.package, + nonceStr: payModel.nonceStr, + timeStamp: int.parse(payModel.timeStamp), + sign: payModel.sign); + } +}