Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.
 
 
 
 
 
 

425 Zeilen
14 KiB

  1. <?php
  2. namespace zzcx\service\game;
  3. use common\models\CePlayLog;
  4. use common\models\CpPlayLog;
  5. use common\models\SgPlayLog;
  6. use common\models\SgUser;
  7. use common\util\CurlInterface;
  8. use Yii;
  9. use common\util\Util;
  10. class Game
  11. {
  12. private $appid;
  13. private $secret;
  14. private $game_code;
  15. public function __construct($game_code='sg')
  16. {
  17. $this->game_code=$game_code;
  18. if($game_code=='sg'){
  19. $this->secret = Yii::$app->params['sg_secret'];
  20. $this->appid = Yii::$app->params['sg_app_id'];
  21. }elseif ($game_code=='ce'){
  22. $this->secret = Yii::$app->params['ce_secret'];
  23. $this->appid = Yii::$app->params['ce_app_id'];
  24. }elseif ($game_code=='cp'){
  25. $this->secret = Yii::$app->params['cp_secret'];
  26. $this->appid = Yii::$app->params['cp_app_id'];
  27. }
  28. }
  29. /**
  30. * Function Description:新增或更新用户信息
  31. * Function Name: getUserInfo
  32. * @param $encrypted_date
  33. * @param $iv
  34. * @param $token
  35. *
  36. * @return array
  37. *
  38. * @author 娄梦宁
  39. */
  40. public function getUserInfo($encrypted_date,$iv,$token)
  41. {
  42. $sg_user=new SgUser();
  43. #1:参数校验
  44. if($encrypted_date=='' || $iv=='' || $token=='')
  45. {
  46. return Util::returnArrEr('参数错误');
  47. }
  48. #2:用户信息解密
  49. $open_id=Util::authCode($token,'DECODE');
  50. $session_id=Yii::$app->cache->get($open_id.'_session_key');
  51. if(!$session_id){
  52. return Util::returnArrEr('session_id获取失败!');
  53. }
  54. $user_info=self::decryptDate($encrypted_date,$iv,$session_id);
  55. if($user_info===false)
  56. {
  57. return Util::returnArrEr('签名解密失败!');
  58. }
  59. #3:插入用户数据
  60. $sg_user_model=$sg_user::findOne(['open_id'=>$open_id]);
  61. $value=[
  62. 'create_time'=>date('Y-m-d H:i:s'),
  63. 'nick_name'=>$user_info['nickName'],
  64. 'avatar_url'=>$user_info['avatarUrl'],
  65. 'city'=>$user_info['city'],
  66. 'province'=>$user_info['province'],
  67. 'country'=>$user_info['country'],
  68. 'gender'=>$user_info['gender'],
  69. 'game_code'=>$this->game_code,
  70. ];
  71. if(!$sg_user_model)
  72. {
  73. #用户不存在,新增数据
  74. $value['open_id']=$open_id;
  75. $sg_user_clone=clone $sg_user;
  76. $sg_user_clone->attributes=$value;
  77. $sg_user_clone->insert();
  78. }else{
  79. #用户已存在,更新用户信息
  80. $sg_user_model->attributes=$value;
  81. $sg_user_model->update();
  82. }
  83. # 4:memcache记录登录信息
  84. Yii::$app->cache->set($user_info['openId'].'_token',$token,1296000);
  85. return Util::returnArrSu('',['token'=>$token]);
  86. }
  87. private function decryptDate($encryptedData,$iv,$session_id)
  88. {
  89. if (strlen($session_id) != 24) {
  90. return false;
  91. }
  92. $aesKey=base64_decode($session_id);
  93. if (strlen($iv) != 24) {
  94. return false;
  95. }
  96. $aesIV=base64_decode($iv);
  97. $aesCipher=base64_decode($encryptedData);
  98. $result=openssl_decrypt( $aesCipher, "AES-128-CBC", $aesKey, 1, $aesIV);
  99. return json_decode($result,true);
  100. }
  101. /**
  102. * Function Description:小游戏登录处理
  103. * Function Name: wxLogin
  104. * @param $code
  105. *
  106. * @return array
  107. *
  108. * @author 娄梦宁
  109. */
  110. public function wxLogin($code)
  111. {
  112. if($code=='')
  113. {
  114. return Util::returnArrEr('参数错误!');
  115. }
  116. $sg_user=new SgUser();
  117. #1:与微信交互获取open_id和session_key
  118. $url='https://api.weixin.qq.com/sns/jscode2session?appid='.$this->appid.'&secret='.$this->secret.'&js_code='.$code.'&grant_type=authorization_code';
  119. $curl=new CurlInterface();
  120. $result=$curl->execute($url);
  121. if(!isset($result['openid']) || !isset($result['session_key'])){
  122. return Util::returnArrEr('获取微信信息失败!');
  123. }
  124. $token_encode=Util::authCode($result['openid'],'ENCODE');
  125. #2:判断是否为新用户
  126. $user_info=$sg_user::find()->where(['=','open_id',$result['openid']])->asArray()->one();
  127. if(empty($user_info))
  128. {
  129. Yii::$app->cache->set($result['openid'].'_session_key',$result['session_key'],600);
  130. Yii::$app->cache->set($result['openid'].'_open_id',$result['openid'],600);
  131. return Util::returnArrEr('用户第一次登陆!',['token'=>$token_encode],'','1002');
  132. }
  133. #3:旧用户则更新登录状态
  134. $token=Yii::$app->cache->get($result['openid'].'_token');
  135. if(!$token)
  136. {
  137. return Util::returnArrEr('用户需要重新登录!',['token'=>$token_encode],'','1002');
  138. }
  139. return Util::returnArrSu('用户登录状态已更新!',['token'=>$token_encode],'','0000');
  140. }
  141. /**
  142. * Function Description:插入游戏记录
  143. * Function Name: playLog
  144. * @param $token
  145. * @param $score
  146. *
  147. * @return array
  148. *
  149. * @author 娄梦宁
  150. */
  151. public function playLog($token,$score)
  152. {
  153. if($token=='' || $score==='')
  154. {
  155. return Util::returnArrEr('参数错误!');
  156. }
  157. $sg_user=new SgUser();
  158. if($this->game_code=='sg'){
  159. $play_model=clone new SgPlayLog();
  160. }elseif ($this->game_code=='ce'){
  161. $play_model=clone new CePlayLog();
  162. }elseif ($this->game_code=='cp'){
  163. $play_model=clone new CpPlayLog();
  164. }
  165. $open_id=Util::authCode($token,'DECODE');
  166. if(!$open_id){
  167. return Util::returnArrEr('用户未授权');
  168. }
  169. $nick_name=$sg_user::find()->select('nick_name')->where(['=','open_id',$open_id])->asArray()->one();
  170. if(empty($nick_name)){
  171. return Util::returnArrEr('用户未授权!');
  172. }
  173. $value=[
  174. 'create_time'=>date('Y-m-d H:i:s'),
  175. 'score'=>$score,
  176. 'nick_name'=>$nick_name['nick_name'],
  177. 'open_id'=>$open_id,
  178. ];
  179. $play_model->attributes=$value;
  180. $play_model->insert();
  181. return Util::returnArrSu('数据插入成功!');
  182. }
  183. /**
  184. * Function Description:获取游戏最高分(疯狂消一消 疯狂排一排)
  185. * Function Name: getHigeScore
  186. * @param $token
  187. *
  188. * @return array
  189. *
  190. * @author 娄梦宁
  191. */
  192. public function getHighScore($token){
  193. if($token=='')
  194. {
  195. return Util::returnArrEr('参数错误!');
  196. }
  197. if($this->game_code=='ce'){
  198. $play_model=new CePlayLog();
  199. }else{
  200. $play_model=new CpPlayLog();
  201. }
  202. $open_id=Util::authCode($token,'DECODE');
  203. $high_score=$play_model->getHighByOpenId($open_id);
  204. $high_score=!$high_score['score'] ? 0:$high_score['score'];
  205. return Util::returnArrSu('最高分获取成功!',['high_score'=>$high_score]);
  206. }
  207. /**
  208. * Function Description:获取个人历史排行榜
  209. * Function Name: getSelfRankList
  210. * @param $token
  211. *
  212. * @return array
  213. *
  214. * @author 娄梦宁
  215. */
  216. public function getSelfRankList($token)
  217. {
  218. if($this->game_code=='sg'){
  219. $play_model=clone new SgPlayLog();
  220. $play_table_name='sg_play_log b';
  221. }elseif ($this->game_code=='ce'){
  222. $play_model=clone new CePlayLog();
  223. $play_table_name='ce_play_log b';
  224. }elseif ($this->game_code=='cp'){
  225. $play_model=clone new CpPlayLog();
  226. $play_table_name='cp_play_log b';
  227. }
  228. $sg_user=new SgUser();
  229. $open_id=Util::authCode($token,'DECODE');
  230. if(!$open_id){
  231. return Util::returnArrEr('用户未授权');
  232. }
  233. $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();
  234. $result_rank_list=[];
  235. if(!empty($nick_name))
  236. {
  237. $self_rank_list=$play_model->getSelfRankList($open_id);
  238. foreach($self_rank_list as $key=>$val)
  239. {
  240. $result_rank_list[$key+1]=[
  241. 'rank'=>$key+1,
  242. 'score'=>$this->game_code=='sg' ? self::addZero($val['score']) :$val['score'],
  243. 'nick_name'=>$val['nick_name'],
  244. 'create_time'=>self::ChangeTime($val['create_time']),
  245. 'avatar_url'=>'',
  246. ];
  247. }
  248. return Util::returnArrSu('',['self_rank_list'=>array_values($result_rank_list)]);
  249. }
  250. return Util::returnArrEr('用户尚未开始游戏!暂无数据!');
  251. }
  252. /**
  253. * Function Description:获取排行榜数据
  254. * Function Name: getRankList
  255. * @param $token
  256. *
  257. * @return array
  258. *
  259. * @author 娄梦宁
  260. */
  261. public function getRankList($token)
  262. {
  263. if($this->game_code=='sg'){
  264. $play_model=clone new SgPlayLog();
  265. $play_table_name='sg_play_log b';
  266. }elseif ($this->game_code=='ce'){
  267. $play_model=clone new CePlayLog();
  268. $play_table_name='ce_play_log b';
  269. }elseif($this->game_code=='cp'){
  270. $play_model=clone new CpPlayLog();
  271. $play_table_name='cp_play_log b';
  272. }
  273. $sg_user=new SgUser();
  274. $Monday=date('Y-m-d 00:00:00', (time() - ((date('w') == 0 ? 7 : date('w')) - 1) * 24 * 3600));
  275. $result=$play_model->getRankList($Monday);
  276. $open_id=Util::authCode($token,'DECODE');
  277. $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();
  278. $result_rank_list=[];
  279. if(!empty($nick_name))
  280. {
  281. #登录状态
  282. $self_rank=51;
  283. $self_info=[
  284. 'nick_name'=>$nick_name['nick_name'],
  285. 'score'=>$this->game_code=='sg' ? '12:00' : 0,
  286. 'avatar_url'=>$nick_name['avatar_url'],
  287. ];
  288. foreach ($result as $k=>$v)
  289. {
  290. if($open_id==$v['open_id'])
  291. {
  292. $self_rank=$k+1;
  293. $self_info=$v;
  294. }
  295. };
  296. $rank_list=array_slice($result,0,50);
  297. foreach($rank_list as $key=>$val)
  298. {
  299. $result_rank_list[$key+1]=[
  300. 'rank'=>$key+1,
  301. 'score'=>$this->game_code=='sg' ? self::addZero($val['score']) :$val['score'],
  302. 'nick_name'=>$val['nick_name'],
  303. 'avatar_url'=>$val['avatar_url'],
  304. ];
  305. }
  306. sort($result_rank_list);
  307. $self_rank=[
  308. 'rank'=>$self_rank,
  309. 'score'=>$this->game_code=='sg' ? self::addZero($self_info['score']) :$self_info['score'],
  310. 'nick_name'=>$self_info['nick_name'],
  311. 'avatar_url'=>$self_info['avatar_url'],
  312. ];
  313. return Util::returnArrSu('排行榜信息获取成功!',['rank_list'=>array_values($result_rank_list),'self_rank'=>$self_rank]);
  314. }
  315. $result_list=array_slice($result,0,50);
  316. foreach ($result_list as $key=>$val)
  317. {
  318. $result_rank_list[$key+1]=[
  319. 'rank'=>$key+1,
  320. 'score'=>$this->game_code=='sg' ? self::addZero($val['score']) :$val['score'],
  321. 'nick_name'=>$val['nick_name'],
  322. 'avatar_url'=>$val['avatar_url'],
  323. ];
  324. }
  325. return Util::returnArrSu('排行榜信息获取成功!',['rank_list'=>array_values($result_rank_list),'self_rank'=>[]]);
  326. }
  327. /**
  328. * Function Description:格式化时间成绩
  329. * Function Name: addZero
  330. * @param $num
  331. *
  332. * @return int|string
  333. *
  334. * @author 娄梦宁
  335. */
  336. private function addZero($num)
  337. {
  338. $str=strval($num);
  339. $len=strlen($str);
  340. if($len==5)
  341. {
  342. return $str;
  343. }
  344. $point_position=stripos($str,'.');
  345. if($point_position===false){
  346. if($len==1){
  347. return '0'.$str.'.00';
  348. }else{
  349. return $str.'.00';
  350. }
  351. }elseif($point_position==1){
  352. if($len==4){
  353. return '0'.$str;
  354. }else{
  355. return '0'.$str.'0';
  356. }
  357. }elseif($point_position==2){
  358. return $str.'0';
  359. }
  360. return $str;
  361. }
  362. /**
  363. * Function Description:处理个人排行榜中的时间字符串
  364. * Function Name: ChangeTime
  365. * @param $create_time
  366. *
  367. * @return false|string
  368. *
  369. * @author 娄梦宁
  370. */
  371. private function ChangeTime($create_time)
  372. {
  373. $diff_time=time()-strtotime($create_time);
  374. $today_seconds=time()-strtotime(date('Ymd'));
  375. if($diff_time<60)
  376. {
  377. #一分钟内
  378. return '刚刚';
  379. }elseif($diff_time<3600)
  380. {
  381. #一小时内
  382. $minute=floor($diff_time/60);
  383. return $minute.'分钟前';
  384. }elseif($diff_time<$today_seconds)
  385. {
  386. #一天内
  387. $hours=floor($diff_time/3600);
  388. return $hours.'小时前';
  389. }else
  390. {
  391. $year=date('y',strtotime($create_time));
  392. $now_year=date('y');
  393. #今年
  394. if($year==$now_year)
  395. {
  396. return date('n月j日',strtotime($create_time));
  397. }else{
  398. #前几年
  399. return date('y年n月j日',strtotime($create_time));
  400. }
  401. }
  402. }
  403. }