绑定邀请码 新增设备指纹校验

This commit is contained in:
tianfeng 2025-10-30 15:16:38 +08:00
parent 4c12994010
commit 6145efc7a4
7 changed files with 81 additions and 10 deletions

View File

@ -139,4 +139,13 @@ public interface RegisterDeviceClientApi {
*/
@PostMapping("/pageList")
ResultResponse<PageResult<ArchiveDeviceDTO>> pageList(@RequestBody ArchiveDeviceQryCmd query);
/**
* 获取用户设备指纹唯一标识
*
* @param userId 用户ID
* @return 设备指纹字符串 device_type|request_client|phone_model|ip 拼接而成
*/
@GetMapping("/user/device/fingerprint")
ResultResponse<String> getDeviceFingerprintByUserId(@RequestParam("userId") Long userId);
}

View File

@ -196,25 +196,25 @@ public class BindInviteCodeExe {
}
/**
* 获取设备ID如果没有则使用userId
* 获取设备指纹唯一标识
* @param userId 用户ID
* @return 设备ID或用户ID
* @return 设备指纹字符串或用户ID
*/
private String getDeviceId(Long userId) {
try {
ResultResponse<String> response = registerDeviceClient.getImeiByUserId(userId);
String imei = response != null ? response.getBody() : null;
ResultResponse<String> response = registerDeviceClient.getDeviceFingerprintByUserId(userId);
String fingerprint = response != null && response.getStatus() ? response.getBody() : null;
if (StringUtils.isNotBlank(imei)) {
log.info("获取到设备ID, userId={}, deviceId={}", userId, imei);
return imei;
if (StringUtils.isNotBlank(fingerprint)) {
log.info("获取到设备指纹, userId={}, fingerprint={}", userId, fingerprint);
return fingerprint;
}
} catch (Exception e) {
log.warn("获取设备ID失败, userId={}, error={}", userId, e.getMessage());
log.warn("获取设备指纹失败, userId={}, error={}", userId, e.getMessage());
}
// 如果没有设备ID使用userId
log.info("未获取到设备ID使用userId作为设备标识, userId={}", userId);
// 如果没有设备指纹使用userId
log.info("未获取到设备指纹使用userId作为设备标识, userId={}", userId);
return "USER_" + userId;
}

View File

@ -108,4 +108,12 @@ public interface LatestMobileDeviceService extends BaseService<LatestMobileDevic
Set<Long> getImeiUserId(Long userId);
/**
* 获取用户设备指纹
*
* @param userId 用户ID
* @return 设备指纹字符串
*/
String getDeviceFingerprintByUserId(Long userId);
}

View File

@ -275,4 +275,40 @@ public class LatestMobileDeviceServiceImpl extends
}
@Override
public String getDeviceFingerprintByUserId(Long userId) {
if (userId == null) {
return "";
}
LatestMobileDevice device = query()
.eq(LatestMobileDevice::getUserId, userId)
.last(PageConstant.LIMIT_ONE)
.getOne();
if (device == null) {
return "";
}
return buildDeviceFingerprint(
device.getRequestClient(),
device.getPhoneModel(),
device.getIp()
);
}
/**
* 构建设备指纹
*/
private String buildDeviceFingerprint(String requestClient,
String phoneModel, String ip) {
if (StringUtils.isBlank(requestClient)
|| StringUtils.isBlank(phoneModel)
|| StringUtils.isBlank(ip)) {
return "";
}
return requestClient + "|" + phoneModel + "|" + ip;
}
}

View File

@ -118,4 +118,9 @@ public class RegisterDeviceClientEndpoint implements RegisterDeviceClientApi {
public ResultResponse<PageResult<ArchiveDeviceDTO>> pageList(ArchiveDeviceQryCmd query) {
return ResultResponse.success(registerDeviceClientService.pageList(query));
}
@Override
public ResultResponse<String> getDeviceFingerprintByUserId(Long userId) {
return ResultResponse.success(registerDeviceClientService.getDeviceFingerprintByUserId(userId));
}
}

View File

@ -108,4 +108,12 @@ public interface RegisterDeviceClientService {
* @return 设备信息
*/
Map<Long, String> mapImeiByIds(Set<Long> userIds);
/**
* 获取用户设备指纹
*
* @param userId 用户ID
* @return 设备指纹字符串
*/
String getDeviceFingerprintByUserId(Long userId);
}

View File

@ -229,4 +229,9 @@ public class RegisterDeviceClientServiceImpl implements RegisterDeviceClientServ
public Map<Long, String> mapImeiByIds(Set<Long> userIds) {
return latestMobileDeviceService.mapImeiByIds(userIds);
}
@Override
public String getDeviceFingerprintByUserId(Long userId) {
return latestMobileDeviceService.getDeviceFingerprintByUserId(userId);
}
}