设备风险识别API接入说明

更新时间:
复制为 MD 格式

在用户注册、登录、领券等关键业务环节,需要检测设备是否存在模拟器、Root、多开等异常风险。本文档介绍如何调用设备风险识别服务(基础版与增强版)获取设备风险检测结果,包含事件参数、返回参数、错误码及 SDK 调用方式。适用于活动防刷、账号安全防护等场景。

版本介绍

为匹配不同行业、企业不同发展阶段的风控需求,设备风险识别分为基础版、增强版,两者的差异对比如下:

功能特性

基础版

增强版

实时计算

支持

支持

服务返回

风险标签

风险标签、设备唯一 ID

日志服务(SLS)投递

不支持

支持,用户可授权进行日志投递,免费存储一年

版本选型建议

  • 基础版:适用于仅需风险标签判定的场景,例如识别设备是否为模拟器、是否 Root 或多开等基础风控需求。

  • 增强版:适用于需要设备唯一 ID 进行跨会话追踪,或需要将日志投递至 SLS 进行深度分析的场景。

前提条件

使用设备风险识别服务前,需满足以下条件:

  1. 已开通设备风险识别服务。

  2. 已获取 AccessKey ID 和 AccessKey Secret。建议使用 RAM 用户进行 API 访问,而非直接使用主账号 AccessKey。

  3. 已完成端侧 SDK 集成。具体操作,参见SDK 接入文档

服务传入参数

Service 参数

Service 参数用于指定调用的服务版本。不同版本对应的 Service 参数值如下:

版本

Service 参数值

基础版

device_risk

增强版

device_risk_pro

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>
<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表示请求成功。

  • 返回Data中包含tags字段,表示设备风险检测结果已正常返回。

支持的地域

REGION-ID参数需和设备风险 SDK 上报域名对应。

Region

说明

cn-shanghai

上海(国内默认)

技术链路说明

完成设备 SDK 集成后,在关键业务环节调用设备风险识别的服务端 API,传入服务字段即可获取风险检测结果。一次风险检测的链路包括以下环节:

  1. 初始化 SDK:建议在 APP 启动时异步初始化 SDK,实现基础字段的采集和上报。因系统和机型不同,该过程通常需要 2 秒至 5 秒。

  2. 获取设备 Token:调用 SDK 本地方法,获取 deviceToken。

  3. 调用服务端 API:将 deviceToken 及其他业务字段传入(参考具体事件定义),云端检测模型计算后实时返回检测结果。

官网文档-设备SDK链路图