顶象设备指纹通过用户上网设备的硬件、网络、环境等特征信息生成设备的唯一标识,覆盖安卓、iOS、Web/H5、公众号、小程序,可有效侦测模拟器、刷机改机、root越狱、劫持注入等风险,配合顶象风控系统使用,可有效对抗设备伪造、自动注册、羊毛党等恶意行为。
名称 | 释义 |
---|---|
AppId | 公钥,长度为32位字符串,接入渠道唯一标识。开通服务后可在设备指纹的二级菜单“应用管理”中获取,AppId在客户端接入时使用。 |
AppSecret | 私钥,长度为32位字符串,与公钥对应,开通服务后可在设备指纹的二级菜单“应用管理”中获取,请妥善保管,勿泄漏给他人 。AppSecret在后台查询设备详情时使用。 |
token | 设备指纹SDK采集上报后返回的标识,token不是设备指纹,通过token可以查询设备指纹 |
hardId | 设备指纹 |
用户前端 | Web端或集成SDK的Android端、iOS端 |
用户后端 | 指企业的后台服务器 |
快速开发使用AppId | 专属AppId |
---|---|
开发测试接口连通可使用: AppId: d7eb51437ed189ae6a42ef3cccf69cec ❌ 缺点:多人共用,无法进行统计数据查询 | 专属AppId请登录获取 ✅ 优点:可以在控制台通过图形化界面 查询统计数据及风险标签 |
单独使用顶象设备指纹服务时的调用过程
点击查看FAQ (https://www.dingxiang-inc.com/docs/preview/detail/const-id-faq)
支持Web接入,支持IE8+、Chrome、Firefox、360浏览器、QQ浏览器等主流浏览器及Android、iOS上的内嵌Webview。引用JS参见Web接入章节
支持Android接入,获取SDK并接入,参见Android接入章节
支持iOS接入,获取SDK并接入,参见iOS接入章节
支持微信小程序接入,接入参见微信小程序接入章节
在页面 HTML 中引入 const-id.js
,代码形如:
<script src="https://cdn.dingxiang-inc.com/ctu-group/constid-js/index.js"></script>
因js文件会定期更新,为避免js失效影响您的使用,请不要将js下载到本地服务器上引入
页面加载后,初始化设备指纹,需要在 JavaScript 中调用 _dx.ConstID(options, callback)
方法获取设备指纹token,代码形如:
var options = {
appId: '【这里填写 AppID】', // 唯一标识,必填
server: 'https://constid.dingxiang-inc.com/udid/c1', // constId 服务接口,可选
userId: '【这里填写 userID】' // 用户标识,可选
};
_dx.ConstID(options, function (err, token) {
if (err) {
// console.log('error: ' + err);
return;
}
// console.log('const-id token is ' + token);
});
同时也支持Promise的用法
_dx.ConstID(options).then(function(token) {
console.log(token)
}).catch(function(err) {
console.log(err)
})
字段 | 类型 | 是否必填 | 说明 |
---|---|---|---|
appId | String | 是 | 当前应用的标识 |
server | String | 否 | constId 服务接口,可选,如不填,则默认会用云服务接口 |
scene | String | 否 | 场景标识,例如 login 、survey 等 |
userId | String | 否 | 业务方的用户唯一标识,例如用户名、用户ID、手机号、Email等 |
timeout | number | 否 | 超时失败时间,单位为毫秒 |
cache | boolean | 否 | 默认为 true,表示会缓存采集结果;改为 false 则每次会重新采集 |
浏览器 | 最低版本 |
---|---|
IE | 8 |
Edge | 20 |
Chrome | 60 |
Safari | 11 |
Firefox | 60 |
360 | 10 |
Sougou | 8 |
4 |
浏览器 | 最低版本 |
---|---|
Chrome | 60 |
UC | 12 |
8 | |
Safari | 11 |
原生 | 安卓4.0及以上 |
条目 | 说明 |
---|---|
开发目标 | Android 4.0+ |
开发环境 | Android Studio 3.0.1 或者 Eclipse + ADT |
CPU架构 | ARM 或者 x86 |
SDK三方依赖 | 无 |
点击下载demo(仅做代码配置演示使用,其中appId请在顶象后台申请,SDK需要替换为链接中下载的SDK)
SDK包集成内容:
Demo工程结构如下
.
├── app
│ ├── build.gradle
│ ├── libs
│ │ └── dx-risk-vx.x.xxr.xxxxxxxx.aar
│ ├── proguard-rules.pro
│ └── src
│ └── main
├── build.gradle
├── gradle
├── gradle.properties
├── gradlew
├── gradlew.bat
└── settings.gradle
android {
packagingOptions {
doNotStrip "**/lib*Risk*.so"
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.aar'])
}
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION"/>
<uses-permission android:name="android.permission.BLUETOOTH"/>
-dontskipnonpubliclibraryclassmembers
-keepattributes *Annotation*,EnclosingMethod
-dontwarn com.dx.mobile.**
-dontwarn *.com.dx.mobile.**
-dontwarn *.com.mobile.strenc.**
-keep class com.dx.mobile.risk.**{*;}
-keep class com.security.inner.**{*;}
-keep class *.com.dx.mobile.**{*;}
-keep class *.com.mobile.strenc.**{*;}
需要动态申请权限如下:
android.permission.WRITE_EXTERNAL_STORAGE
android.permission.READ_EXTERNAL_STORAGE
android.permission.READ_PHONE_STATE
android.permission.ACCESS_COARSE_LOCATION
android.permission.ACCESS_FINE_LOCATION
动态申请代码实例(Activity下):
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_demo);
// 该设置请参考下方 3.1章节中 隐私采集白名单
DXRisk.setAllowPrivacyList(PrivacyFlag.ALL);
// API 23或以上的动态申请权限
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
String[] permissionArray = {
"android.permission.ACCESS_COARSE_LOCATION",
"android.permission.ACCESS_FINE_LOCATION",
"android.permission.ACCESS_BACKGROUND_LOCATION",
"android.permission.WRITE_EXTERNAL_STORAGE",
"android.permission.READ_EXTERNAL_STORAGE",
"android.permission.READ_PHONE_STATE",
};
this.requestPermissions(permissionArray, 1);
}
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
// start getToken
new Thread(new Runnable() {
@Override
public void run() {
HashMap<String, String> params = new HashMap<String, String>();
String token = DXRisk.getToken("appid", params);
}
}).start();
}
采集端的设备指纹信息,上传至风控后台,再由风控后台返回token。 该API为耗时操作,因此必须在非主线程上调用,否则会抛异常。
DXRisk.java
该类是DxRisk SDK的风控组件接口,负责采集本地信息并返回用户前端token。
自v6.1.18r开始,SDK
setup前,可以调用setAllowPrivacyList
进行隐私采集白名单的设置,默认关闭所有涉及隐私规范红线的采集项
public static void setAllowPrivacyList(long privacyFlag)
使用示例
setAllowPrivacyList(PrivacyFlag.ANDROID_ID); //只采集ANDROID_ID
//自定义列表模式
setAllowPrivacyList(PrivacyFlag.X | PrivacyFlag.Y | ...); //表示既采集X又采集Y,X、Y表示具体某项采集的FLAG值,如下表
以下为提供的白名单采集项
FLAG | 描述 |
---|---|
DEFAULT | 默认值,关闭所有隐私采集项 |
ALL | 打开所有隐私采集项 |
IMEI | 加入该FLAG则采集手机IMEI值,否则不采集 |
IMSI | 加入该FLAG则采集手机IMSI值,否则不采集 |
MEID | 加入该FLAG则采集手机MEID值,否则不采集 |
SERIAL_NUMBER | 加入该FLAG则采集手机SERIAL_NUMBER值,否则不采集 |
MAC_ADDRESS | 加入该FLAG则采集手机MAC_ADDRESS值,否则不采集 |
ICCID | 加入该FLAG则采集手机ICCID值,否则不采集 |
ANDROID_ID | 加入该FLAG则采集手机ANDROID_ID值,否则不采集 |
DEVICE_ID | 加入该FLAG则采集手机DEVICE_ID值,否则不采集 |
GET_INSTALLED_PACKAGES | 加入该FLAG则采集手机的应用安装列表,否则不采集 |
SDK
使用前必须调用先setup
,setup
主要用于数据/环境初始化,一般在Application
的onCreate
下调用:
/**
* 初始化参数,环境
* @param context
* @return
*/
public static boolean setup(Context context)
PS:下列两种方式获取token在网络通畅的情况下没有任何的不同。
/**
* @return token 通常返回长度为40的字符串。在网络卡顿或不通的情况下,返回4-5k的字符串。
* @throws DXRiskErrorException 如在主线程调用本API,或者appId为空等等,则会抛出该异常
*/
public static String getToken(String appId, HashMap<String, String> paramsMap) throws DXRiskErrorException
获取轻量级Token可获取的设备信息信息远少于getToken(),可能会造成在判断设备是否有风险时出现较大误差,请谨慎使用。
/**
`* @return token 通常返回长度为40的字符串。在网络卡顿或不通的情况下,返回1k的字符串。
`* @throws DXRiskErrorException 如在主线程调用本API,或者appId为空等等,则会抛出该异常
*/
public static String getLightToken(String appId, HashMap<String, String> paramsMap) throws DXRiskErrorException
建议Application.onCreate
下调用
@Override
public void onCreate() {
super.onCreate();
// 环境初始化
DXRisk.setup(this);
}
整个过程由于是耗时操作,必须要在非主线程上执行,否则会crash
new Thread(){
@Override
public void run() {
/* 私有化配置 */
HashMap<String, String> params = new HashMap<String, String>();
// 这里请填写对应的服务端url,注意SAAS和私有化的区别
params.put(DXRisk.KEY_URL, "https://constid.dingxiang-inc.com");
// 开启线上数据备份
// params.put(DXRisk.KEY_BACKUP, DXRisk.VALUE_ENABLE_BACKUP);
// 设置请求token超时时长ms,不设置默认为500ms
params.put(DXRisk.KEY_DELAY_MS_TIME, "2000");
//此配置关闭SDK缓存,表示每次调用接口都是强制采集信息
// params.put("PRIVATE_CLEAR_TOKEN", "clear");
// 开通服务后可在应用管理菜单中获取;私有化版本请填写私有化appId
String appId = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
// 获取设备指纹token
final String token = DXRisk.getToken(appId, params);
// TODO 把token通过Post请求,传到用户后端
}
}.start();
在获取token过程中,如果因为网络超时或者加解密失败,该接口有可能会返回为null,同时会输出tag为DXRISK的错误信息,具体描述如下:
DXRISK_REQUEST_NETWORK_ERR -1001 //网络链接失败
DXRISK_REQUEST_DECRYPT_ERR -1002 //数据解密错误
DXRISK_REQUEST_UNCOMPRESS_ERR -1003 //解压错误
DXRISK_REQUEST_RESPONSE_EMPTY_ERR -1004 //返回为空
DXRISK_REQUEST_DATA_PARSE_ERR -1005 //数据解析失败
DXRISK_REQUEST_DIRTY_DATA_ERR -1006 //脏数据
DXRISK_CONST_ID_EMPTY -1007 //constid为空
如果出现上述错误信息,请联系顶象技术人员。
条目 | 说明 |
---|---|
兼容平台 | iOS 8.0+ |
开发环境 | XCode 4.0 + |
CPU架构 | armv7, arm64, i386, x86_64 |
SDK依赖 | libz, libresolv, libc++ , SystemConfiguration.framework , CoreLocation.framework , CoreTelephony.framework |
点击下载指纹SDK,SDK的目录结构如下:
DXRisk.framework,
DXRiskWithIDFA.framework,
DXRiskStatic.framework,
DXRiskStaticWithIDFA.framework`其中之一直接拖入工程目录中,或者右击总文件夹添加文件。
DXRiskWithIDFA.framework
或者 DXRiskStaticWithIDFA.framework
,该版本可以提供更精准的tokenDXRisk.framework
或者 DXRiskStatic.framework
若在项目中添加DXRisk.framework
或者DXRiskWithIDFA.framework
其中之一,选择Target
-> General
,在Frameworks,Libraries,and Embedded Content
中,将DXRisk.framework
或者DXRiskWithIDFA.framework
对应的 Embed 切换到Embed & Sign。如下图:
若在项目中添加DXRiskStatic.framework
或者DXRiskStaticWithIDFA.framework
其中之一,需要在Build Settings -> Other Linker Flags 设置 -ObjC 如下图:
以下的操作仅限导入DXRisk.framework ,DXRiskWithIDFA.framework动态库
此步骤主要是解决上传Store架构不符合的问题,如项目中已配置过Carthage
或有其他相关的打包Framework调整脚本,可略过此步自行调整 选择Target
-> Build Phases
,点击+
按钮,添加如下脚本:
APP_PATH="${TARGET_BUILD_DIR}/${WRAPPER_NAME}"
# This script loops through the frameworks embedded in the application and
# removes unused architectures.
find "$APP_PATH" -name '*.framework' -type d | while read -r FRAMEWORK
do
FRAMEWORK_EXECUTABLE_NAME=$(defaults read "$FRAMEWORK/Info.plist" CFBundleExecutable)
FRAMEWORK_EXECUTABLE_PATH="$FRAMEWORK/$FRAMEWORK_EXECUTABLE_NAME"
echo "Executable is $FRAMEWORK_EXECUTABLE_PATH"
EXTRACTED_ARCHS=()
for ARCH in $ARCHS
do
echo "Extracting $ARCH from $FRAMEWORK_EXECUTABLE_NAME"
lipo -extract "$ARCH" "$FRAMEWORK_EXECUTABLE_PATH" -o "$FRAMEWORK_EXECUTABLE_PATH-$ARCH"
EXTRACTED_ARCHS+=("$FRAMEWORK_EXECUTABLE_PATH-$ARCH")
done
echo "Merging extracted architectures: ${ARCHS}"
lipo -o "$FRAMEWORK_EXECUTABLE_PATH-merged" -create "${EXTRACTED_ARCHS[@]}"
rm "${EXTRACTED_ARCHS[@]}"
echo "Replacing original executable with thinned version"
rm "$FRAMEWORK_EXECUTABLE_PATH"
mv "$FRAMEWORK_EXECUTABLE_PATH-merged" "$FRAMEWORK_EXECUTABLE_PATH"
done
在iOS 12的环境最好在Capabilities->Access WiFi Information 进行开启操作,这样方便设备指纹数据采集。
// 风控组件:DXRiskManager类
@interface DXRiskManager : NSObject
// 字符串常量
extern NSString* const DXRiskManagerKeyUserId;
extern NSString* const DXRiskManagerKeyEmail;
extern NSString* const DXRiskManagerKeyPhone;
extern NSString* const DXRiskManagerKeyUserExtend1;
extern NSString* const DXRiskManagerKeyUserExtend2;
extern NSString* const DXRiskManagerKeyURL;//私有化服务器地址
extern NSString* const DXRiskManagerKeyBackup;//私有化下使用,将数据备份到顶象服务器(开启为DXRiskManagerKeyBackupEnable 值)
extern NSString* const DXRiskManagerKeyBackupAppId; // 私有化下使用,指定数据备份到顶象服务器的AppId
extern NSString* const DXRiskManagerKeyDegradeNotify;//数据降级通知,若打开,服务端会有响应的降级统计
extern NSString* const DXRiskManagerKeyCountry;//国家地区设置,默认中国
extern NSString* const DXRiskManagerKeyDelayMsTime; //可填设置请求超时毫秒时间(默认值为 500 ,范围是:【100 : 3000】)
// NoticeDegrade参数
/* The NoticeDegrade Value. This value only be used pair with key:DXRiskManagerKeyDegradeNotify to notify token degrade. */
extern NSString* const DXRiskManagerKeyDegradeNotifyEnable;
// Backup参数
/* The Backup Value. This value only be used pair with key:DXRiskManagerKeyBackup to set data backup. */
extern NSString* const DXRiskManagerKeyBackupEnable;
// Country参数
/* The Country Value. This value only be used pair with key:DXRiskManagerKeyCountry to set country. */
extern NSString* const DXRiskManagerCountryChina;
/* The Country Value. This value only be used pair with key:DXRiskManagerKeyCountry to set country. */
extern NSString* const DXRiskManagerCountryIndonesia;
/**
采集端的设备指纹信息,上传至风控后台,再由风控后台返回token。
该API为耗时操作,因此必须在非主线程上调用。
@param appId appId 开通服务后可在二级菜单“应用管理”中获取
@param extendsParams 配置项
@return token
*/
+ (NSString *)getToken:(NSString *)appId extendParams:(NSDictionary *)extendsParams;
/**
DXRiskManager -- 初始化方法
*/
+ (BOOL)setup;
@end
// 整个过程由于是耗时操作,必须要在非主线程上执行,否则会阻塞UI。如果本身已经在非UI线程上执行,则不需要另开线程
dispatch_queue_t dxrisk_queue = dispatch_queue_create("com.dingxiang.dxrisk", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(dxrisk_queue, ^{
NSMutableDictionary *dic = [NSMutableDictionary dictionary];
// 根据业务逻辑,填充自定义字段
[dic setObject:@"123456" forKey:DXRiskManagerKeyUserId];
// 如需设置海外服务器, 可选值请参考头文件字段
[dic setObject:DXRiskManagerServiceAreaSoutheastAsia forKey:DXRiskManagerKeyServiceArea];
// 如需自定义服务端URL,填充DXRiskManagerKeyURL字段(私有化部署的情况)
// 如有需要则添加DXRiskManagerKeyBackup参数,Value固定为DXRiskManagerKeyBackupEnable
// DXRiskManagerKeyBackupAppId参数可不填,参数为顶象备份数据库提供的备份Appid
[dic setObject:@"http://xxxxxxx" forKey:DXRiskManagerKeyURL];
// [dic setObject:DXRiskManagerKeyBackupEnable forKey:DXRiskManagerKeyBackup];
[dic setObject:@"xxxxxxxxxxxxxxxxxxxx" forKey:DXRiskManagerKeyBackupAppId];
// 此配置关闭SDK缓存,表示每次调用接口都强制采集信息
// [dic setObject:@"clear" forKey:@"PRIVATE_CLEAR_TOKEN"];
// 获取token
// 注意:token最好不要保存在某个局部变量或者字段,每次使用时,都通过API获取。
BOOL isSuccess = [DXRiskManager setup];
NSLog(@"setup success: %@" , isSuccess ? @"YES":@"NO");
NSString *constID = [DXRiskManager getToken:@"xxxxxxxxxxxxxxxxxxxx" extendsParams:dic];
NSLog(@"constID: %@", constID);
// TODO 把constid通过Post请求,传到业务后台。
// 下面是模拟频繁调用的过程
while(TRUE) {
NSLog(@"constID: %@", [DXRiskManager getToken:@"xxxxxxxxxxxxxxxxxxxx" extendsParams:dic]);
[NSThread sleepForTimeInterval:.5];
}
});
在获取token
过程中,如果因为网络超时或者加解密失败,该接口有可能会返回为null,同时会输出tag为DXRISK
的错误信息,具体描述如下:
DXRISK_REQUEST_NETWORK_ERR -1001 //网络链接失败
DXRISK_REQUEST_DECRYPT_ERR -1002 //数据解密错误
DXRISK_REQUEST_UNCOMPRESS_ERR -1003 //解压错误
DXRISK_REQUEST_RESPONSE_EMPTY_ERR -1004 //返回为空
DXRISK_REQUEST_DATA_PARSE_ERR -1005 //数据解析失败
DXRISK_REQUEST_DIRTY_DATA_ERR -1006 //脏数据
DXRISK_CONST_ID_EMPTY -1007 //constid为空
如果出现上述错误信息,请联系顶象技术人员。
请注意选择对应的版本,下载完成后放到本地项目中。
未注册用户可在顶象官网进行账号注册,创建应用获取应用密钥AppID和AppSecret。
const ConstId = require('本地设备指纹js存放路径')
Page({
onLoad: function () {
new ConstId({
appId: '【这里填写在顶象官网申请到的 AppID】', // 唯一标识,必填
server: 'https://host/udid/w1' // 服务接口地址,请注意私有化客户填写自有域名
}, (e, id) => {
if (e) {
console.log(e)
return
}
console.log('constId:', id)
})
}
})
https://constid.dingxiang-inc.com
,私有化用户配置本地部署域名,测试阶段可以开启微信开发者工具右上角详情->本地设置->“不校验域名”。接入方式和微信小程序类似,但是使用的SDK不一样。如有需要,请联系客服获取。
const ConstId = require('本地设备指纹js存放路径')
Page({
onLoad: function () {
new ConstId({
appId: '【这里填写在顶象官网申请到的 AppID】', // 唯一标识,必填
server: 'https://host/udid/w1' // 服务接口地址,请注意私有化客户填写自有域名
}, (e, id) => {
if (e) {
console.log(e)
return
}
console.log('constId:', id)
})
}
})
接口详细描述: 根据token,appId,sign三个参数获得设备信息
<dependency>
<groupId>com.dingxiang-inc</groupId>
<artifactId>ctu-client-sdk</artifactId>
<version>2.6</version>
</dependency>
public class ConstantIdDemo {
//顶象控制台,设备指纹菜单应用管理里面获取
private static String appId = "0091a3xxxxxxxxxx557fac67b2f5afb";
private static String appSecret = "e38dxxxxxxxxx6807c9e1edebaa2836";
public static void main(String[] args) throws IOException {
// 填写设备指纹域名或者url如:http://127.0.0.1:8080
CtuConstidClient client = new CtuConstidClient("https://constid.dingxiang-inc.com", appId, appSecret);
//设备指纹
String result = client.getDeviceInfo("62c5013cel9o4xxxxxxxxxtTtKW5BwWtQq9u1f1");
System.out.println(JSON.toJSON(result));
}
}
使用示例
class Demo {
// 根据实际情况填写
const appKey = "你的AppID";
// 根据实际情况填写
const appSecret = "你的AppSecret";
// 根据实际情况填写
const token = "SDK里面获取到的token";
}
// 根据token获取设备详细信息工具类
$requestHandle = new DeviceFingerprintHandle();
// 设置请求超时时间。因为存在设备指纹降级和网络抖动的情况,默认2秒。可以根据实际情况调整
// $requestHandle->setTimeout(2);
// 填写设备指纹域名或者url入:http://127.0.0.1:9090
$responseData = $requestHandle->getDeviceInfo("https://constid.dingxiang-inc.com/udid/api/getDeviceInfo",
Demo::appKey, Demo::appSecret, Demo::token);
$result = json_decode($responseData, true);
// 请求状态码。非 200 表示没有获取到设备明细信息
if ($result['stateCode'] == 200)
echo "设备明细信息如下: : " . json_encode($result['data'], true);
else
echo $result['message'];
npm i dx-const-id-sdk --save
const SDK = require('dx-const-id-sdk')
const sdk = new CaptchaSDK({
appId: '您的appId',
appSecret: '您的appSecret'
})
sdk.getDeviceInfo(token).then((data) => {
console.log(data)
}).catch(err => {
console.log('获取设备信息失败')
})
字段 | 类型 | 描述 |
---|---|---|
appId | String | 当前应用的标识 |
sign | String | sign = MD5(appSecret + token + appSecret),AppSecret为appId对应的密钥 |
token | String | 用户前端获取的token |
字段 | 类型 | 描述 |
---|---|---|
stateCode | int | 状态码 |
message | String | 状态描述 |
data | Json | 返回设备信息及设备风险检测数据 |
{
"stateCode": 200,
"message": "请求响应成功",
"data": {
"hardId": "22e38229a7eda501c58bf3ddee1a340a",
......
}
}
字段 | 类型 | 描述 |
---|---|---|
stateCode | int | 状态码 |
message | String | 状态描述 |
data | Json | 异常时数据为空 |
{
"stateCode": -10002,
"message": "签名为空或验证失败",
"data": null
}
错误码 | 描述 |
---|---|
-10001 | appId不存在或已经过期 |
-10002 | 签名为空或验证失败 |
-10003 | token为空或没有对应的设备信息 |
-10004 | token已经过期 |
-10005 | 服务器内部异常 |
-10006 | 证书已经失效 |
-10007 | 服务器限流 |
字段名 | 字段描述 | 说明 |
---|---|---|
token | 设备token | 默认返回 |
hardId | 设备指纹 | 默认返回 |
字段名 | 字段描述 | 说明 |
---|---|---|
token | 设备token | 默认返回 |
hardId | 设备指纹 | 默认返回 |
字段名 | 字段描述 | 说明 |
---|---|---|
token | 设备token | 默认返回 |
deviceType | 设备类型 | 默认返回 |
hardId | 设备指纹 | 默认返回 |
producter | 生产厂商 | 默认返回 |
macAddress | mac地址 | 默认返回 |
isEmulator | 模拟器运行 | 默认返回 |
isRoot | 是否root | 默认返回 |
isMultirun | 是否多开 | 默认返回 |
isInject | 是否存在注入风险 | 默认返回 |
isMemdump | 是否存在内存dump风险 | 默认返回 |
isDebug | 是否存在调试风险 | 默认返回 |
isHook | 是否存在hook风险 | 默认返回 |
isJailBreak | 是否越狱 | 默认返回 |
isVpn | 是否使用vpn | 默认返回 |
isProxy | 是否使用代理 | 默认返回 |
isSimulateGPS | 是否篡改GPS | 默认返回 |
isCloudPhone | 是否云真机 | 默认返回 |
... | ... | 更多字段请联系售后 |
字段名 | 字段描述 | 说明 |
---|---|---|
token | 设备token | 默认返回 |
deviceType | 设备类型 | 默认返回 |
hardId | 设备指纹 | 默认返回 |
canvasId | canvas指纹 | 默认返回 |
webGl | WebGl指纹 | 默认返回 |
resolution | 设备分辨率 | 默认返回 |
isLiedBrowser | 是否伪造浏览器 | 默认返回 |
isCookieDisabled | 是否禁用cookie | 默认返回 |
isTamperUa | 是否篡改浏览器ua | 默认返回 |
isTamperRes | 是否篡改分辨率 | 默认返回 |
isTamperCd | 是否篡改浏览器颜色深度 | 默认返回 |
isEmulator | 是否模拟器 | 默认返回 |
... | ... | 更多字段请联系售后 |
建议在集成了SDK的app中增加《隐私政策声明》,来规避风险。并在客户同意隐私政策后,进行sdk的调用,示例如下:
一、我们如何收集和使用个人信息
个人信息是指以电子或者其他方式记录的能够单独或者与其他信息结合识别特定自然人身份或者反映特定自然人活动情况的各种信息。我们深知个人信息对您的重要性,您的信赖对我们非常重要,我们将严格遵守法律法规要求采取相应的安全保护措施,致力于保护您的个人信息安全可控。我们仅会出于本政策所述的以下目的,收集和使用您的个人信息:
1. 当您使用XXX产品及相关服务时,为了保障软件与服务的正常运行,我们会收集您的硬件型号、操作系统版本号、国际移动设备识别码(IMEI)、网络设备硬件地址(MAC)、IP 地址、软件版本号、网络接入方式及类型、操作日志等信息。请您了解,这些信息是我们提供服务和保障产品正常运行所必须收集的基本信息。
所属系统 | 第三方 | 第三方收集个人信息目的 | 第三方收集个人信息范围 | 第三方收集个人信息方式 |
---|---|---|---|---|
iOS | 顶象设备指纹SDK | 标识设备,保障账号及交易安全 | 设备版本、系统版本、生成ID、手机样式、手机名 | 自动收集,在启动APP、初始化SDK时进行收集 |
Android | 顶象设备指纹SDK | 标识设备,保障账号及交易安全 | 设备版本、系统版本、生成ID、手机样式、手机名、iccid、bssid、MAC地址、IMSI、IMEI | 自动收集,在启动APP、初始化SDK时进行收集 |
2. Cookie和同类技术的服务 Cookie和同类设备信息标识技术是互联网中普遍使用的技术。当您使用我们的服务时,我们可能会使用相关技术向您的设备发送一个或多个 Cookie 或匿名标识符(以下简称“Cookie”),以收集、标识和存储您访问、使用本产品时的信息。我们承诺,不会将Cookie 用于本隐私政策所述目的之外的任何其他用途。我们使用 Cookie 主要为了保障产品与服务的安全、高效运转,排查崩溃、延迟的相关异常情况,帮助您省去重复您填写表单、输入搜索内容的步骤和流程。 同时,我们可能会利用 Cookie 向您展示您可能感兴趣的信息或功能,并优化您对广告的选择。大多数浏览器均为用户提供了清除浏览器缓存数据的功能,您可以进行相应的数据清除操作,或可修改对Cookie的接受程度或拒绝我们的Cookie。您可能因为这些修改,无法使用依赖于Cookie的服务或相应功能。
附:相关定义 个人信息:以电子或者其他方式记录的与已识别或者可识别的自然人有关的各种信息,不包括匿名化处理后的信息。 设备信息:包括设备标识符(IMEI、IDFA、Android ID、MAC、OAID、IMSI及其他设备相关信息)、设备参数及系统信息(设备类型、设备型号、操作系统及硬件相关信息),设备网络环境信息(IP地址,WiFi信息,基站信息及其他网络相关信息)。以产品实际采集情况为准。
二、我们如何保护您的个人信息
(一)我们已使用符合业界标准的安全防护措施保护您提供的个人信息,防止数据遭到未经授权访问、公开披露、使用、修改、损坏或丢失。我们会采取一切合理可行的措施,保护您的个人信息。例如,在您的浏览器与“服务”之间交换数据时受 SSL 加密保护;我们同时对我们网站提供 https 安全浏览方式;我们会使用加密技术确保数据的保密性;我们会使用受信赖的保护机制防止数据遭到恶意攻击;我们会部署访问控制机制,确保只有授权人员才可访问个人信息;以及我们会举办安全和隐私保护培训课程,加强员工对于保护个人信息重要性的认识。
(二)我们会采取一切合理可行的措施,确保未收集无关的个人信息。我们只会在达成本政策所述目的所需的期限内保留您的个人信息,除非需要延长保留期或受到法律的允许。
(三)互联网并非绝对安全的环境,而且电子邮件、即时通讯、及与其他我们用户的交流方式并未加密,我们强烈建议您不要通过此类方式发送个人信息。请使用复杂密码,协助我们保证您的账号安全。
(四)互联网环境并非百分之百安全,我们将尽力确保或担保您发送给我们的任何信息的安全性。如果我们的物理、技术、或管理防护设施遭到破坏,导致信息被非授权访问、公开披露、篡改、或毁坏,导致您的合法权益受损,我们将承担相应的法律责任。
(五)在不幸发生个人信息安全事件后,我们将按照法律法规的要求,及时向您告知:安全事件的基本情况和可能的影响、我们已采取或将要采取的处置措施、您可自主防范和降低风险的建议、对您的补救措施等。我们将及时将事件相关情况以邮件、信函、电话、推送通知等方式告知您,难以逐一告知个人信息主体时,我们会采取合理、有效的方式发布公告。 同时,我们还将按照监管部门要求,主动上报个人信息安全事件的处置情况。
文档版本: 989d7b54