Files
mier-php/application/api/model/AgoraAuth.php
2025-08-11 10:22:05 +08:00

308 lines
11 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?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' => ''];
}
}
}