This commit is contained in:
2025-08-14 17:19:26 +08:00
parent 30abda5ba7
commit 281248fd04
245 changed files with 21051 additions and 61 deletions

View File

@@ -0,0 +1,180 @@
<?php
namespace app\api\model;
use app\common\library\DatabaseRoute;
use ba\Random;
use think\cache\driver\Redis;
use think\facade\Cache;
use think\facade\Db;
use think\facade\Log;
use think\Model;
class UniAdCallbackRecord extends Model
{
public static function getFreeWatchRemainTime($user_id, $isPermanent):int
{
// 构造Redis键名根据是否永久免费区分
$redisKey = $isPermanent
? "user:free_watch:permanent:{$user_id}"
: "user:free_watch:normal:{$user_id}";
$redis = new Redis;
// 从Redis获取值默认返回0
$remainTime = $redis->get($redisKey, 0);
// 确保返回整数类型
return (int)$remainTime;
}
public static function adCallBack(array $callBackDTO)
{
$respData = [];
$db = Db::connect(config('database.search_library'));
// 检查是否重复回调
$record = $db->name('uni_ad_callback_record')
->where('trans_id', $callBackDTO['trans_id'])
->find();
if ($record) {
Log::write("回调重复, trans_id: {$record['trans_id']}");
$respData['isValid'] = false;
return $respData;
}
// 准备记录数据
$recordData = [
'user_id' => (int)$callBackDTO['user_id'],
'platform' => $callBackDTO['platform'],
'trans_id' => $callBackDTO['trans_id'],
'adpid' => $callBackDTO['adpid'],
'provider' => $callBackDTO['provider'],
'sign' => $callBackDTO['sign'],
'extra' => $callBackDTO['extra'],
'create_time' => date('Y-m-d H:i:s'),
'is_ended' => 1
];
$security = 'cbc34e14ee6d64738557c96623dd6da89f77cac8ae519c6a5c87191d614d386a';
// 签名验证
$flag = self::validateSign($security, $callBackDTO['trans_id'], $callBackDTO['sign']);
if (!$flag) {
$recordData['err_msg'] = "签名验证失败";
Log::write(json_encode($recordData));
Db::name('uni_ad_callback_record')->insert($recordData);
$respData['isValid'] = false;
return $respData;
}
// 检查用户是否存在
$userEntity = Db::name('user_entity')
->where('id', $callBackDTO['user_id'])
->find();
if (!$userEntity) {
$recordData['err_msg'] = "用户不存在";
Log::warning(self::getBaseErrInfo($recordData));
Db::name('uni_ad_callback_record')->insert($recordData);
$respData['isValid'] = false;
return $respData;
}
// 根据extra字段处理不同逻辑
if (!str_contains($callBackDTO['extra'], "cash")) {
// 获取配置信息
$info = Db::name('common_info')
->where('id', 921)
->find();
if (!$info || empty($info['value'])) {
$recordData['err_msg'] = "CommonInfo时长时间未配置";
Log::warning(self::getBaseErrInfo($recordData));
Db::name('uni_ad_callback_record')->insert($recordData);
$respData['isValid'] = false;
return $respData;
}
// 设置免费观看时间(分钟转秒)
self::setFreeWatchTime($recordData['user_id'], (int)$info['value'] * 60, true);
} else {
// 设置可提现标志
$recordId = Db::name('uni_ad_callback_record')->insertGetId($recordData);
self::setCanCashFlag($userEntity['id'], $recordId);
return ['isValid' => true]; // 提前返回,避免重复插入
}
// 保存记录
Db::name('uni_ad_callback_record')->insert($recordData);
// 返回成功响应
$respData['isValid'] = true;
return $respData;
}
/**
* 验证签名
* @param string $securityKey 安全密钥
* @param string $transId 交易ID
* @param string $sign 签名
* @return bool 验证结果
*/
public static function validateSign(string $securityKey, string $transId, string $sign): bool
{
// 实际签名验证逻辑(根据业务需求实现)
$expectedSign = self::generateSign($securityKey, $transId);
return $expectedSign === $sign;
}
/**
* 设置免费观看时间
* @param int $userId 用户ID
* @param int $duration 时长(秒)
* @param bool $isPermanent 是否永久
*/
public static function setFreeWatchTime(int $userId, int $duration, bool $isPermanent)
{
$key = $isPermanent ? "free_watch:permanent:{$userId}" : "free_watch:normal:{$userId}";
Cache::set($key, $duration, $duration); // 缓存时间等于有效时长
}
/**
* 设置可提现标志
* @param int $userId 用户ID
* @param int $recordId 记录ID
*/
public static function setCanCashFlag(int $userId, int $recordId)
{
Cache::set("can_cash:{$userId}", $recordId, 86400); // 缓存24小时
}
/**
* 获取基础错误信息
* @param array $record 记录数据
* @return string 错误信息
*/
public static function getBaseErrInfo(array $record): string
{
return "广告回调错误: [user_id={$record['user_id']}, trans_id={$record['trans_id']}, err_msg={$record['err_msg']}]";
}
/**
* 生成签名
* @param string $secret 安全密钥
* @param string $transId 交易ID
* @return string 生成的签名(十六进制字符串)
*/
public static function generateSign(string $secret, string $transId): string
{
// 生成待加密的字符串
$data = $secret . ':' . $transId;
// 使用SHA-256生成签名返回十六进制字符串
return hash('sha256', $data);
}
}