308 lines
11 KiB
PHP
308 lines
11 KiB
PHP
<?php
|
||
|
||
namespace app\api\model;
|
||
|
||
|
||
use think\Db;
|
||
use think\Model;
|
||
use think\facade\Env;
|
||
|
||
class AgoraAuth extends Model
|
||
{
|
||
|
||
/**
|
||
* 登录接口,获取针对当前用户(UID)的短期令牌Code
|
||
* 调用方:APP端
|
||
*/
|
||
public function get_code($uid){
|
||
$user_info = db::name('user')->find($uid);
|
||
if(!$user_info){
|
||
return ['code' => 201, 'msg' => '用户不存在', 'data' => null];
|
||
}
|
||
|
||
$now_time = time();
|
||
|
||
//删除用户已有code
|
||
$map = [];
|
||
$map[] = ['uid', '=', $uid];
|
||
$user_code = db::name('user_agora_code')->where($map)->delete();
|
||
|
||
$code = md5($uid . date('YmdHis') . generateRandom(32));
|
||
|
||
//生成用户code
|
||
$insert = [];
|
||
$insert['uid'] = $uid;
|
||
$insert['code'] = $code;
|
||
$insert['add_time'] = $now_time;
|
||
$insert['expire_time'] = $now_time + (60*60*2);
|
||
$reslut = db::name('user_agora_code')->insert($insert);
|
||
if(!$reslut){
|
||
return ['code' => 201, 'msg' => '获取失败', 'data' => null];
|
||
}
|
||
|
||
$data = [];
|
||
$data['code'] = $code;
|
||
return ['code' => 200, 'msg' => '获取成功', 'data' => $data];
|
||
}
|
||
|
||
/**
|
||
* 短期令牌Code更换长期令牌SSToken
|
||
* 调用方:游戏服务
|
||
*
|
||
*/
|
||
public function get_sstoken($data){
|
||
$now_time = time();
|
||
// $data = json_decode($data,true);
|
||
// dump($data);exit;
|
||
$code = $data['code'];
|
||
|
||
$map = [];
|
||
$map[] = ['code', '=', $code];
|
||
$code_info = db::name('user_agora_code')->where($map)->find();
|
||
if(!$code_info){
|
||
$data = [];
|
||
return ['ret_code' => 1, 'ret_msg' => 'Code非法', 'sdk_error_code' => 9999, 'data' => $data];
|
||
}
|
||
|
||
//code 是否过期
|
||
if($code_info['expire_time'] < time()){
|
||
$data = [];
|
||
return ['ret_code' => 1, 'ret_msg' => 'Code已过期', 'sdk_error_code' => 1005, 'data' => $data];
|
||
}
|
||
|
||
//是否有该用户token
|
||
$map = [];
|
||
$map[] = ['a.uid', '=', $code_info['uid']];
|
||
$token_info = db::name('user_agora_token')->alias('a')->join('yy_user b', 'a.uid = b.uid')->field('a.uid,a.token,a.expire_time,b.nick_name,b.base64_nick_name,b.head_pic,b.sex')->where($map)->order('a.add_time desc')->find();
|
||
if($token_info){
|
||
//是否过期
|
||
if($token_info['expire_time'] < time()){
|
||
$datas = [];
|
||
$datas['ss_token'] = $token_info['token'];
|
||
// $data['expire_date'] = $token_info['expire_time'] * 1000;
|
||
// return ['ret_code' => 1, 'ret_msg' => 'Token已过期,请重新生成', 'sdk_error_code' => 1005, 'data' => $data];
|
||
$update_sstoken = $this->update_sstoken($datas);
|
||
if($update_sstoken['ret_code'] == 0){
|
||
$data = $update_sstoken['data'];
|
||
}else{
|
||
$data = [];
|
||
return ['ret_code' => 1, 'ret_msg' => '未知错误', 'sdk_error_code' => 9999, 'data' => $data];
|
||
}
|
||
}else{
|
||
if($token_info['sex'] == 1){
|
||
$sex = 'male';
|
||
}else if($token_info['sex'] == 2){
|
||
$sex = 'female';
|
||
}else{
|
||
$sex = '';
|
||
}
|
||
$data = [];
|
||
$data['ss_token'] = $token_info['token'];
|
||
$data['expire_date'] = $token_info['expire_time'] * 1000;
|
||
$data['user_info']['uid'] = strval($token_info['uid']);
|
||
$data['user_info']['nick_name'] = mb_convert_encoding(base64_decode($token_info['base64_nick_name']), 'UTF-8', 'UTF-8');
|
||
$data['user_info']['avatar_url'] = localpath_to_netpath($token_info['head_pic']);
|
||
$data['user_info']['gender'] = $sex;
|
||
$data['user_info']['is_ai'] = 0;
|
||
|
||
}
|
||
}else{
|
||
$token = md5(md5($code_info['uid'] . date('YmdHis') . generateRandom(32)));
|
||
//生成用户token
|
||
$insert = [];
|
||
$insert['uid'] = $code_info['uid'];
|
||
$insert['token'] = $token;
|
||
$insert['add_time'] = $now_time;
|
||
$insert['expire_time'] = $now_time + (60*60*24*30);
|
||
$reslut = db::name('user_agora_token')->insert($insert);
|
||
if(!$reslut){
|
||
$data = [];
|
||
return ['ret_code' => 1, 'ret_msg' => 'Token创建失败', 'sdk_error_code' => 1001, 'data' => $data];
|
||
}
|
||
|
||
$user_info = db::name('user')->find($code_info['uid']);
|
||
if($user_info['sex'] == 1){
|
||
$sex = 'male';
|
||
}else if($user_info['sex'] == 2){
|
||
$sex = 'female';
|
||
}else{
|
||
$sex = '';
|
||
}
|
||
|
||
$data = [];
|
||
$data['ss_token'] = $token;
|
||
$data['expire_date'] = $insert['expire_time'] * 1000;
|
||
$data['user_info']['uid'] = strval($code_info['uid']);
|
||
$data['user_info']['nick_name'] = mb_convert_encoding(base64_decode($user_info['base64_nick_name']), 'UTF-8', 'UTF-8');
|
||
$data['user_info']['avatar_url'] = localpath_to_netpath($user_info['head_pic']);
|
||
$data['user_info']['gender'] = $sex;
|
||
$data['user_info']['is_ai'] = 0;
|
||
|
||
}
|
||
|
||
return ['ret_code' => 0, 'ret_msg' => '', 'sdk_error_code' => 0, 'data' => $data];
|
||
}
|
||
|
||
/**
|
||
* 刷新长期令牌
|
||
* 调用方:游戏服务
|
||
*
|
||
*/
|
||
public function update_sstoken($data){
|
||
$token = $data['ss_token'];
|
||
$map = [];
|
||
$map[] = ['token', '=', $token];
|
||
$token_info = db::name('user_agora_token')->where($map)->find();
|
||
if(!$token_info){
|
||
$data = [];
|
||
return ['ret_code' => 1, 'ret_msg' => 'Token非法', 'sdk_error_code' => 1004, 'data' => $data];
|
||
}
|
||
|
||
$uid = $token_info['uid'];
|
||
$token = md5(md5($uid . date('YmdHis') . generateRandom(32)));
|
||
$now_time = time();
|
||
|
||
$user_info = db::name('user')->find($uid);
|
||
if($user_info['sex'] == 1){
|
||
$sex = 'male';
|
||
}else if($user_info['sex'] == 2){
|
||
$sex = 'female';
|
||
}else{
|
||
$sex = '';
|
||
}
|
||
|
||
Db::startTrans();
|
||
try {
|
||
//删除之前的token
|
||
$map = [];
|
||
$map[] = ['uid', '=', $uid];
|
||
$reslut = db::name('user_agora_token')->where($map)->delete();
|
||
if(!$reslut){
|
||
Db::rollback();
|
||
return ['ret_code' => 1, 'ret_msg' => '未知错误', 'sdk_error_code' => 9999, 'data' => []];
|
||
}
|
||
|
||
$insert = [];
|
||
$insert['uid'] = $uid;
|
||
$insert['token'] = $token;
|
||
$insert['add_time'] = $now_time;
|
||
$insert['expire_time'] = $now_time + (60*60*24*30);
|
||
$reslut = db::name('user_agora_token')->insert($insert);
|
||
if(!$reslut){
|
||
Db::rollback();
|
||
return ['ret_code' => 1, 'ret_msg' => 'Token创建失败', 'sdk_error_code' => 1001, 'data' => []];
|
||
}
|
||
|
||
$data = [];
|
||
$data['ss_token'] = $token;
|
||
$data['expire_date'] = $insert['expire_time'] * 1000;
|
||
$data['user_info']['uid'] = strval($user_info['uid']);
|
||
$data['user_info']['nick_name'] = mb_convert_encoding(base64_decode($user_info['base64_nick_name']), 'UTF-8', 'UTF-8');
|
||
$data['user_info']['avatar_url'] = localpath_to_netpath($user_info['head_pic']);
|
||
$data['user_info']['gender'] = $sex;
|
||
$data['user_info']['is_ai'] = 0;
|
||
|
||
Db::commit();
|
||
return ['ret_code' => 0, 'ret_msg' => '', 'sdk_error_code' => 0, 'data' => $data];
|
||
} catch (\Exception $e) {
|
||
//回滚事务
|
||
Db::rollback();
|
||
return ['ret_code' => 1, 'ret_msg' => '未知错误', 'sdk_error_code' => 9999, 'data' => []];
|
||
}
|
||
|
||
}
|
||
|
||
|
||
/**
|
||
* 获取用户信息
|
||
* 调用方:游戏服务
|
||
*
|
||
*/
|
||
public function get_user_info($data){
|
||
$token = $data['ss_token'];
|
||
|
||
$map = [];
|
||
$map[] = ['token', '=', $token];
|
||
$token_info = db::name('user_agora_token')->where($map)->find();
|
||
if(!$token_info){
|
||
$data = [];
|
||
return ['ret_code' => 1, 'ret_msg' => 'Token非法', 'sdk_error_code' => 1004, 'data' => $data];
|
||
}
|
||
|
||
//token是否过期
|
||
if($token_info['expire_time'] < time()){
|
||
$data = [];
|
||
$data['ss_token'] = $token_info['token'];
|
||
$data['expire_date'] = $token_info['expire_time'];
|
||
return ['ret_code' => 1, 'ret_msg' => 'Token已过期', 'sdk_error_code' => 1005, 'data' => $data];
|
||
}
|
||
|
||
//获取用户信息
|
||
$user_info = db::name('user')->find($token_info['uid']);
|
||
if($user_info['sex'] == 1){
|
||
$sex = 'male';
|
||
}else if($user_info['sex'] == 2){
|
||
$sex = 'female';
|
||
}else{
|
||
$sex = '';
|
||
}
|
||
|
||
$data = [];
|
||
$data['uid'] = strval($user_info['uid']);
|
||
$data['nick_name'] = mb_convert_encoding(base64_decode($user_info['base64_nick_name']), 'UTF-8', 'UTF-8');
|
||
$data['avatar_url'] = localpath_to_netpath($user_info['head_pic']);
|
||
$data['gender'] = $sex;
|
||
|
||
return ['ret_code' => 0, 'ret_msg' => '', 'sdk_error_code' => 0, 'data' => $data];
|
||
}
|
||
|
||
|
||
/**
|
||
* 游戏服务端上报游戏接入方的游戏的数据
|
||
* 调用方:游戏服务
|
||
*
|
||
*/
|
||
public function report_game_info($data){
|
||
$now_time = time();
|
||
|
||
$map = [];
|
||
$map[] = ['uid', '=', $data['uid']];
|
||
$map[] = ['token', '=', $data['ss_token']];
|
||
$token_info = db::name('user_agora_token')->where($map)->find();
|
||
if(!$token_info){
|
||
$data = [];
|
||
return ['ret_code' => 1, 'ret_msg' => 'Token非法', 'sdk_error_code' => 1004, 'data' => $data];
|
||
}
|
||
|
||
$insert = [];
|
||
if($data['report_type'] == 'game_start'){
|
||
$insert['report_type'] = 1;
|
||
$insert['players'] = json_encode($data['report_msg']['players']);
|
||
}else{
|
||
$insert['report_type'] = 2;
|
||
$insert['battle_end_at'] = $data['report_msg']['battle_end_at'];
|
||
$insert['battle_duration'] = $data['report_msg']['battle_duration'];
|
||
$insert['results'] = json_encode($data['report_msg']['results']);
|
||
}
|
||
$insert['mg_id'] = $data['report_msg']['mg_id'];
|
||
$insert['room_id'] = $data['report_msg']['room_id'];
|
||
$insert['game_mode'] = $data['report_msg']['game_mode'];
|
||
$insert['game_round_id'] = $data['report_msg']['game_round_id'];
|
||
$insert['battle_start_at'] = $data['report_msg']['battle_start_at'];
|
||
$insert['report_game_info_extras'] = $data['report_msg']['report_game_info_extras'];
|
||
$insert['report_game_info_key'] = $data['report_msg']['report_game_info_key'];
|
||
$insert['uid'] = $data['uid'];
|
||
$insert['token'] = $data['ss_token'];
|
||
$insert['add_time'] = $now_time;
|
||
$reslut = db::name('agora_game_log')->insert($insert);
|
||
if($reslut){
|
||
return ['ret_code' => 0, 'ret_msg' => ''];
|
||
}else{
|
||
return ['ret_code' => 1, 'ret_msg' => ''];
|
||
}
|
||
|
||
}
|
||
|
||
|
||
}
|