import { StorageKey } from "./StorageData"; /** * @description 登录数据 * @author 邹勇 */ export class LoginData { public loadResCompelete: boolean = false; /** 是否登录 */ public isLogin: boolean = false; public sessionKey: string = ''; public randomKey: string = "abcdefghijklopqrstuvwxyzabcdefgh"; /** 玩家唯一id */ public uin: string = ''; /** 玩家临时id */ public tempUin: string = ''; public loginTicket: string = ''; public isFirstIn: boolean = false; public isNew: boolean; /** 是否授权 */ public isAuth: boolean; /** 服务协议 */ public rule_data: string[]; /** 隐私协议 */ public privacy_data: string[]; /** 身份认证开关 */ public popIdentifySwitch = false; /** 身份认证通过 */ public passAnti = false; public passPrivacy = false; /** * 初始化本地配置 * @returns */ public async loadLocalRes() { let result = await mk.loader.load("data/rule_data", cc.JsonAsset); if (result && result.json) { this.rule_data = result.json.server; this.privacy_data = result.json.privacy; this.loadResCompelete = true; } } /** * 初始化 */ public init() { let uin = mk.storage.getStorage(StorageKey.uin); this.uin = uin ? uin : ""; let sessionKey = mk.storage.getStorage(StorageKey.sessionKey); this.sessionKey = sessionKey ? sessionKey : ""; let loginTicket = mk.storage.getStorage(StorageKey.loginTicket); this.loginTicket = loginTicket ? loginTicket : ""; console.log(`===[LoginData] uin =${uin} sessionKey = ${sessionKey}"`); } /** * 登录流程 * @description initApp-->initAd-->connect-->wxLogin-->checkLogin-->getAccountInfo */ public async login() { mk.console.logSingle("login...", this.sessionKey + "..." + this.uin); //有登录记录直接跳转到登录流程最后一步 if (this.sessionKey != '' && this.uin != '' && this.loginTicket != '') { console.log("=== login 有登录记录直接跳转到登录流程最后一步"); // this.getAccountInfo(); this.checkLogin(); } else { console.log("=== login 无登录记录"); this.connect(); } } /** * 链接 * @description 获取临时的uin */ private async connect() { if (CC_DEBUG) { gData.appData.mac = '13:02:e5:13:b3:55,f3:65:e2:1a:b7:27'; } //connect this.randomKey = mk.encrypt.randomString(); let data: any = { "mac": gData.appData.mac, "psk": this.randomKey, "appId": gData.appData.appId } mk.console.logSingle('mac ', gData.appData.mac); let response = await mk.http.sendRequest('connectTest', 'POST', JSON.stringify(data)); if (response.errcode != 0) { return; } data = mk.encrypt.decrypt(response.encrypt, this.randomKey, gData.appData.appId); mk.console.logSingle("[FC]connectTest decryptData", data); this.tempUin = JSON.parse(data).tmp_uin; mk.storage.setStorage(StorageKey.uin, this.tempUin); this.wxLogin(); } public async wxLogin() { //wxLogin let clientType = 3 if (cc.sys.os == cc.sys.OS_ANDROID) { clientType = 1 } else if (cc.sys.os == cc.sys.OS_IOS) { clientType = 2 } let aa = { "code": gData.wechatData.code, "clientType": clientType, "deviceToken": mk.aliRiskManager.deviceToken, "appVersion": gData.appData.appVersion, "tfChannel": gData.appData.tfChannel, "android_id": gData.appData.machineInfo.android_id, "versioncfg": gData.appData.version, "idfa": gData.appData.machineInfo.idfa, "imei": gData.appData.machineInfo.imei, "mac": gData.appData.machineInfo.mac, "oaid": gData.appData.machineInfo.oaid, "szlm_did": mk.shuzilmM.szlm_did, "black_box": mk.tongdunM.tdEquipID } // mk.console.logSingle('wxlogin aa >> ', aa); // console.log('wxLogin code ', aa.code) // console.log('wxLogin clientType ', aa.clientType) // console.log('wxLogin deviceToken ', aa.deviceToken) // console.log('wxLogin appVersion ', aa.appVersion) // console.log('wxLogin tfChannel ', aa.tfChannel) // console.log('wxLogin android_id ', aa.android_id) // console.log('wxLogin versioncfg ', aa.versioncfg) // console.log('wxLogin idfa ', aa.idfa) // console.log('wxLogin imei ', aa.imei) // console.log('wxLogin mac ', aa.mac) // console.log('wxLogin oaid ', aa.oaid) let data; let encode; if (gData.wechatData.code != null) { //微信登录 encode = mk.encrypt.encrypt(JSON.stringify(aa), this.sessionKey, gData.appData.appId); data = { "uin": this.uin, "encrypt": encode }; } else { //游客登录 encode = mk.encrypt.encrypt(JSON.stringify(aa), this.randomKey, gData.appData.appId); data = { "uin": this.tempUin, "encrypt": encode }; } let response = await mk.http.sendRequest('wxlogin', 'POST', JSON.stringify(data), false, false); if (response.errcode != 0) { if (response.errcode == 41003) { mk.storage.setStorage("alifengkong", 1); console.log('ali block') } else if (response.errcode == -10003 || response.errcode == -20003) { //清除缓存 console.log('restart errcode ', response.errcode) this.reload(); } return; } if (gData.wechatData.code != null) { data = mk.encrypt.decrypt(response.encrypt, this.sessionKey, gData.appData.appId); } else { data = mk.encrypt.decrypt(response.encrypt, this.randomKey, gData.appData.appId); } data = JSON.parse(data); this.loginTicket = data.login_ticket; mk.console.logSingle("[FC]wxLogin decrypt", data); mk.storage.setStorage(StorageKey.loginTicket, this.loginTicket); let isFirstIn = mk.storage.getStorage(StorageKey.isFirstIn); if (isFirstIn == null) { mk.storage.setStorage(StorageKey.isFirstIn, 1); this.isFirstIn = true; } if (this.uin != data.uin) { this.uin = data.uin; this.isNew = false; } else { this.isNew = true; } mk.storage.setStorage(StorageKey.uin, this.uin); this.checkLogin(); } /** * 检测登录 * @returns */ private async checkLogin() { //checkLogin let tmp_key = ''; if (gData.wechatData.code != null) { tmp_key = this.sessionKey; } else { tmp_key = mk.encrypt.randomString(); } let data = { "tmp_key": tmp_key, "uin": this.uin, "login_ticket": this.loginTicket, "appId": gData.appData.appId } let response = await mk.http.sendRequest('checklogin', 'POST', JSON.stringify(data)); if (response.errcode != 0) { if (response.errcode == 403) { gData.warnTipData.setSolution(4); } return; } let decryptData; if (gData.wechatData.code != null) { decryptData = mk.encrypt.decrypt(response.encrypt, this.sessionKey, gData.appData.appId); } else { decryptData = mk.encrypt.decrypt(response.encrypt, tmp_key, gData.appData.appId); } let parseData = JSON.parse(decryptData); this.sessionKey = parseData.session_key; mk.console.logSingle("[FC]checkLogin decrypt", parseData); mk.storage.setStorage(StorageKey.sessionKey, this.sessionKey); this.getUserInfo(); } private async getUserInfo() { this.getAccountInfo(); } private async getAccountInfo() { console.log('uin ', gData.loginData.uin) //更新设备信息 mk.console.logSingle("machineInfo", gData.appData.machineInfo); await mk.http.sendData('user/machine', gData.appData.machineInfo); //上传appVersion let data1 = { 'version': gData.appData.appVersion }; mk.http.sendData('updateVersion', data1); //获取user let aa = { "uin": this.uin, "appVersion": gData.appData.appVersion, "mac": gData.appData.machineInfo.mac, "login_ticket": this.loginTicket, "tfChannel": gData.appData.tfChannel, "szlm_did": mk.shuzilmM.szlm_did, "black_box": mk.tongdunM.tdEquipID, }; let data = { "uin": this.uin, "encrypt": mk.encrypt.encrypt(JSON.stringify(aa), this.sessionKey, gData.appData.appId) }; let response = await mk.http.sendRequest('user', 'POST', JSON.stringify(data), false, false); if (response.errcode != 0) { if (response.errcode == -10003 || response.errcode == -20003) { //清除缓存 console.log('AA restart errcode ', response.errcode) this.reload(); } return; } response = mk.http.checkData(response, true); let resData = response.data; mk.console.logSingle("[FC] getAccountInfo decrypt", data); this.isAuth = resData.is_auth; gData.wechatData.unionid = this.uin; if (this.isAuth) { gData.wechatData.nickName = resData.nickname; gData.wechatData.avatar = resData.headimgurl; gData.gameData.init_head = true; mk.storage.setStorage(StorageKey.isAuth, 1); mk.storage.setStorage(StorageKey.nickname, gData.wechatData.nickName, false); mk.storage.setStorage(StorageKey.avatar, gData.wechatData.avatar, false); } //获取游戏数据 gData.gameData.init(); } /** * 本地数据不是本账户的 清空数据 重新登录游戏 */ public reload() { setTimeout(() => { this.sessionKey = ''; this.uin = ''; this.loginTicket = ''; this.isAuth = false; this.tempUin = ''; this.randomKey = ''; gData.wechatData.nickName = ''; gData.wechatData.avatar = ''; cc.sys.localStorage.removeItem(StorageKey.sessionKey); cc.sys.localStorage.removeItem(StorageKey.uin); cc.sys.localStorage.removeItem(StorageKey.loginTicket); cc.sys.localStorage.removeItem(StorageKey.isAuth); cc.sys.localStorage.removeItem(StorageKey.nickname); cc.sys.localStorage.removeItem(StorageKey.avatar); cc.audioEngine.stopAll(); //调用Android的更好 cc.game.restart(); }) } }