|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425 |
- <?php
-
- namespace zzcx\service\game;
-
- use common\models\CePlayLog;
- use common\models\CpPlayLog;
- use common\models\SgPlayLog;
- use common\models\SgUser;
- use common\util\CurlInterface;
- use Yii;
- use common\util\Util;
-
- class Game
- {
- private $appid;
- private $secret;
- private $game_code;
- public function __construct($game_code='sg')
- {
- $this->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));
- }
- }
- }
- }
|