软件第一次打开上报接口 - 记录设备第一次打开时间、IP地址、软件版本、设备名称,返回第一次打开日期时间戳,并做免费授权日期验证(7天)
路由注册:
mux.HandleFunc("/api/software/secure/firstLaunch", r.softwareController.SecureFirstLaunchReport)
处理函数:
r.softwareController.SecureFirstLaunchReport
请求参数(安全格式):
{
"data": "string, required - Base64编码的上报数据",
"signature": "string, required - MD5签名",
"timestamp": "number, required - 时间戳(秒级)"
}
data字段解码后的内容:
{
"deviceId": "string, required - 设备唯一标识,如 6AQRP-W2BXW-ZSGZT-HQ7QD-CBNHR",
"deviceName": "string, required - 设备名称",
"softwareVersion": "string, required - 软件版本号",
"timestamp": "number, required - 时间戳(须与外层一致)"
}
注意:IP地址将自动从HTTP请求中获取(支持X-Forwarded-For/X-Real-IP),无需在请求参数中提供
成功响应(安全格式):
{
"data": "string - Base64编码的响应数据",
"signature": "string - MD5签名",
"timestamp": "number - 时间戳"
}
data字段解码后的响应内容:
{
"isNewDevice": "boolean - 是否为第一次打开上报(true=首次,false=已存在记录)",
"firstLaunchTimestamp": "number - 第一次打开日期的时间戳(秒级)",
"freeExpireTimestamp": "number - 免费授权到期时间戳(秒级,首次打开时间+7天)",
"isAvailable": "boolean - 免费授权是否有效(当前时间未超过到期时间则为true)",
"message": "string - 处理信息"
}
业务逻辑:
• 首次上报:创建 first_launch_record 记录,记录设备ID、设备名称、IP地址、软件版本、第一次打开时间
• 重复上报:直接返回已记录的第一次打开时间戳,不更新原记录
• 免费授权验证:以第一次打开时间为起点计算7天授权期,到期后 isAvailable=false
• 授权期常量:FreeAuthorizationDays = 7(定义于 software_controller.go)
安全特性:
• Base64编码传输数据
• MD5签名验证防止篡改
• 时间戳验证防止重放攻击(300秒有效期)
• 内外层时间戳一致性校验
• IP地址自动从HTTP请求获取(支持代理头X-Forwarded-For/X-Real-IP)
错误码:
• 400 Bad Request - 请求参数错误 / 时间戳过期 / 签名验证失败 / 时间戳不一致
• 405 Method Not Allowed - 请求方法错误(仅支持POST)
• 500 Internal Server Error - 数据库错误 / 响应序列化失败
使用示例:
// 1. 准备第一次打开上报数据(IP地址将自动从HTTP请求获取)
const launchData = {
deviceId: "6AQRP-W2BXW-ZSGZT-HQ7QD-CBNHR",
deviceName: "我的电脑",
softwareVersion: "1.0.0",
timestamp: Math.floor(Date.now() / 1000)
};
// 2. 打包为安全格式
const secureData = packSecureData(launchData, secretKey);
// 3. 发送请求
fetch('/api/software/secure/firstLaunch', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(secureData)
}).then(res => res.json()).then(secureRes => {
// 4. 解包响应
const decoded = unpackSecureData(secureRes, secretKey);
const result = JSON.parse(decoded);
console.log('首次打开时间戳:', result.firstLaunchTimestamp);
console.log('免费授权到期时间戳:', result.freeExpireTimestamp);
console.log('授权是否有效:', result.isAvailable);
});
响应示例(解码后):
{
"isNewDevice": true,
"firstLaunchTimestamp": 1756870000,
"freeExpireTimestamp": 1757474800,
"isAvailable": true,
"message": "First launch report completed"
}