diff --git a/lib/util/mob_util/mob_util.dart b/lib/util/mob_util/mob_util.dart new file mode 100644 index 0000000..4ab8000 --- /dev/null +++ b/lib/util/mob_util/mob_util.dart @@ -0,0 +1,134 @@ +import 'package:flutter/cupertino.dart'; +import 'package:mobsms/mobsms.dart'; +import 'package:zhiying_comm/pages/login_page/model/login_model.dart'; +import 'package:zhiying_comm/util/empty_util.dart'; +import 'package:zhiying_comm/util/enum_util.dart'; +import 'package:zhiying_comm/util/global_config.dart'; +import 'package:zhiying_comm/util/log/let_log.dart'; +import 'package:zhiying_comm/util/mob_util/secverify/quick_login_util.dart'; +import 'package:zhiying_comm/util/net_util.dart'; + +/// +/// MOB SDK 工具类 +/// +class MobUtil { + /// + /// MOB 各个sdk初始化 + /// + /// + static void init() { + // 秒验的初始化 + QuickLoginUtil.getInstance().init(); + } + + /// + /// 打开秒验页面 + /// + /// context: 当前应用的上下文 + /// model: 快速登录的样式 + /// + static void openQuickLoginPage(BuildContext context, Quick model) { + QuickLoginUtil.getInstance().openQuickLogin(context, model); + } + + /// + /// 获取短信 + /// 流程:先根据类型请求后台获取是否余额充足,根据返回的模版类型进行MOB SDK的验证码下发。 + /// + /// phone: 手机号 + /// zoneCode: 地区号码 + /// templateID: 模板ID + /// + /// 例子:获取绑定手机号验证码:bool result = await MobUtil.getTextCode('手机号码', zoneCode = '86', smsCodeType = SMSCodeType.BIND_ALIPAY); + /// + static Future getTextCode(final String phone, {String zoneCode = '86', SMSCodeType smsCodeType = SMSCodeType.NORMAL}) async { + bool result = false; + String vCodeType = await _getSMSStrategy(phone, type: smsCodeType); + if (EmptyUtil.isEmpty(vCodeType)) return result; + Logger.debug('phone = $phone, zoneCode = $zoneCode, vCodeType = $vCodeType'); + await Smssdk.getTextCode(phone, zoneCode, vCodeType, (ret, err) { + if (err != null) { + result = false; + Logger.debug('get vcode fail err = ${err?.toString()}'); + } else { + String rst = ret.toString(); + if (rst == null || rst == "") { + rst = '获取验证码成功! ret = ${ret?.toString()}'; + } + Logger.debug(rst); + result = true; + } + }); + return Future.value(result); + } + + /// + /// 提交验证码 + /// + /// phone: 手机号码 + /// code: 验证码 + /// zoneCode: 区号 + /// + // static Future commitCode(final String phone, String code, {String zoneCode = '86'}) async { + // bool result = false; + // await Smssdk.commitCode(phone, zoneCode, code, (ret, err) { + // if (err != null) { + // // showAlert(err.toString(),context); + // result = false; + // } else { + // // showAlert('提交验证码成功!',context); + // result = true; + // // _countMobSMS(phone, code, zoneCode: zoneCode); + // } + // }); + // return Future.value(result); + // } + + + /// 询问验证码是否可以下发 + static Future _getSMSStrategy(final String phone, {SMSCodeType type = SMSCodeType.NORMAL}) async { + try { + String vCodeType = enumToString(type)?.toLowerCase(); + if (EmptyUtil.isEmpty(vCodeType)) { + vCodeType = enumToString(SMSCodeType.NORMAL).toLowerCase(); + } + String url = type == SMSCodeType.AUTO ? '/api/v1/mob/sms/tmp/${vCodeType}?phone=${phone}' : '/api/v1/mob/sms/tmp/$vCodeType'; + var result = await NetUtil.post(url, method: NetMethod.GET); + if (NetUtil.isSuccess(result) && !EmptyUtil.isEmpty(result[GlobalConfig.HTTP_RESPONSE_KEY_DATA])) { + return result[GlobalConfig.HTTP_RESPONSE_KEY_DATA]; + } + } catch (e, s) { + Logger.error(e, s); + } + return null; + } + + /// 统计MOB验证码提交 + // static void _countMobSMS(final String phone, final String code, {String zoneCode = '86'}) async { + // try { + // NetUtil.post('/api/v1/funtions/mobsms', params: {'phone': phone, "code": code, 'zone': zoneCode}, showToast: false); + // } catch (e, s) { + // Logger.error(e, s); + // } + // } + +} + +enum SMSCodeType { + // 普通验证码 + NORMAL, + // 登录 + LOGIN, + // 注册模版验证码 + REGISTER, + // 绑定支付宝验证码 + BIND_ALIPAY, + // 绑定手机号验证码 + BIND_PHONE, + // 取消绑定支付宝验证码 + UNBIND_ALIPAY, + // 取消绑定手机号 + UNBIND_PHONE, + // 后台自动判断登录还是注册 + AUTO, +} diff --git a/lib/util/mob_util/secverify/quick_login_util.dart b/lib/util/mob_util/secverify/quick_login_util.dart new file mode 100644 index 0000000..1b433a8 --- /dev/null +++ b/lib/util/mob_util/secverify/quick_login_util.dart @@ -0,0 +1,661 @@ +import 'dart:io'; + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:secverify/secverify.dart'; +import 'package:zhiying_comm/models/user/user_info_model.dart'; +import 'package:zhiying_comm/models/user/user_info_model_notifier.dart'; +import 'package:zhiying_comm/pages/login_page/account/login_account_page.dart'; +import 'package:zhiying_comm/pages/login_page/invite/login_invite_page.dart'; +import 'package:zhiying_comm/pages/login_page/model/login_model.dart'; +import 'package:zhiying_comm/util/empty_util.dart'; +import 'package:zhiying_comm/util/global_config.dart'; +import 'package:zhiying_comm/util/log/let_log.dart'; +import 'package:zhiying_comm/util/net_util.dart'; +import 'package:provider/provider.dart'; +import 'package:fluttertoast/fluttertoast.dart'; +import '../../page_factory.dart'; + +class QuickLoginUtil { + // sdk 版本 + String _version = "unkown"; + + // 是否支持 + bool _isVerifySupport = true; + + /// 单例对象 + static QuickLoginUtil _instance; + + /// 内部构造方法,可避免外部暴露构造函数,进行实例化 + QuickLoginUtil._internal(); + + /// 工厂构造方法,这里使用命名构造函数方式进行声明 + factory QuickLoginUtil.getInstance() => _getInstance(); + + /// 获取单例内部方法 + static _getInstance() { + // 只能有一个实例 + if (_instance == null) { + _instance = QuickLoginUtil._internal(); + } + return _instance; + } + + /// 初始化方法 + void init() { + //可选预先设置 + _preSettings(); + //判断手机本地环境是否支持 + isVerifySupport(); + if (_isVerifySupport) { + //预取号 + _preVerify(); + } + } + + /// 打开秒验登录页面的方法 + void openQuickLogin(BuildContext context, Quick model) { + // 取号前设置 + Secverify.autoFinishOauthPage(false); + //设置UI属性 + _setPortraitLayout(model); + Secverify.isVerifySupport.then((bool value) { + if (value) { + _verify(context); + } else { + // showAlert("当前环境不支持", context); + Logger.warn("当前环境不支持"); + _openSMSLoginPage(context); + } + }); + } + + /// 打开验证码登录的方法 + void _openSMSLoginPage(BuildContext context) { + /// 需要填写注册码再跳首页 + Navigator.push(context, CupertinoPageRoute(builder: (_) => LoginAccountPage(null))); + } + + /// 打开邀请码页面 + void _openInvitePage(BuildContext context) { + print('跳转到邀请码页面'); + Navigator.push(context, CupertinoPageRoute(builder: (_) => LoginInvitePage())); + } + + /// 打开首页的方法 + void _openHomePage(BuildContext context) { + Navigator.pushAndRemoveUntil(context, MaterialPageRoute(builder: (BuildContext context) => PageFactory.create('homePage', null)), (Route route) => false); + } + + // 需要自己实现这部分 + void _doLogin(Map ret, BuildContext context) async { + var opToken = ret.containsKey("opToken") ? ret["opToken"] : ""; + var token = ret.containsKey("token") ? ret["token"] : ""; + var operator = ret.containsKey("operator") ? ret["operator"] : ""; + var phoneOperator = ret.containsKey("phoneOperator") ? ret["phoneOperator"] : ""; + var md5 = ret.containsKey("md5") ? ret["md5"] : ""; + // var appKey = ret.containsKey("appkey") ? ret["appkey"] : ""; + + var params = Map(); + params["optoken"] = opToken; + params["operator"] = operator; + params["operator"] = phoneOperator; + params["token"] = token; + if(!EmptyUtil.isEmpty(md5)) params["md5"] = md5; + // params["appkey"] = appKey; + + try { + var result = await NetUtil.post('/api/v1/sign/mob/in', params: params, method: NetMethod.POST); + if (NetUtil.isSuccess(result) && !EmptyUtil.isEmpty(result[GlobalConfig.HTTP_RESPONSE_KEY_DATA])) { + UserInfoModel model = UserInfoModel.fromJson(result[GlobalConfig.HTTP_RESPONSE_KEY_DATA]); + if (!EmptyUtil.isEmpty(model)) { + if (model.registerInviteCodeEnable == '1') { + /// 需要填写注册码再跳首页 + _openInvitePage(context); + + return; + } else { + /// 不需要填写注册码,直接登录 + Provider.of(context, listen: false).setUserInfo(model); + _openHomePage(context); + return; + } + } + } + } catch (e, s) { + Logger.error(e, s); + } + Fluttertoast.showToast(msg: '登录失败'); + } + + // 预取号 + void _preVerify() { + Secverify.preVerify((Map ret, Map err) { + if (err != null) { + //失败情况下会返回错误信息,可以打印查看 +// showAlert(err.toString(),context); + Logger.log('mob 秒验登录失败: ${err?.toString()}, sdk 版本 = ${_version}'); + } else { + String rst = ret.toString(); + if (ret == null || ret.isEmpty) { + rst = 'mob 秒验 预登录成功!, sdk 版本 = ${_version}, ret = ${rst?.toString()}'; + Logger.log(rst); + } + // showAlert(rst,context); + } + }); + } + + // 预登录 + void _preSettings() { + //提交隐私协议结果 + Secverify.submitPrivacyGrantResult(true); + //是否自动关闭授权页面,如果不自动关闭,必须在取号回调中调用方法关闭授权页面 + Secverify.autoFinishOauthPage(false); + //是否输出运营商控制台日志 + Secverify.setDebugMode(false); + //设置超时时间 + Secverify.setTimeOut(5000); + //获取当前SDK版本号 + getVersion(); + } + + // 获取SDK版本 + Future getVersion() async { + String version; + version = await Secverify.getVersion; + _version = version; + return _version; + } + + // 是否支持登录 + Future isVerifySupport() async { + bool isVerifySupport = await Secverify.isVerifySupport; + this._isVerifySupport = isVerifySupport; + return this._isVerifySupport; + } + + // 取号接口 + void _verify(BuildContext context) { + Secverify.preVerify((ret, err) { + if (err != null) { + // showAlert(err.toString(),context); + Logger.log(err.toString()); + _openSMSLoginPage(context); + } else { + Secverify.verify((Map ret, Map err) { + if (err != null) { + //打印错误信息 + // showAlert(err.toString(), context); + Logger.log(err.toString()); + Fluttertoast.showToast(msg: '未知错误 err = ${err?.toString()}'); + } else { + String rst = ret.toString(); + if (ret == null || ret.isEmpty) { + rst = '登录失败'; + // showAlert(rst, context); + Logger.log(rst); + Fluttertoast.showToast(msg: '登录失败'); + } else if (ret.containsKey("otherLogin")) { + ///其他登录方式 + _openSMSLoginPage(context); + //调用此方法手动关闭授权页面 + Secverify.finshOauthPage(); + } else if (ret.containsKey("opToken")) { + //如果登录成功,将返回的信息提交给自己的服务器 + _doLogin(ret, context); + //调用此方法手动关闭授权页面 + Secverify.finshOauthPage(); + } else { + //调用此方法手动关闭授权页面 + Secverify.finshOauthPage(); + } + } + }); + } + }); + } + + // 设置授权页面属性 + void _setPortraitLayout(Quick model) { + if (Platform.isAndroid) { + // 以下是 Android 自定义设置 + // 导航栏设置 + var customNav = { + "navColor": "#FFFFFF", //导航栏背景颜色 + // "navText": "一键登录", //导航栏文本内容 + "navTextColor": "#ffffff", //导航栏文本颜色 + "navHidden": false, //导航栏是否隐藏 + "navTransparent": false, //导航栏是否透明 + "navCloseImgHidden": false, //导航栏返回图片是否隐藏 + "navTextSize": 16, //导航栏文本大小 + "navTextBold": false, //导航栏文本是否加粗 + "navCloseImgPath": "close.png", //导航栏返回图片地址 + "portraitLayout": { + "layoutWidth": 50, //导航栏图片宽度 + "layoutHeight": 50, //导航栏图片高度 + "layoutLeft": 10, //导航栏图片左间距 +// "layoutRight": 30,//导航栏图片右间距 +// "layoutTop": 10,//导航栏图片顶部间距 + } + }; + + // 授权页 + var customAuthPage = { +// "backgroundImg":"bg.png",//授权页面背景图片地址 + "backgroundClickClose": false, //授权页面点击关闭 + "fullScreen": false, //是否全屏 + "immersiveTheme": true, // 是否沉浸式透明状态栏 + "immersiveStatusTextColorBlack": true // 是否修改状态栏意思 + }; + + // 授权页Logo + var customAuthPageLogo = { + "logoImg": "app_icon.png", //logo地址 + "logoAlignParentRight": false, //logo是否靠页面右侧 + "logoHidden": false, // logo是否隐藏 + "portraitLayout": { + "layoutWidth": 80, //logo宽度 + "layoutHeight": 80, //logo高度 +// "layoutLeft": 30,//logo左间距 +// "layoutRight": 30,//logo右间距 + "layoutTop": 30, //logo顶部间距 +// "layoutBottom": 30,//logo底部间距 + } + }; + + // 手机号码 + var customPhoneNumber = { + "numberColor": model?.accountColor ?? "#333333", // 脱敏手机号颜色 + "numberSize": 22, //脱敏手机号大小 + "numberAlignParentRight": false, //脱敏手机号是否靠页面右侧 + "numberHidden": false, //脱敏手机号是否隐藏 + "numberBold": true, //脱敏手机号字体是否加粗 + "portraitLayout": { +// "layoutLeft": 30,//脱敏手机号左间距 +// "layoutRight": 30,//脱敏手机号右间距 +// "layoutTop": 130,//脱敏手机号顶部间距 +// "layoutBottom": 30,//脱敏手机号底部间距 + } + }; + + // 切换帐号按钮 + var customSwitchNumber = { + "switchAccColor": model?.textTipColor ?? '#FF3939', //切换登录文本颜色 + "switchAccTextSize": 13, //切换登录文字大小 + "switchAccHidden": false, //切换登录是否隐藏 + "switchAccAlignParentRight": false, //切换登录是否靠屏幕右侧 + "switchAccText": model?.textTip ?? '切换账号', //切换登录文本内容 + "switchAccTextBold": false, //切换登录文本是否加粗 + "portraitLayout": { +// "layoutLeft": 30,//切换登录左间距 +// "layoutRight": 30,//切换登录右间距 +// "layoutTop": 170,//切换登录顶部间距 +// "layoutBottom": 30,//切换登录底部间距 + } + }; + + // 登陆按钮设置 + var customLoginBtn = { + "loginBtnImgArr": [model?.btnSubmitBgColor ?? "#FF0000", model?.btnSubmitBgColor ?? "#FF0000", model?.btnSubmitBgColor ?? "#FF0000"], //登录按钮背景图片或者颜色 + "loginBtnText": model?.btnSubmitText ?? "立即登录", //登录按钮文本 + "loginBtnTextColor": model?.btnSubmitTextColor ?? "#FFFFFF", //登录按钮文字颜色 + "loginBtnTextSize": 15, //登录按钮文本大小 + "loginBtnAlignParentRight": false, //登录按钮是否靠屏幕右侧 + "loginBtnHidden": false, //登录按钮是否隐藏 + "loginBtnTextBold": false, //登录按钮文本是否加粗 + "portraitLayout": { + // "layoutWidth": 200,//登录按钮宽度 + // "layoutHeight": 30,//登录按钮高度 +// "layoutLeft": 30,//登录按钮左间距 +// "layoutRight": 30,//登录按钮右间距 +// "layoutTop": 200,//登录按钮顶部间距 +// "layoutBottom": 30,//登录按钮底部间距 + } + }; + + // 隐私条款设置(切记,不可隐藏) + var customPrivacy = { + "agreementColor": "${model?.protocol[1]?.textColor ?? '#FF3939'}", //运营商隐私条款颜色和自定义隐私条款文本颜色 + "agreementBaseTextColor": "${model?.protocol[0]?.textColor ?? '#C0C0C0'}", //隐私条款其他文字颜色 + "agreementTextSize": 11, //隐私条款文字大小 + "agreementTextStart": "${model?.protocol[0]?.text ?? '同意'} ", //隐私条款开头文本 + "agreementTextEnd": " ", //隐私条款结束文本 + "agreementAlignParentRight": false, //隐私条款是否靠屏幕右侧 + "agreementHidden": false, //隐私条款是否隐藏 + 'secPrivacyProtocolMarkArr': ['《', '》'], // 协议文本前后符号(例['<','>']) + "agreementCmccText": "《中国移动服务协议》", //隐私条款 移动运营商显示文本 + "agreementCuccText": "《中国联通服务协议》", //隐私条款 联通运营商显示文本 + "agreementCtccText": "《中国电信服务协议》", //隐私条款 电信运营商显示文本 + "agreementTextBold": false, //隐私条款文本是否加粗 + "agreementTextWithUnderLine": false, //隐私条款是否带下划线 + "cusAgreementFirstArray": ['${model?.protocol[1]?.text ?? '《用户协议》'}', '${model?.protocol[1]?.url}', ''], //隐私条款 自定义一 + "cusAgreementSecondArray": ['${model?.protocol[3]?.text ?? '《隐私政策》'}', '${model?.protocol[3]?.url}', '${model?.protocol[2]?.text ?? '及'}'], //隐私条款 自定义二 + "agreementUncheckHintText": "请阅读并勾选隐私协议", //隐私条款 未勾选时提示的文本 + "portraitLayout": { + "layoutLeft": 20, //隐私条款左间距 + "layoutRight": 20, //隐私条款右间距 + // "layoutTop": 250,//隐私条款顶部间距 +// "layoutBottom": 20,//隐私条款底部间距 + } + }; + + // 隐私条款复选框 + var customCheckBox = { + // "checkboxImg": ["checked.png", "uncheck.png"], // 隐私协议checkbox背景图片 + "checkboxDefaultState": true, // 隐私协议checkbox默认状态 + "checkboxHidden": false, //隐私协议checkbox是否隐藏 + "scale": 1.2, + "portraitLayout": { + // "layoutWidth": 50,//隐私协议checkbox 返回图标宽度 + // "layoutHeight": 50,//隐私协议checkbox 返回图标高度 +// "layoutLeft": 20,//隐私协议checkbox左间距 +// "layoutRight": 20,//隐私协议checkbox右间距 +// "layoutTop": 10,//隐私协议checkbox顶部间距 +// "layoutBottom": 20,//隐私协议checkbox底部间距 + } + }; + // 隐私条款具体协议内容页面设置 + var customPrivacyContentPage = { + "agreementPageTitle": "隐私协议页", //隐私协议页面 标题 + "cusAgreementPageOneTitle": "自定义隐私协议页一", //隐私协议页面 自定义隐私协议一标题 + "cusAgreementPageTwoTitle": "自定义隐私协议页二", //隐私协议页面 自定义隐私协议二标题 + "cusAgreementPageThreeTitle": "自定义隐私协议页三", //隐私协议页面 自定义隐私协议三标题 + "agreementPageCloseImg": "close.png", //隐私协议页面 返回图标名称 + "agreementPageTitleTextSize": 16, //隐私协议页面 标题文本大小 + "agreementPageTitleTextColor": "#330F33", //隐私协议页面 标题文本颜色 + "agreementPageTitleTextBold": true, //隐私协议页面 标题文本是否加粗 + "agreementPageTitleHidden": false, //隐私协议页面 标题文本是否隐藏 + "agreementPageCloseImgHidden": false, //隐私协议页面 返回图标是否隐藏 + "portraitLayout": { + "layoutWidth": 50, //隐私协议页面 返回图标宽度 + "layoutHeight": 50, //隐私协议页面 返回图标高度 + } + }; + + // 运营商品牌标签 + var customOperatorSlogan = { + "sloganTextSize": 20, // Slogan文本大小 + "sloganTextColor": "#330F33", // Slogan文本颜色 + "sloganHidden": false, // Slogan是否隐藏 + "sloganAlignParentRight": false, // Slogan是否靠屏幕右侧 + "sloganTextBold": true, // Slogan文本是否加粗 + "portraitLayout": { +// "layoutLeft": 30,//Slogan左间距 +// "layoutRight": 30,//Slogan右间距 +// "layoutTop": 30,//Slogan顶部间距 + "layoutBottom": 30, //Slogan底部间距 + } + }; + + // 弹窗设置 + var customDialog = { + "dialogTheme": false, //弹框 + "dialogAlignBottom": false, //弹框是否靠底部 +// "dialogBackground": "bg.png",//弹框蒙版背景图片名称 + "dialogBackgroundClickClose": false, //弹框蒙版背景是否点击关闭 + "portraitLayout": { + "layoutWidth": 250, //弹框宽度 + "layoutHeight": 400, //弹框高度 + "layoutLeft": 30, //弹框左间距 + "layoutTop": 30, //弹框顶部间距 + } + }; + + // 自定义控件设置,目前安卓只支持文本TextView和图片ImageView + var customView = { + "customView": [ + { + "viewClass": "TextView", //添加的控件类型 + "viewText": "测试文本1", // 控件文本 + "viewTextColor": "#330F33", // 控件文本颜色 + "viewTextFont": 20, // 控件文本大小 + "viewTextBold": true, // 控件文本是否加粗 + "viewAlignParentRight": false, // 控件是否靠屏幕右侧 + "viewHorizontalCenter": true, //控件是否靠屏幕中间 + "portraitLayout": { +// "layoutLeft": 30,//控件左间距 +// "layoutRight": 30,//控件右间距 +// "layoutTop": 30,//控件顶部间距 + "layoutBottom": 135, //控件底部间距 + } + }, + { + "viewClass": "TextView", //添加的控件类型 + "viewText": "测试文本2", // 控件文本 + "viewTextColor": "#330F33", // 控件文本颜色 + "viewTextFont": 16, // 控件文本大小 + "viewTextBold": false, // 控件文本是否加粗 + "viewAlignParentRight": false, //控件是否靠屏幕右侧 + "viewHorizontalCenter": true, //控件是否靠屏幕中间 + "portraitLayout": { +// "layoutLeft": 30,//控件左间距 +// "layoutRight": 30,//控件右间距 +// "layoutTop": 50,//控件顶部间距 + "layoutBottom": 115, //控件底部间距 + }, + }, + { + "viewClass": "ImageView", //添加的控件类型 + "viewImg": "logo.png", //图片的地址 + "viewAlignParentRight": false, //控件是否靠屏幕右侧 + "viewHorizontalCenter": true, //控件是否靠屏幕中间 + "portraitLayout": { + "layoutWidth": 30, //隐私协议页面 返回图标宽度 + "layoutHeight": 30, //隐私协议页面 返回图标高度 +// "layoutLeft": 30,//控件左间距 +// "layoutRight": 30,//控件右间距 +// "layoutTop": 50,//控件顶部间距 + "layoutBottom": 75, //控件底部间距 + }, + } + ] + }; + + var customParams = { + // 'customNav': customNav,//导航栏设置 + 'customAuthPage': customAuthPage, //授权页面设置 + // 'customAuthPageLogo': customAuthPageLogo,//logo设置 + 'customPhoneNumber': customPhoneNumber, //脱敏手机号设置 + 'customSwitchNumber': customSwitchNumber, //切换登录设置 + 'customCheckBox': customCheckBox, //复选框设置 + 'customPrivacy': customPrivacy, //隐私条款设置 + // 'customPrivacyContentPage': customPrivacyContentPage,//隐私协议页面设置 + 'customLoginBtn': customLoginBtn, //登录按钮设置 + // 'customOperatorSlogan': customOperatorSlogan,//slogan设置 + // 'customDialog': customDialog,//弹框设置 + // 'customView': customView,//自定义控件设置 + }; + Secverify.setPortraitLayout(customParams); + // Secverify.setLandscapeLayout(customParams); + } else if (Platform.isIOS) { + // 以下是 iOS 自定义设置 + // 自定义动画设置 + var customAnimation = { + 'secAnimateType': 1, //动画类型 0:默认 1:水平翻转 2:淡入淡出 3: Alert 4: Push 5:sheet + // 'secShowType': 0, //展示类型 0:默认 1:Alert 2:Push 3: Sheet + // 以下自定义动画设置只针对于Alert/Sheet展示类型 + 'secAnimateBgColor': '#F7B376', //弹窗控制器的背景色 + 'secLeftControlImage': 'leftImg.png', //左边按钮背景图片名称 + 'secLeftControlHidden': true, //左边按钮是否显示 + 'secRightControlImage': 'rightImg.png', //右边按钮背景图片名称 + 'secRightControlHidden': true, //右边按钮是否显示 + 'secBgViewHidden': false, //背景视图是否展示 + 'secBgViewCorner': 15, //背景视图的圆角 + 'secBgViewColor': '#000000', //背景视图颜色 + 'secBgViewImage': 'bgImg.png', //背景视图的背景图片名称 + 'secCloseType': true, //关闭按钮显示在左边还是右边 true:左边 false:右边 + }; + // 导航栏设置 + var customNav = { + 'secNavBarTintColor': '#FFFFFF', // 导航栏背景色(default is white) + // 'secNavText': '一键验证', // 导航栏标题 + // 'secNavReturnImg': 'close.png', // 导航栏返回按钮图标 + // 'secNavBottomLineHidden': true, // 是否隐藏导航栏尾部线条(默认显示,例: true) + // 'secNavBarHidden': false, // 导航栏隐藏(例: false) + // 'secNavStatusBarHidden': false, // 导航栏状态栏隐藏(例: false) + // 'secNavTranslucent': false, // 导航栏透明(例: false) + // 'secNavBackBtnHidden': false, // 导航栏返回按钮隐藏(例: false) + // 'secNavLeftControlHidden': false, // 隐藏导航栏左边按钮 + // 'secNavTintColor': '#FF0000', // 导航栏文字颜色 + // 'secNavBackgroundClear': false, // 导航栏背景透明(例: false) + }; + // 授权页 + var customAuthPage = { + // 'secBackgroundColor': '#E5E589', // 授权页背景颜色 + 'secBgImg': 'bg.png', // 授权背景图片 + 'secCancelBySingleClick': false, //单击页面实现取消操作(例: false) + }; + // 授权页Logo + var customAuthPageLogo = { + 'secLogoImg': 'AppIcon.png', // Logo图片名称 + 'secLogoHidden': false, // Logo是否隐藏(例: false) + // 'secLogoCornerRadius': 10, // Logos圆角(例: 10) + // 'secPortraitLayout': { + // // 针对该控件的竖屏布局(注意: 每个控件的布局字段所表示的含义都相同,下面将不再解释) + // 'secLayoutTop': 100, // 顶部间距 + // // 'secLayoutBottom': -40, // 底部间距 + // 'secLayoutLeft': 20, // 左边间距 + // // 'secLayoutRight': -20, // 右边间距 + // 'secLayoutWidth': 80, // 控件宽度 + // 'secLayoutHeight': 80, // 控件高度 + // 'secLayoutCenterX': 0, // 相对于父视图的CenterX的偏移量,0表示不偏移,即水平居中 + // 'secLayoutCenterY': 0, // 相对于父视图的CenterY的偏移量,0表示不偏移,即垂直居中 + // }, + }; + // 手机号码 + var customPhoneNumber = { + 'secNumberColor': model?.accountColor ?? '#333333', // 手机号码字体颜色 + 'secNumberFont': 25, // 字体大小(例: 18) + 'secNumberTextAlignment': 1, // 手机号对其方式(例: 0-Left, 1-Center, 2-Right) + // 'secNumberBgColor': '#C2F6A3', // 手机号码背景颜色 + 'secPhoneHidden': false, //手机号码是否隐藏 + // 'secPhoneBorderColor': '#FF0000', //手机号码边框颜色 + // 'secPhoneBorderWidth': 2, //手机号码边框宽度 + // 'secPhoneCorner': 5, //手机号码圆角 + 'secPortraitLayout': { + // 'secLayoutTop': 100 + 10, + // 'secLayoutLeft': 20 + 80 + 15, + // 'secLayoutRight': -20, + // 'secLayoutHeight': 22, // 控件高度 + } + }; + // 切换帐号按钮 + var customSwitchNumber = { + 'secSwitchBgColor': '#FFFFFF', // 切换账号背景颜色 + 'secSwitchColor': model?.textTipColor ?? '#FF3939', // 切换账号字体颜色 + 'secSwitchFont': 14, // 切换账号字体大小 + 'secSwitchTextHorizontalAlignment': 0, // 切换账号对其方式(例: 0-Center, 1-Left, 2-Right) + 'secSwitchHidden': false, // 隐藏切换账号按钮, 默认为false(例: true) + 'secSwitchText': model?.textTip ?? '切换账号', // 切换账号标题 + 'secPortraitLayout': { + // 'secLayoutTop': 100 + 80 - 30, + // 'secLayoutLeft': 20 + 80 + 15, + // 'secLayoutRight': -20, + // 'secLayoutHeight': 18, // 控件高度 + } + }; + // 登陆按钮设置 + var customLoginBtn = { + 'secLoginBtnText': model?.btnSubmitText ?? '立即登录', // 登录按钮文本 + 'secLoginBtnTextColor': model?.btnSubmitTextColor ?? '#FFFFFF', // 登录按钮文本颜色 + 'secLoginBtnBgColor': model?.btnSubmitBgColor ?? '#FF3939', // 登录按钮背景颜色 + 'secLoginBtnBorderWidth': 2.0, // 登录按钮边框宽度 (例: 2.0) + 'secLoginBtnBorderColor': '#FF0000', // 登录按钮边框颜色 + 'secLoginBtnCornerRadius': 5.5, // 登录按钮圆角(例: 5.0) + 'secLoginBtnTextFont': 15, // 登录按钮文字字体大小 + 'secLoginBtnBgImgArr': [ + model?.btnSubmitBgColor ?? '#FF3939', + model?.btnSubmitBgColor ?? '#FF3939', + model?.btnSubmitBgColor ?? '#FF3939' + ], //['enabled.png', 'disabled.png', 'highlighted.png'], // 登录按钮背景图片数组(例:['激活状态图片','失效状态图片','高亮状态图片'], 支持颜色数组: ['#FF0000', '#00FF00', '0000FF']) + 'secLoginBtnHidden': false, // 登陆按钮是否隐藏, 不建议隐藏!!! + 'secPortraitLayout': { + // 'secLayoutCenterY': 0, + // 'secLayoutLeft': 20, + // 'secLayoutRight': -20, + // 'secLayoutHeight': 30, // 控件高度 + } + }; + // 隐私条款设置(切记,不可隐藏) + var customPrivacy = { + 'secPrivacyTextColor': model?.protocol[0]?.textColor ?? '#C0C0C0', // 隐私条款基本文字颜色 + 'secPrivacyTextFont': 11, // 隐私条款协议文字字体大小 + 'secPrivacyTextAlignment': 0, // 隐私条款对其方式(例: 0-Left, 1-Center, 2-Right) + 'secPrivacyAgreementColor': model?.protocol[1]?.textColor ?? '#FF3939', // 隐私条款协议文字颜色 + // 'secPrivacyAgreementBgColor': '#000000', // 隐私条款协议背景颜色 + // 'secPrivacyAppName': '秒验Flutter', // 隐私条款应用名称 + 'secPrivacyProtocolMarkArr': ['', ''], // 协议文本前后符号(例['<','>']) + 'secPrivacyFirstTextArr': [model?.protocol[1]?.text ?? '用户协议', model?.protocol[1]?.url ?? '', model?.protocol[2]?.text ?? ' '], // 开发者隐私条款第一组协议(例:['名字','url','分割符']) + 'secPrivacySecondTextArr': [model?.protocol[3]?.text ?? '隐私政策', model?.protocol[3]?.url ?? '', '及'], // 开发者隐私条款第二组协议(例:['名字','url','分割符']) + 'secPrivacyLineSpacing': 5.0, // 隐私条款多行时行距(例: 5.0) + // 'secPrivacyDefaultText': '开发者隐私条款', //开发者隐私条款协议默认名称(不建议修改) + 'secPrivacyUnderlineStyle': 0, //隐私协议下划线样式(例: 0-None, 1-Single, 2-Thick, 9-Double) + 'secPrivacyNormalTextFirst': model?.protocol[0]?.text ?? '同意', // 隐私条款开头(例: '登录即同意') + 'secPrivacyNormalTextEnd': ' ', // 隐私条款中间连接文字(例: '并授权') + 'secPrivacyHidden': false, // 隐私条款是否隐藏, 强烈建议不要隐藏!!! + 'isPrivacyOperatorsLast': false, // 运营商协议是否排在最后 默认为false(例: true) + 'secPortraitLayout': { + // 'secLayoutLeft': 50, + // 'secLayoutCenterY': 80, + // 'secLayoutRight': -20, + // 'secLayoutHeight': 70, // 控件高度 + } + }; + // 隐私条款复选框 + var customCheckBox = { + 'secCheckedImg': 'checked.png', // 复选框选中时的图片 + 'secUncheckedImg': 'uncheck.png', // 复选框未选中时的图片 + 'secCheckDefaultState': false, // 隐私条款check框默认状态,默认为false(例: true) + // secCheckSize: 30, // 复选框尺寸(宽高相同,例: 30) + 'secCheckHidden': false, // 隐私条款check框是否隐藏,默认为false(例: true) + 'secPortraitLayout': { + // !!!! 注意: 这个复选框的布局是相对于隐私条款的,所以建议先把隐私条款布局好再布局这个框 + 'secLayoutRight': -10, + 'secLayoutCenterY': -20, + 'secLayoutWidth': 20, + 'secLayoutHeight': 20, + } + }; + // 隐私条款具体协议内容页面设置 + var customPrivacyContentPage = { + 'secPrivacyWebBackBtnImage': 'close.png', // 隐私条款WEB页面返回按钮图片 + 'secPrivacyWebTitle': '隐私条款内容', // 隐私条款WEB页面标题 + 'secPrivacyWebNavBarStyle': 0, // 隐私条款导航style (例: 0-Default, 1-Black) + }; + // 运营商品牌标签 + var customOperatorSlogan = { + 'secSloganTextFont': 13, //运营商品牌文字字体大小 + 'secSloganTextColor': '#0099FF', //运营商品牌文字颜色 + 'secSloganTextAlignment': 1, //运营商品牌文字对齐方式(例: 0-Left, 1-Center, 2-Right) + 'secSloganBgColor': '#666666', //运营商品牌背景颜色 + // 'secSloganText': '运营商品牌文字', //运营商品牌文字(不建议修改) + 'secSloganHidden': false, //运营商品牌是否隐藏 + 'secSloganBorderColor': '#FFEEDD', //运营商品牌边框颜色 + 'secSloganBorderWidth': 2.0, //运营商品牌边框宽度 + 'secSloganCorner': 5.0, //运营商品牌边框圆角 + 'secPortraitLayout': { + 'secLayoutLeft': 20, + 'secLayoutRight': -20, + 'secLayoutBottom': -64, + 'secLayoutHeight': 18, // 控件高度 + }, + }; + var customParams = { + // 'customAnimation': customAnimation, // 自定义动画设置 + 'customNav': customNav, // 导航栏设置 + // 'customAuthPage': customAuthPage, // 授权页 + 'customAuthPageLogo': customAuthPageLogo, // 授权页Logo + 'customPhoneNumber': customPhoneNumber, // 手机号码 + 'customSwitchNumber': customSwitchNumber, // 切换帐号按钮 + // 'customCheckBox': customCheckBox, // 隐私条款复选框 + 'customPrivacy': customPrivacy, // 隐私条款设置(切记,不可隐藏) + // 'customPrivacyContentPage': customPrivacyContentPage, // 隐私条款具体协议内容页面设置 + 'customLoginBtn': customLoginBtn, // 登陆按钮设置 + // 'customOperatorSlogan': customOperatorSlogan, // 运营商品牌标签 + }; + Secverify.setPortraitLayout(customParams); + // Secverify.setLandscapeLayout(customParams); + } + } +} diff --git a/lib/util/second_test/second_test_util.dart b/lib/util/second_test/second_test_util.dart deleted file mode 100644 index d508ebe..0000000 --- a/lib/util/second_test/second_test_util.dart +++ /dev/null @@ -1,81 +0,0 @@ -import 'package:secverify/secverify.dart'; -import 'package:zhiying_comm/util/log/let_log.dart'; - -class SecondTestUtil { - // sdk 版本 - String _version = "unkown"; - - // 是否支持 - bool _isVerifySupport = true; - - /// 单例对象 - static SecondTestUtil _instance; - - /// 内部构造方法,可避免外部暴露构造函数,进行实例化 - SecondTestUtil._internal(); - - /// 工厂构造方法,这里使用命名构造函数方式进行声明 - factory SecondTestUtil.getInstance() => _getInstance(); - - /// 获取单例内部方法 - static _getInstance() { - // 只能有一个实例 - if (_instance == null) { - _instance = SecondTestUtil._internal(); - } - return _instance; - } - - void init() { - //可选预先设置 - preSettings(); - //判断手机本地环境是否支持 - isVerifySupport(); - if (_isVerifySupport) { - //预取号 - preVerify(); - } - } - - void preVerify() { - Secverify.preVerify((Map ret, Map err) { - if (err != null) { - //失败情况下会返回错误信息,可以打印查看 -// showAlert(err.toString(),context); - Logger.log('mob 秒验登录失败: ${err?.toString()}, sdk 版本 = ${_version}'); - } else { - String rst = ret.toString(); - if (ret == null || ret.isEmpty) { - rst = 'mob 秒验 预登录成功!, sdk 版本 = ${_version}'; - Logger.log(rst); - } -// showAlert(rst,context); - } - }); - } - -// 预登录 - void preSettings() { - //提交隐私协议结果 - Secverify.submitPrivacyGrantResult(true); - //是否自动关闭授权页面,如果不自动关闭,必须在取号回调中调用方法关闭授权页面 - Secverify.autoFinishOauthPage(false); - //是否输出运营商控制台日志 - Secverify.setDebugMode(false); - //设置超时时间 - Secverify.setTimeOut(5000); - //获取当前SDK版本号 - getVersion(); - } - - Future getVersion() async { - String version; - version = await Secverify.getVersion; - _version = version; - } - - Future isVerifySupport() async { - bool isVerifySupport = await Secverify.isVerifySupport; - this._isVerifySupport = isVerifySupport; - } -}