在用户注册、登录、领券等关键业务环节,需要检测设备是否存在模拟器、Root、多开等异常风险。本文档介绍如何调用设备风险识别服务(基础版与增强版)获取设备风险检测结果,包含事件参数、返回参数、错误码及 SDK 调用方式。适用于活动防刷、账号安全防护等场景。
版本介绍
为匹配不同行业、企业不同发展阶段的风控需求,设备风险识别分为基础版、增强版,两者的差异对比如下:
功能特性 | 基础版 | 增强版 |
实时计算 | 支持 | 支持 |
服务返回 | 风险标签 | 风险标签、设备唯一 ID |
日志服务(SLS)投递 | 不支持 | 支持,用户可授权进行日志投递,免费存储一年 |
版本选型建议
基础版:适用于仅需风险标签判定的场景,例如识别设备是否为模拟器、是否 Root 或多开等基础风控需求。
增强版:适用于需要设备唯一 ID 进行跨会话追踪,或需要将日志投递至 SLS 进行深度分析的场景。
前提条件
使用设备风险识别服务前,需满足以下条件:
已开通设备风险识别服务。
已获取 AccessKey ID 和 AccessKey Secret。建议使用 RAM 用户进行 API 访问,而非直接使用主账号 AccessKey。
已完成端侧 SDK 集成。具体操作,参见SDK 接入文档。
服务传入参数
Service 参数
Service 参数用于指定调用的服务版本。不同版本对应的 Service 参数值如下:
版本 | Service 参数值 |
基础版 |
|
增强版 |
|
ServiceParameters 参数
ServiceParameters 为具体的业务请求参数,为 JSON 格式,对应公共参数中ServiceParameters字段。以下为设备风险识别服务(含基础版、增强版)需传入的请求参数。
字段名称 | 字段描述 | 数据格式 | 样例数据 | 是否必填 | 备注说明 |
deviceToken | 通过设备风险 SDK获取 deviceToken | String | Tk9SSUQuMS***************************ZDNmNWY5NzQxOW1oLTE2MjI2NDIyNjc4MzAtZmIwODAwOGE2NGZWFhdDgzMTBLUlVSU0VoWWVNcW82ZkZlZWJBY0s0QmFGOGNyT3poY2txZXVqRjMyc1lCaDdBL2pzRTRPdXhmZjU5NEgxcGlQMGFEU1AwajZpa1ZTQ1FlbE5IQmZkTklZVzVkV2VDM1hHNUMreVRtMXFFemp3PT0= | 是 | 正常情况下 token 的长度在 600 字节左右,在网络较差的场景下 token 长度会超过 2.5K。如果出现了大量的长 token,请先检查客户端的网络是否畅通,其次请确保 SDK 的 init 接口和 getSession 接口调用间隔大于 2 秒。 |
deviceTokenBizId | 业务唯一 ID | String | aes9ad0356da4df8c1f18bc349296d60 | 否 | 端上 SDK 获取 deviceToken 时建议传入该 bizId,可以将本次 deviceToken 和本次业务唯一 ID 绑定,后在服务端查询结果时将一起传入,并确保客户端传入 bizId 和服务端传入 ID 一致,避免 deviceToken 被替换的风险。 |
服务返回参数
设备风险识别服务的返回参数包括设备 ID、设备风险标签。
设备 ID
详见返回参数 Data 中extend字段,仅增强版支持返回设备唯一 ID。
设备风险标签
详见返回参数 Data 中tags字段,若返回多个标签则以英文逗号分割,部分标签含义如下:
值 | 释义 |
is_emulator | 设备疑似模拟器 |
is_rooted | 设备疑似 root |
is_virtual | 疑似多开环境 |
…… | 登录风险识别控制台,进入接入管理模块查看更多设备标签释义。 |
更多信息,参见公共返回参数。
错误码
Code | 含义描述 |
200 | 请求成功。 |
400 | ServiceParameters(事件参数)不合法。 |
402 | QPS 超过已购规格,限流。 |
403 | 权限不足,服务未开通或已到期。 |
404 | Service(服务参数)不合法。 |
500 | 内部服务器错误。 |
SDK 调用方式
完整的接入 Demo 请参考:设备风险SDK Android接入。以下以 Java SDK 接入为例:
Maven 依赖
Java Maven 依赖:
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-saf</artifactId>
<version>3.0.1</version>
</dependency>
Java Maven 推荐依赖仲裁:
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<optional>true</optional>
<version>4.5.25</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.68.noneautotype</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.3</version>
</dependency>
<dependency>
<groupId>io.opentracing</groupId>
<artifactId>opentracing-util</artifactId>
<version>0.31.0</version>
</dependency>
Java SDK 源码
// 阿里云账号 AccessKey 拥有所有 API 的访问权限,建议使用 RAM 用户进行 API 访问或日常运维。
// 请勿将 AccessKey ID 和 AccessKey Secret 保存到工程代码中,以免导致 AccessKey 泄露,威胁账号下所有资源的安全。
// 本示例通过从环境变量中读取 RAM 用户 AccessKey 来实现 API 访问的身份验证。运行本示例代码前,请确认已配置以下环境变量:ALIBABA_CLOUD_ACCESS_KEY_ID、ALIBABA_CLOUD_ACCESS_KEY_SECRET。
// 创建 DefaultAcsClient 实例并初始化,仅需初始化一次
DefaultProfile profile = DefaultProfile.getProfile(
"cn-shanghai", // 地域 ID,国内推荐 cn-shanghai,需和端 SDK 上报域名对应
System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"), // RAM 用户的 AccessKey ID
System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET") // RAM 用户 Access Key Secret
);
// http 连接池相关配置
HttpClientConfig clientConfig = HttpClientConfig.getDefault();
clientConfig.setMaxRequestsPerHost(6);
clientConfig.setMaxIdleConnections(20);
// http 超时时间配置
clientConfig.setReadTimeoutMillis(10000);
clientConfig.setConnectionTimeoutMillis(3000);
profile.setHttpClientConfig(clientConfig);
IAcsClient client = new DefaultAcsClient(profile);
// 发起请求
ExecuteRequestRequest executeRequestRequest = new ExecuteRequestRequest();
// 如需指定特殊版本号,可在此处调整,默认为 2019-05-21
executeRequestRequest.setVersion("2019-05-21");
// 指定请求方法
executeRequestRequest.setSysMethod(MethodType.POST);
// 指定协议,目前仅支持 HTTPS
executeRequestRequest.setSysProtocol(ProtocolType.HTTPS);
// 设备风险识别服务的产品码:device_risk 或 device_risk_pro,详见文档"版本介绍"表格中 Service 参数行
String service = "device_risk";
executeRequestRequest.setService(service);
// 业务参数,按需设置,不需要的参数无需传入
Map<String, Object> serviceParams = new HashMap<String, Object>();
// deviceToken 为必填参数
serviceParams.put("deviceToken", "TK******************");
executeRequestRequest.setServiceParameters(JSONObject.toJSONString(serviceParams));
executeRequestRequest.setAcceptFormat(FormatType.JSON);
try {
ExecuteRequestResponse httpResponse = client.getAcsResponse(executeRequestRequest);
System.out.println("httpResponse:" + JSONObject.toJSONString(httpResponse));
} catch (Exception e) {
e.printStackTrace();
}
验证调用结果
调用 SDK 发起请求后,可通过以下方式验证集成是否成功:
返回
Code=200表示请求成功。
支持的地域
REGION-ID参数需和设备风险 SDK 上报域名对应。
Region | 说明 |
cn-shanghai | 上海(国内默认) |
技术链路说明
完成设备 SDK 集成后,在关键业务环节调用设备风险识别的服务端 API,传入服务字段即可获取风险检测结果。一次风险检测的链路包括以下环节:
初始化 SDK:建议在 APP 启动时异步初始化 SDK,实现基础字段的采集和上报。因系统和机型不同,该过程通常需要 2 秒至 5 秒。
获取设备 Token:调用 SDK 本地方法,获取 deviceToken。
调用服务端 API:将 deviceToken 及其他业务字段传入(参考具体事件定义),云端检测模型计算后实时返回检测结果。
