设备风险识别API接入说明

更新时间:
复制 MD 格式

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

版本介绍

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

功能特性

基础版

增强版

实时计算

支持

支持

服务返回

风险标签

风险标签、设备唯一 ID

日志服务(SLS)投递

不支持

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

版本选型建议

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

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

前提条件

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

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

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

  3. 已完成 AccessKey ID 的授权(授予 AliyunYundunSAFFullAccess 权限)。具体操作,参见风险识别系统权限策略参考

  4. 已完成端侧 SDK 集成。

技术链路说明

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

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

  2. 获取设备 Token:待初始化完成后,调用 SDK 本地方法,获取 deviceToken。

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

官网文档-设备SDK链路图

服务传入参数

Service 参数

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

版本

Service 参数值

功能特性

基础版

device_risk

支持风险标签

增强版

device_risk_pro

支持设备唯一 ID、风险标签、日志投递

ServiceParameters 参数

ServiceParameters 为具体的业务请求参数,为 JSON 格式,对应公共参数ServiceParameters字段。以下为设备风险识别服务(含基础版、增强版)需传入的请求参数。

字段名称

字段描述

数据格式

样例数据

是否必填

备注说明

deviceToken

通过SDK Android 接入获取 deviceToken

String

Tk9SSUQuMS*********************ZDNmNWY5NzQxOW1oLTE2MjI2NDIyNjc4MzAtZGZWFhdDgzMTBLUlVSU0VoWWVNcW82ZkZlZWmp3PT0=

正常情况下 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", // 设备唯一ID
    "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 调用方式

以下以 Java SDK 接入为例,更多编程语言的接入方式,参见API 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(
    "<REGION-ID>", // REGION-ID(地域 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(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
String service = "device_risk_pro";
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 上报域名对应,国内推荐 cn-shanghai。

Region

说明

cn-shanghai

上海(推荐)

常见问题

关于设备风控服务接入的常见问题,请参见设备风控服务接入常见问题