game_code=$game_code; if($game_code=='sg'){ $this->secret = Yii::$app->params['sg_secret']; $this->appid = Yii::$app->params['sg_app_id']; }elseif ($game_code=='ce'){ $this->secret = Yii::$app->params['ce_secret']; $this->appid = Yii::$app->params['ce_app_id']; }elseif ($game_code=='cp'){ $this->secret = Yii::$app->params['cp_secret']; $this->appid = Yii::$app->params['cp_app_id']; } } /** * Function Description:新增或更新用户信息 * Function Name: getUserInfo * @param $encrypted_date * @param $iv * @param $token * * @return array * * @author 娄梦宁 */ public function getUserInfo($encrypted_date,$iv,$token) { $sg_user=new SgUser(); #1:参数校验 if($encrypted_date=='' || $iv=='' || $token=='') { return Util::returnArrEr('参数错误'); } #2:用户信息解密 $open_id=Util::authCode($token,'DECODE'); $session_id=Yii::$app->cache->get($open_id.'_session_key'); if(!$session_id){ return Util::returnArrEr('session_id获取失败!'); } $user_info=self::decryptDate($encrypted_date,$iv,$session_id); if($user_info===false) { return Util::returnArrEr('签名解密失败!'); } #3:插入用户数据 $sg_user_model=$sg_user::findOne(['open_id'=>$open_id]); $value=[ 'create_time'=>date('Y-m-d H:i:s'), 'nick_name'=>$user_info['nickName'], 'avatar_url'=>$user_info['avatarUrl'], 'city'=>$user_info['city'], 'province'=>$user_info['province'], 'country'=>$user_info['country'], 'gender'=>$user_info['gender'], 'game_code'=>$this->game_code, ]; if(!$sg_user_model) { #用户不存在,新增数据 $value['open_id']=$open_id; $sg_user_clone=clone $sg_user; $sg_user_clone->attributes=$value; $sg_user_clone->insert(); }else{ #用户已存在,更新用户信息 $sg_user_model->attributes=$value; $sg_user_model->update(); } # 4:memcache记录登录信息 Yii::$app->cache->set($user_info['openId'].'_token',$token,1296000); return Util::returnArrSu('',['token'=>$token]); } private function decryptDate($encryptedData,$iv,$session_id) { if (strlen($session_id) != 24) { return false; } $aesKey=base64_decode($session_id); if (strlen($iv) != 24) { return false; } $aesIV=base64_decode($iv); $aesCipher=base64_decode($encryptedData); $result=openssl_decrypt( $aesCipher, "AES-128-CBC", $aesKey, 1, $aesIV); return json_decode($result,true); } /** * Function Description:小游戏登录处理 * Function Name: wxLogin * @param $code * * @return array * * @author 娄梦宁 */ public function wxLogin($code) { if($code=='') { return Util::returnArrEr('参数错误!'); } $sg_user=new SgUser(); #1:与微信交互获取open_id和session_key $url='https://api.weixin.qq.com/sns/jscode2session?appid='.$this->appid.'&secret='.$this->secret.'&js_code='.$code.'&grant_type=authorization_code'; $curl=new CurlInterface(); $result=$curl->execute($url); if(!isset($result['openid']) || !isset($result['session_key'])){ return Util::returnArrEr('获取微信信息失败!'); } $token_encode=Util::authCode($result['openid'],'ENCODE'); #2:判断是否为新用户 $user_info=$sg_user::find()->where(['=','open_id',$result['openid']])->asArray()->one(); if(empty($user_info)) { Yii::$app->cache->set($result['openid'].'_session_key',$result['session_key'],600); Yii::$app->cache->set($result['openid'].'_open_id',$result['openid'],600); return Util::returnArrEr('用户第一次登陆!',['token'=>$token_encode],'','1002'); } #3:旧用户则更新登录状态 $token=Yii::$app->cache->get($result['openid'].'_token'); if(!$token) { return Util::returnArrEr('用户需要重新登录!',['token'=>$token_encode],'','1002'); } return Util::returnArrSu('用户登录状态已更新!',['token'=>$token_encode],'','0000'); } /** * Function Description:插入游戏记录 * Function Name: playLog * @param $token * @param $score * * @return array * * @author 娄梦宁 */ public function playLog($token,$score) { if($token=='' || $score==='') { return Util::returnArrEr('参数错误!'); } $sg_user=new SgUser(); if($this->game_code=='sg'){ $play_model=clone new SgPlayLog(); }elseif ($this->game_code=='ce'){ $play_model=clone new CePlayLog(); }elseif ($this->game_code=='cp'){ $play_model=clone new CpPlayLog(); } $open_id=Util::authCode($token,'DECODE'); if(!$open_id){ return Util::returnArrEr('用户未授权'); } $nick_name=$sg_user::find()->select('nick_name')->where(['=','open_id',$open_id])->asArray()->one(); if(empty($nick_name)){ return Util::returnArrEr('用户未授权!'); } $value=[ 'create_time'=>date('Y-m-d H:i:s'), 'score'=>$score, 'nick_name'=>$nick_name['nick_name'], 'open_id'=>$open_id, ]; $play_model->attributes=$value; $play_model->insert(); return Util::returnArrSu('数据插入成功!'); } /** * Function Description:获取游戏最高分(疯狂消一消 疯狂排一排) * Function Name: getHigeScore * @param $token * * @return array * * @author 娄梦宁 */ public function getHighScore($token){ if($token=='') { return Util::returnArrEr('参数错误!'); } if($this->game_code=='ce'){ $play_model=new CePlayLog(); }else{ $play_model=new CpPlayLog(); } $open_id=Util::authCode($token,'DECODE'); $high_score=$play_model->getHighByOpenId($open_id); $high_score=!$high_score['score'] ? 0:$high_score['score']; return Util::returnArrSu('最高分获取成功!',['high_score'=>$high_score]); } /** * Function Description:获取个人历史排行榜 * Function Name: getSelfRankList * @param $token * * @return array * * @author 娄梦宁 */ public function getSelfRankList($token) { if($this->game_code=='sg'){ $play_model=clone new SgPlayLog(); $play_table_name='sg_play_log b'; }elseif ($this->game_code=='ce'){ $play_model=clone new CePlayLog(); $play_table_name='ce_play_log b'; }elseif ($this->game_code=='cp'){ $play_model=clone new CpPlayLog(); $play_table_name='cp_play_log b'; } $sg_user=new SgUser(); $open_id=Util::authCode($token,'DECODE'); if(!$open_id){ return Util::returnArrEr('用户未授权'); } $nick_name=$sg_user::find()->select('a.nick_name')->from($sg_user::tableName().' a')->innerJoin($play_table_name,'a.open_id=b.open_id')->where(['=','a.open_id',$open_id])->asArray()->one(); $result_rank_list=[]; if(!empty($nick_name)) { $self_rank_list=$play_model->getSelfRankList($open_id); foreach($self_rank_list as $key=>$val) { $result_rank_list[$key+1]=[ 'rank'=>$key+1, 'score'=>$this->game_code=='sg' ? self::addZero($val['score']) :$val['score'], 'nick_name'=>$val['nick_name'], 'create_time'=>self::ChangeTime($val['create_time']), 'avatar_url'=>'', ]; } return Util::returnArrSu('',['self_rank_list'=>array_values($result_rank_list)]); } return Util::returnArrEr('用户尚未开始游戏!暂无数据!'); } /** * Function Description:获取排行榜数据 * Function Name: getRankList * @param $token * * @return array * * @author 娄梦宁 */ public function getRankList($token) { if($this->game_code=='sg'){ $play_model=clone new SgPlayLog(); $play_table_name='sg_play_log b'; }elseif ($this->game_code=='ce'){ $play_model=clone new CePlayLog(); $play_table_name='ce_play_log b'; }elseif($this->game_code=='cp'){ $play_model=clone new CpPlayLog(); $play_table_name='cp_play_log b'; } $sg_user=new SgUser(); $Monday=date('Y-m-d 00:00:00', (time() - ((date('w') == 0 ? 7 : date('w')) - 1) * 24 * 3600)); $result=$play_model->getRankList($Monday); $open_id=Util::authCode($token,'DECODE'); $nick_name=$sg_user::find()->select('a.nick_name,a.avatar_url')->from($sg_user::tableName().' a')->innerJoin($play_table_name,'a.open_id=b.open_id')->where(['=','a.open_id',$open_id])->asArray()->one(); $result_rank_list=[]; if(!empty($nick_name)) { #登录状态 $self_rank=51; $self_info=[ 'nick_name'=>$nick_name['nick_name'], 'score'=>$this->game_code=='sg' ? '12:00' : 0, 'avatar_url'=>$nick_name['avatar_url'], ]; foreach ($result as $k=>$v) { if($open_id==$v['open_id']) { $self_rank=$k+1; $self_info=$v; } }; $rank_list=array_slice($result,0,50); foreach($rank_list as $key=>$val) { $result_rank_list[$key+1]=[ 'rank'=>$key+1, 'score'=>$this->game_code=='sg' ? self::addZero($val['score']) :$val['score'], 'nick_name'=>$val['nick_name'], 'avatar_url'=>$val['avatar_url'], ]; } sort($result_rank_list); $self_rank=[ 'rank'=>$self_rank, 'score'=>$this->game_code=='sg' ? self::addZero($self_info['score']) :$self_info['score'], 'nick_name'=>$self_info['nick_name'], 'avatar_url'=>$self_info['avatar_url'], ]; return Util::returnArrSu('排行榜信息获取成功!',['rank_list'=>array_values($result_rank_list),'self_rank'=>$self_rank]); } $result_list=array_slice($result,0,50); foreach ($result_list as $key=>$val) { $result_rank_list[$key+1]=[ 'rank'=>$key+1, 'score'=>$this->game_code=='sg' ? self::addZero($val['score']) :$val['score'], 'nick_name'=>$val['nick_name'], 'avatar_url'=>$val['avatar_url'], ]; } return Util::returnArrSu('排行榜信息获取成功!',['rank_list'=>array_values($result_rank_list),'self_rank'=>[]]); } /** * Function Description:格式化时间成绩 * Function Name: addZero * @param $num * * @return int|string * * @author 娄梦宁 */ private function addZero($num) { $str=strval($num); $len=strlen($str); if($len==5) { return $str; } $point_position=stripos($str,'.'); if($point_position===false){ if($len==1){ return '0'.$str.'.00'; }else{ return $str.'.00'; } }elseif($point_position==1){ if($len==4){ return '0'.$str; }else{ return '0'.$str.'0'; } }elseif($point_position==2){ return $str.'0'; } return $str; } /** * Function Description:处理个人排行榜中的时间字符串 * Function Name: ChangeTime * @param $create_time * * @return false|string * * @author 娄梦宁 */ private function ChangeTime($create_time) { $diff_time=time()-strtotime($create_time); $today_seconds=time()-strtotime(date('Ymd')); if($diff_time<60) { #一分钟内 return '刚刚'; }elseif($diff_time<3600) { #一小时内 $minute=floor($diff_time/60); return $minute.'分钟前'; }elseif($diff_time<$today_seconds) { #一天内 $hours=floor($diff_time/3600); return $hours.'小时前'; }else { $year=date('y',strtotime($create_time)); $now_year=date('y'); #今年 if($year==$now_year) { return date('n月j日',strtotime($create_time)); }else{ #前几年 return date('y年n月j日',strtotime($create_time)); } } } }