gameConfig = new GameConfig(); $this->channelConfig = new ChannelConfig(); } /** * 登录sdk并返回一个token * @param array $params * @return array[] */ public function createToken(array $params): array { $sdkManager = new SdkManager(); //获取游戏表配置 $gameInfo = DB::table("app_games_config") ->where(['app_id' => $params['app_id']])->first(); if (is_null($gameInfo)) { return error('该游戏配置不存在,app_id:' . $params['app_id']); } // 获取渠道表配置 $verInfo = DB::table("app_ver_game as avg") ->leftJoin('app_ver as av', 'avg.ver', '=', 'av.ver_class') ->where(['app_id' => $params['app_id'], 'ver_code' => $params['ctype']])->first(); if (is_null($verInfo)) { return error('该游戏渠道没配置,app_id:' . $params['app_id']); } //登录成功则返回userinfo $loginInfo = $sdkManager->login($verInfo, $gameInfo, $params); if (!$loginInfo) { return error('渠道登录失败!'); } // 判断用户是否存在,appid为CP的appid $userInfo = DB::table('app_member')->where(['app_id' => $params['app_id'], 'uname' => $loginInfo['uname']])->first(); $curr_time = date('Y-m-d H:i:s'); if (is_null($userInfo)) { //保存聚合用户的信息并返回token DB::table('app_member')->insert([ 'uname' => $loginInfo['uname'], 'veruniqid' => $loginInfo['ver_user_id'], 'app_id' => $params['app_id'], 'ver' => $params['ctype'] ?? '', 'reg_ip' => CommonFunc::getTrustedProxiesIp(), 'reg_time' => $curr_time, 'login_time' => $curr_time, 'login_ip' => CommonFunc::getTrustedProxiesIp(), 'add_time' => $curr_time ]); } else { // 更新登录信息 DB::table('app_member')->where(['uname' => $loginInfo['uname'], 'app_id' => $gameInfo->app_id])->update([ 'login_time' => $curr_time, 'login_ip' => CommonFunc::getTrustedProxiesIp() ]); } // 获取用户注册渠道,时间 $userInfo = DB::table('app_member')->where(['app_id' => $params['app_id'], 'uname' => $loginInfo['uname']])->first(); // 保存登录日志 DB::table('app_memberloginlog')->insert([ 'uid' => $userInfo->uid, 'uname' => $loginInfo['uname'], 'reg_ver' => $userInfo->ver, 'reg_time' => $userInfo->reg_time, 'appid' => $params['app_id'], 'login_ver' => $params['ctype'] ?? '', 'login_time' => $curr_time, 'login_ip' => CommonFunc::getTrustedProxiesIp() ]); // 产生一个token ,存redis ,有效期5分钟 $uid = $uid ?? $userInfo->uid; $value = $uid . '|' . $gameInfo->app_id . '|' . $gameInfo->appkey . '|' . time(); $key = md5($value); Redis::setex($key, 60 * 60, $value); return success("第三方登录成功!", ['token' => $key, 'uid' => $uid]); } /** * 根据token获取用户信息 * @param array $params * @return array */ public function getTokenInfo(array $params): array { $tokenInfo = Redis::get($params['token']); if (!$tokenInfo) { return error('token已过期,请重新获取!'); } list($uid, $app_id, $appkey, $login_time) = explode('|', $tokenInfo); // 签名 MD5(appid=appid&token=token&uid=uid&appkey=appkey) $mysign = md5('appid=' . $app_id . '&token=' . $params['token'] . '&uid=' . $uid . '&appkey=' . $appkey); if ($mysign !== $params['sign']) { return error("签名失败!"); } // 查找用户信息,判断是否正常 $userInfo = DB::table('app_member')->where(['uid' => $uid, 'app_id' => $app_id])->first(); if (is_null($userInfo)) { return error('用户信息异常!'); } return success('success', ['uid' => $uid]); } }