设备风险识别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、设备风险标签。

{
  "code": 200,
  "message": "OK",
  "data": {
    "extend": "71d4ac517192c5309400548bf0d5357b",
    "tags": "is_rooted,is_emulator"
  },
  "requestId": "AF17EC99-22AB-311E-1397-BCF37EC78C81"
}

设备 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链路图