Java接入教程

2023.06.06 17:09:57

    隐私说明

    请参照网易易盾隐私政策,请将易盾隐私政策链接放到应用“用户协议”中。

    接入说明

    接入 “智能风控” SDK,开发者需要完成以下步骤:

    1. 根据应用/游戏开发平台,将SDK拷贝到指定的工程目录,并修改项目配置;
    2. 接入风控SDK必接接口,根据业务需求接入建议接口;
    3. 测试风控SDK接入是否正确;
    4. 验证风控SDK功能效果;
    5. 按业务常规发版流程进行测试与发版
    

    应用必须接入:

    游戏必须接入: 不建议使用JAVA接入,若用JAVA接入需要联系技术支持,配置相应保护项,保障接口安全

    建议接入:

    接入步骤

    SDK 涉及到以下文件:

    nethtprotect.jar
    libNetHTProtect.so
    assets/motion/xxx.so
    

    注意:

    打包出来的 apk,必须包含 lib/xxx/libNetHTProtect.so 与 assets/motion/ 下的所有so文件。

    导入SDK

    (1)以 Android Studio 为例,将获取到的 SDK 的 aar 文件放到工程中的 libs 文件夹下,然后在 APP 的 build.gradle 文件中增加如下代码:

    repositories {
        flatDir {
            dirs 'libs'
        }
    }
    

    (2)在 build.gradle 配置文件的 dependencies 依赖中增加对 aar 包的引用(x.x.x 表示版本号,请联系技术支持确认最新的版本号):

    dependencies {
        implementation (name:'HTProtectLib-x.x.x', ext:'aar')
    }
    

    (3) 如果适用的 Android Studio 版本为 7.0 及以上,将 aar 文件放到工程中的 libs 文件夹后,只需要在 build.gradle 文件中增加如下代码:

    dependencies {
        implementation files('libs/HTProtectLib-x.x.x.aar')
    }
    

    (4)对于其他情况,可参考谷歌官方说明,地址为: https://developer.android.com/studio/build/dependencies?hl=zh-cn#dependency-types

     

    (5)添加远程依赖 (sdk版本5.3.3以及更高版本不需要执行此步骤)

    dependencies {
        implementation 'io.github.yidun:base-core:1.1.3'
        implementation  'io.github.yidun:crashreport:1.0.3.1'
    }
    

    过滤需要的 ABI

    SDK 提供了 armeabi、armeabi-v7a、x86、arm64-v8a 四种 ABI 的支持,默认会导出这四种 ABI。

    注意:

    • 如果应用/游戏本身不支持这么多 ABI,就需要对最终导出的 ABI 进行过滤,不然会 crash;
    • 如果 APP 只需要支持特定的 ABI,比如 armeabi,armeabi-v7a、x86 三种,可以在 build.gradle 添加如下配置:
    defaultConfig {
        applicationId "com.XX.XXX"
        minSdkVersion XX
        targetSdkVersion XX
        versionCode XX
        versionName "X.X.X"
        ndk {
            abiFilters "armeabi", "armeabi-v7a", "x86"
        }
    }
    

    添加权限信息

    SDK 不会申请任何权限,但是为了提升风控的效果,建议在 AndroidMenifest.xml 文件中添加下列权限配置:

        <!--网络通信-->
        <uses-permission android:name="android.permission.INTERNET"/>
        <!--获取设备信息-->
        <uses-permission android:name="android.permission.READ_PHONE_STATE" />
        <!--获取MAC地址-->
        <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
        <!--获取网络状态-->
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
        <!--若targetSdkVersion>=30,则需要增加以下权限,否则会影响SDK功能-->
        <queries>
            <intent>
                <action android:name="android.intent.action.MAIN"/>
            </intent>
        </queries>
    

    添加 ProGuard 配置

    若使用 ProGuard 进行混淆,需要将 SDK 使用的类排除掉。若使用 Android Studio 开发,则在 proguard-rules.pro 文件中添加如下信息:

     -keep class com.netease.htprotect.**{*;}
    

    添加远程依赖

    dependencies {
        implementation 'io.github.yidun:base-core:1.1.3'
        implementation  'io.github.yidun:crashreport:1.0.3.1'
    }
    

    注:该远程依赖必须添加,否则调用init会崩溃,sdk版本5.3.3以及更高版本不需要执行此步骤。

    SDK 接入调用说明

    SDK 初始化接口(init)

    接口用途:

    用于初始化智能风控 SDK。

    接入须知:

    1. 使用其他接口之前,必须先调用初始化接口(init),建议在应用/游戏启动过后第一时间调用(初始化后,并不会获取任何个人隐私相关信息);
    2. 该接口为 必须调用接口

    函数原型:

    public static void init(Context context, String productId, HTPCallback callback, HTProtectConfig config);
    

    参数说明:

    参数 说明 应用必要性 游戏必要性
    context 当前环境的上下文 必填 必填
    productId 易盾HTP分配的productId,可登录易盾后台获取 必填 必填
    callback 初始化是否成功的回调函数 可选,不需要可填null 必填
    config 配置类的对象 可选,不需要可填null 可选,不需要可填null

    配置类HTProtectConfig设置:

    (1) 设置服务器归属地
    public void setServerType(int serverType)
    

    智能风控默认上报的服务器为中国大陆的服务器,若需要更改服务器归属地,可以调用该接口进行配置,支持的类型如下:

    参数 赋值 说明
    serverType 1 中国大陆地区,默认为该值,无须设置
    serverType 2 中国台湾地区
    serverType 3 海外地区
    (2) 设置渠道信息
    public void setChannel(String channel)
    

    若需要传递当前应用包体来源渠道可调用该接口(比如:应用宝渠道编号/信息)。

    (3) 设置额外数据
    public void setExtraData(String key, String value)
    

    若需要客户端传递额外信息给易盾,可调用该接口,支持多次调用,但必须在 init 之前设置。

    (4) 设置 gameKey
    public void setGameKey(String gameKey)
    

    主要跟安全通信的接口相关联,用于游戏类型应用,非游戏类型应用或不需要可以忽略。

    gameKey主要用于以下接口:

    • 数据校验
    • 存档加解密
    • 心跳系统

    回调接口:

    回调函数的定义如下:

    public interface HTPCallback {
        void onReceive(int paramInt, String paramString);
    }
        // 如果code == 200,说明反外挂一切正常
        // 如果code == 400,请将 msg 发送到贵方服务端,由贵方服务端通过[getConfig接口](https://support.dun.163.com/documents/761315885761396736?docId=771983453572567040)转发给易盾服务端,由易盾服务端响应
        // 易盾服务端返回结果,再将结果通过 通用查询接口(Cmd_SetConfigData) 反馈给反外挂sdk
        // HTProtect.ioctl(RequestCmdID.Cmd_SetConfigData, configData); // responseData为易盾服务端返回的数据
    

    如需要示例 demo 请联系易盾获取。

    示例代码:

    ....
    import com.netease.htprotect.HTProtect;       // 调入sdk的接口类
    ....
    
    public class MainActivity extends AppCompatActivity {
    
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    		....
            Context mContext = getApplicationContext();
            
            HTProtectConfig config = new HTProtectConfig();
            config.setGameKey("xxxxxxxxxxxxxxx");   // 设置gamekey,具体值请联系易盾客服
            config.setServerType(2);				// 设置数据上报的服务器归属地,应用/游戏根据自身发行地区来控制
            config.setChannel("testchannel");		// 设置渠道信息
            config.setExtraData("111","2222");		// 设置额外数据
            config.setExtraData("3333","4444");		// 设置额外数据
            
            HTPCallback callback = new HTPCallback() {
            	@Override
           	    public void onReceive(int paramInt, String paramString) {
                	Log.d("Test", "code is:" + paramInt + " String is:" + paramString);
                    // paramInt返回200说明初始化成功
                }
            };
            HTProtect.init(mContext, "易盾提供的产品id", callback, config);  //调用sdk初始化接口init函数
    		....
        }
    
    }
    

    设置用户信息接口(setRoleInfo)

    接口用途:

    将用户账号、角色ID,角色名称等设置到风控SDK中,用于标识账号信息,以便对有恶意、风险行为的用户/角色进行相应的处置。同时,开启异常监控定时和立即上报,以实时监测风险行为和异常情况,及时进行预警和处置,保障系统安全。

    接口须知:

    1. 须在 SDK 初始化用户同意隐私政策后才能调用该接口
    2. 凡是涉及用户登录或者切换角色的地方,均需要调用该接口设置或者更新用户/玩家信息。

    函数原型:

    public static int setRoleInfo(String businessId, String roleId, String roleName, String roleAccount, String roleServer, int serverId,String gameJson);
    

    参数说明:

    参数 说明 应用必要性 游戏必要性
    businessId 当前业务 ID 必填 必填
    roleId 用户/玩家的角色 ID,非游戏类型应用,roleId 可以与 roleAccount 相同 可选,不需要可填null 必填
    roleName 用户/玩家的角色名称,非游戏类型应用,roleName 可以是当前用户昵称相同 可选,不需要可填null 可选,不需要可填null
    roleAccount 用户/玩家的账号,如业务方同时接入易盾反垃圾,则此账号需要与反垃圾接入中的account一致 必填 必填
    roleServer 用户/玩家的角色的服务器名称 可选,不需要可填null 可选,不需要可填null
    serverId 用户/玩家的角色所属服务器的 ID 可选,不需要可填null 可选,不需要请传入-1
    gameJson 游戏类型应用需要上传的信息,对应一个 json 字符串 可选,不需要可填null 可选,不需要可填null

    gameJson 字段说明:

    key 名称 key 类型 key 值 必要性 说明
    游戏版本号 String GameVersion 可选,不需要可填null 游戏版本号
    资源文件版本 String AssetVersion 可选,不需要可填null 游戏类型应用的资源文件版本号

    示例代码:

    JSONObject object = new JSONObject();
    object.put("GameVersion","1.0.1");
    object.put("AssetVersion","1.0.1");
    HTProtect.setRoleInfo("易盾提供的业务id","123456","易小盾","yd@163.com", "游戏测试服",123,object.toString());   
    

    函数返回:

    函数返回 int 类型,可能出现的值如下:

    说明
    0 成功
    -201 未初始化
    -203 businessId 不合法

    登出接口(logOut)

    接口用途:

    为了更好的统计该用户/玩家角色在本次登录后的行为,精准标识和打击有恶意行为的用户/玩家。

    接入须知:

    1. 须在 设置用户信息接口接口被调用后方可调用,在用户/玩家退出当前角色(包括切换角色)或者退出游戏时调用接口。
    2. 此接口主要用于判断用户/玩家本次生命周期,不强制要求接入。
    3. 如果未调用初始化,此接口默认为空,不会执行任何逻辑。

    函数原型:

    public static void logOut();
    

    示例代码:

    HTProtect.logOut();    
    

    同步获取凭证(getToken)

    接口用途:

    用于关键业务节点风险防控场景中,比如注册、登录、领券、抽卡、兑换、点赞、评论等业务场景。业务方可通过此接口,获取检测唯一凭证 token。业务服务端通过此凭证实时获取当前用户/玩家风险检测结果,并根据结果进行处置。

    接口适用场景为:
    1、游戏类应用,当 SDK 数据上报接口被屏蔽导致数据上报失败时,通过 getToken 接口获取 SDK 采集信息,并由客户服务端传递给易盾服务器;
    2、全类型应用,在关键业务节点主动调用检测时,通过 getToken 接口获取检测凭证,由客户服务端通过 token 凭证从易盾服务器查询检测结果。
    

    接入须知:

    1. 须在 SDK 初始化且用户同意隐私政策后才能调用该接口,网易易盾隐私说明
    2. 内部存在网络请求,只允许在子线程上调用

    函数原型:

    public static AntiCheatResult getToken(int timeout, String businessId)
    

    参数说明:

    参数 说明 必要性
    timeout 函数超时时间 必填,单位毫秒,[100,10000],此区间外的默认为3000
    businessId 业务 ID 必填,由易盾后台分配,并在官网“服务管理”中查询

    返回值:

    AntiCheatResult类说明:

    package com.netease.htprotect.result;
    
    public class AntiCheatResult {
    
        public String token;
        public int code;
        public String codeStr;
        public String businessId;
    }
    

    变量说明:

    变量 说明
    code 结果码,不同结果码含义如下:200:表示调用成功,其他结果码均表示调用失败;201:SDK未初始化;202:在主线程运行;203:businessId不合法;204:其他情况
    codeStr 结果码对应的字符说明,200:success,201:error not init,202:error. run on main thread,203:businessId invalid,204:gen token error
    token 当 code 为200时,返回正常token。当网络状态不佳或者超时时,会返回离线 token(8KB左右)
    businessId 用于透传上报给反垃圾系统,实现数据互通,提升检测效果(如未接入反垃圾系统,可以不用处理此参数)

    示例代码:

    // 同步接口,必须在子线程中调用
    Thread tokenThread = new Thread(new Runnable() {
        @Override
        public void run() {
            AntiCheatResult acResult = HTProtect.getToken(3000, "易盾提供的业务id");
            LogUtils.debug("code:" + acResult.code);
            if (acResult.code == AntiCheatResult.OK) {
                // 调用成功,获取token
                LogUtils.debug("sync token:" + acResult.token);
            }
        }
    });
    tokenThread.start();
    

    异步获取凭证(getTokenAsync)

    接口用途:

    同步获取凭证

    接入须知:

    1. 须在 SDK 初始化且用户同意隐私政策后才能调用该接口,网易易盾隐私说明
    2. 在主线程调用,回调也在主线程。
    3. 如果未调用初始化,此接口默认为空,不会执行任何逻辑。

    函数原型:

    public static void getTokenAsync(int timeout, String businessId, GetTokenCallback callback)
    

    参数说明:

    参数 说明 必要性
    timeout 函数超时时间 必填,单位毫秒,[100,10000],此区间外的默认为3000
    businessId 业务 ID 必填,由易盾后台分配,并在官网“服务管理”中查询
    callback token 的回调 必填,用来接收 token

    返回值:

    GetTokenCallback类说明:

    package com.netease.htprotect.callback;
    
    // 反作弊token回调类
    public interface GetTokenCallback {
        void onResult(AntiCheatResult result);
    }
    

    示例代码:

    // 异步接口,需新建类,继承 GetTokenCallback, 并重写 onResult 方法
    GetTokenCallback myGetTokenCallback = new GetTokenCallback() {
        @Override
        public void onResult(AntiCheatResult antiCheatResult) {
            LogUtils.debug("code:" + antiCheatResult.code);
            if (antiCheatResult.code == AntiCheatResult.OK) {
                // 调用成功,获取token
                LogUtils.debug("async token:" + antiCheatResult.token);
            }
        }
    };
    HTProtect.getTokenAsync(3000, "易盾提供的业务id", myGetTokenCallback);
    

    交互接口(ioctl)

    接口用途:

    1. 用于在客户端查询 SDK 采集的基础数据、设置需要传递给 SDK 数据(比如初始化配置内容、check 结果信息等)、及其他可能的定制功能服务。
    2. 如果未调用初始化,此接口默认返回空字符串。

    接入须知:

    接口调用前置条件是:调用了初始化接口以及同意隐私政策之后。

    函数原型:

    public static String ioctl(int request, String data);
    

    参数说明:

    参数 说明 必要性
    request 对应向风控系统请求的命令 必填
    data 设置信息的附加数据 可选,不需要可填null

    request值说明:

    public enum RequestCmdID
    {
        //模拟器名称
        Cmd_GetEmulatorName = 1,
        
        //是否root
        Cmd_IsRootDevice = 2,
        
        //本地随机生成的设备ID(不是服务端生成的唯一设备ID)
        Cmd_DeviceID = 3,
        
        //当前SDK版本
        Cmd_GetHTPVersion = 7,
        
        //加密后的当前SDK版本
        Cmd_GetEncHTPVersion = 9,
        
        //SDK运行状态,应对线程被挂起或其他导致无法运行时但是接口正常使用的状态
        Cmd_GetHtpStatus = 14,
        
        //初始化配置内容,防止初始化失败情况下,客户可以通过服务端请求初始化配置并传递给SDK
        Cmd_SetConfigData = 16,
        
        //客户服务端将check结果传递给SDK,便于执行后续动作
        Cmd_SetResponseData = 17
    };
    

    返回值:

    错误的情况下,返回:unsupported request(不支持的命令);正确的情况下,返回对应命令的结果。

    注意:该接口的返回值类型均为String,对返回值做判断的时候需要注意该值的类型。

    不同命令设置方法:

    (1) 模拟器信息

    向风控 SDK 查询模拟器信息。

    示例代码:

    String name = HTProtect.ioctl(RequestCmdID.Cmd_GetEmulatorName, "");
    

    返回值: 对应查询的模拟器信息。若为已知模拟器,则返回模拟器名称,示例:emulator:Nox;若为未知模拟器,则返回:emulator:Unknown;若为真机,则返回:emulator:None。

    (2) root信息

    向风控 SDK 查询设备是否root。

    示例代码:

    String name = HTProtect.ioctl(RequestCmdID.Cmd_IsRootDevice, "");
    

    返回值: 当前设备是否root信息。若为root设备,返回值为:root:1;若不是root设备,返回值为:root:0。

    (3) 设备id

    向风控 SDK 查询设备id,本地随机生成的设备ID(不是服务端生成的唯一设备ID)

    示例代码:

    Sstring deviceId = HTProtect.ioctl(RequestCmdID.Cmd_DeviceID.value, "");
    

    返回值: 当前设备id,c09cb89662e6719f956f23651be42006

    (4) 风控 SDK 版本号信息

    向风控 SDK 查询当前风控 SDK 版本号,便于掌握每个玩家当前使用的游戏的风控 SDK 版本。

    示例代码:

    String version = HTProtect.ioctl(RequestCmdID.Cmd_GetHTPVersion, "");
    

    返回值: 风控 SDK 版本号一定不为空,返回值示例:“4.15.114”。若要获取加密后的版本号,可传入参数 “Cmd_GetEncHTPVersion”。

    (5) 加密后的风控 SDK 版本号信息

    向风控 SDK 查询当前风控 SDK 加密后的版本号。

    示例代码:

    String version = HTProtect.ioctl(RequestCmdID.Cmd_GetEncHTPVersion, "");
    

    返回值: 风控 SDK 版本号一定不为空,返回值示例:“iF13uXaKVteXVA==||58807f98da0d945b5d60ba4e8f22a428”。

    注意:返回值需要使用易盾提供的服务端解密sdk进行解密。

    (6) 风控 SDK 运行状态信息

    向风控 SDK 查询当前风控 SDK 运行状态信息,可用于判断当前环境风险度,可多次循环获取。

    示例代码:

    String status = HTProtect.ioctl(RequestCmdID.Cmd_GetHtpStatus, "");
    

    返回值: 状态码一定不为空,返回值有以下三个值:

    返回值 说明
    -1 风控 SDK 未启动
    0 风控 SDK 运行正常
    大于0 风控 SDK 运行有异常
    (7) 设置配置信息

    向风控 SDK 配置传递从易盾服务器获取到的产品的配置信息(主要适用于风控 SDK 因被黑灰产屏蔽或其他原因导致无法正常获取配置信息的情况)。

    配置信息

    初始化接口需设置callback

    如果callback的code返回400,将msg发送到服务端,再发送到易盾服务端

    易盾服务端的返回结果即为配置信息

    示例代码:

    String ret = HTProtect.ioctl(RequestCmdID.Cmd_SetConfigData, "");//如果入参为null或空,则表示查询当前内存中配置版本;如果参数不为空,则表示更新初始化配置
    

    返回值: 返回值为一个json:

    {"s":0,"v":33554433}//s:状态,int类型,只有为0,v 字段的值才有意义;
                       // v:版本,long类型(8字节),配置的版本
    
    返回值 说明
    s 0:成功 -1:内存配置加载失败
    v 配置的版本号
    (8) 设置响应信息

    向风控 SDK 配置传递从易盾服务端获取到的命中及响应结果信息,以便 SDK 执行相关处置动作(主要适用于风控 SDK 因被黑灰产屏蔽或其他原因导致无法正常获取响应结果的情况)。

    响应结果信息

    调用获取凭证(getToken)接口,获取token

    token发送到服务端,在服务端调用check接口,获取结果,其中的 sdkRespData 即为 响应结果信息。

    示例代码:

    String ret = HTProtect.ioctl(RequestCmdID.Cmd_SetResponseData, "");
    

    返回值: 返回值为字符串格式:

    返回值 说明
    0或者-1 输入数据格式有误
    1 解析成功

    心跳接口(registInfoReceiver)

    接口用途:

    为保障风控 SDK 服务的安全运行,防止易盾风控服务被中止或者被剥离,定时向应用/游戏方客户端反馈风控 SDK 的心跳信息,告知应用/游戏方当前风控 SDK 运行状态,既方便应用/游戏方实时掌握风控服务运行状态,也能保证易盾风控服务正常运行。

    同时心跳接口也可以主动实时返回风控数据(有别于交互接口),如需要详细说明文档,请联系易盾获取。

    接口须知:

    1. 须在 初始化接口且用户同意隐私政策后才能调用该接口;
    2. 初始化接口的配置类必须设置gameKey
    3. SDK 会启动线程来调用 onReceive 函数,请注意多线程问题。
    4. 如果未调用初始化,此接口默认为空,不会执行任何逻辑。

    函数原型:

    public static void registInfoReceiver(InfoReceiver receiver);
    

    参数说明:

    参数 类型 说明
    receiver InfoReceiver 回调函数,接收心跳信息

    InfoReceiver 接口定义:

    public interface InfoReceiver{
    	void onReceive(int Type, string Info);
    }
    

    InfoReveiver 接口中,onReceiver 方法参数说明:

    参数 类型 说明
    Type int 接收数据的类型
    Info String 接收的具体数据内容

    onReceiver 方法中参数 Type 支持类型有:

    定义 说明
    1 NetHeartBeat.INFO_TYPE_HEARTBEAT 心跳数据,可直接在客户端解析
    2 NetHeartBeat.INFO_TYPE_ENC_HEARTBEAT 加密后的心跳数据,必须发往客户服务端进行解密
    3 NetHeartBeat.INFO_TYPE_CHEATINFO 检测信息,包括 APP 基本信息及风控检测到的异常信息,信息详情请联系易盾获取

    示例代码:

    • 实现 InfoReceiver 接口:
    ....
    import com.netease.htprotect.HTProtect;       // 调入sdk的接口类
    ....
    
    private class MyInfoReceiver implements NetHeartBeat.InfoReceiver {
        public void onReceive(int type, String info) {
            if (type == NetHeartBeat.INFO_TYPE_HEARTBEAT) {
                Log.e(TAG,"info is:" + info);
                //(获取到info进行相关操作)
            } 
            if (type == NetHeartBeat.INFO_TYPE_ENC_HEARTBEAT) {
                Log.e(TAG,"info is:" + info);
                //(获取到的info,为加密状态,需发往服务端进行解密)
            } 
            if (type == NetHeartBeat.INFO_TYPE_CHEATINFO) {
                Log.e(TAG,"info is:" + info);
            }
        }
    }
        
    public class MainActivity extends AppCompatActivity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    		....
            Context mContext = getApplicationContext();
            HTProtect.init(mContext, "xxxxxxxxxxxxxxx");  
            ....
            MyInfoReceiver mInfoReceiver = new MyInfoReceiver();  
            HTProtect.registInfoReceiver(mInfoReceiver);  // 注册接口
    		....
        }
    
    }
    

    注意

    1. 两种 type 类型心跳数据均可接收,也可只接收其中一种,建议只获取加密后的心跳数据,然后发往客户服务端进行解析。
    2. 心跳接口是每隔 10s 会返回一次数据(“Info”),返回的数据为一个字符串,“Info” 包含三种信息,分别是:序列号、时间戳、网络状态,使用 “key:value” 格式并用 “||” 符号分割。信息含义如下所示:
    名称 标识 说明 异常情况 是否必有
    序列号 seq 从初始值 “1” 开始递增 序列号不存在,或者乱序
    时间戳 t 当前时间戳,以秒为单位 时间戳非当前时间
    网络标识 net 数据发送是否成功( 1 为成功,0 为失败) 网络异常,数据发送失败,则网络标识为:0

    Info 的返回值示例:

    • 易盾风控服务网络通信正常时:
    seq:1||t:1589781840||net:1
    
    • 易盾风控服务网络通信异常时:
    seq:1||t:1589781840||net:0
    

    处理建议:

    • seq、t和net是否出现,该三个标识为心跳系统一定会返回的值,若无,说明反外挂异常;
    • seq的值是否符合"从1开始依次递增"的规则,若不符合,说明返回值被篡改;
    • net为0是否长期出现,若5分钟内net的取值都为0,说明网络异常;
    • 若出现反外挂异常或网络异常,请结合游戏业务数据综合判断并自行处理。

    数据校验接口(getDataSign)

    接口用途:

    应用/游戏协议如被破解,若为单机游戏类型应用,可直接影响到存档文件的安全性;若为帧同步游戏类型应用,可通过破解协议修改战斗数据;若为其他游戏类型应用,可被做成脱机协议,用于攻击或制作脱机外挂;若为非游戏类型应用,则可伪造业务数据欺骗客户端应用。为了保障应用/游戏协议安全,易盾风控服务提供 “数据校验” 方案,采用自研通讯协议校验算法。

    接口须知:

    1. 客户端接入数据校验接口后,客户服务端需要对对应的数据进行校验,数据校验相关说明文档请联系易盾获取;
    2. 对于与服务端有通信的应用/游戏,强烈建议 使用该接口进行数据校验。
    3. 初始化接口的配置类必须设置gameKey
    4. 如果未调用初始化,此接口默认返回空字符串。

    函数原型:

    public static String getDataSign(String inputData,int algIndex);
    

    参数说明:

    参数 类型 说明
    inputData String 待校验的数据
    algIndex int 使用的算法标识,当前固定为1003

    返回值:

    返回的数据即为校验结果,开发者需要将原始数据与校验结果发送到应用/游戏服务端,由应用/游戏服务端校验。

    示例代码:

    ....
    import com.netease.htprotect.HTProtect;       // 调入sdk的接口类
    ....
    
        private String doInBackground(String... strings) {
            String username = strings[0];
            String psd = strings[1];
            Map<String, String> params = new HashMap<String, String>();
            params.put("username", username);
            params.put("password", psd);
        
            //------- 以下为接入该功能的相关代码
            int algIndex = 1003;   // 索引值,java层调用客户端和服务端都默认填写1003
            String sign = HTProtect.getDataSign( username + psd, algIndex);
            params.put("sign", sign);
            //------- 以上为接入该功能的相关代码
        
            //相对于未接入,主要是对上传的数据,计算了一个sign值,并把该值发送到服务端进行校验
            //只要是与服务端通信的请求,均可使用该功能进行校验
        
            return PostData(params);
        }
    

    安全通信协议接口

    接口用途:

    该接口用于对通信数据进行白盒加密和白盒 HMAC 签名(相当于 数据校验接口 的升级版本),加密和签名的密钥均会被隐藏,攻击者无法获取,从而保障应用/游戏的通信安全。

    最新版本接口(V2.1)更新内容如下:

    • 自定义二进制格式,增大分析难度;
    • 多重加密,防明文传输;
    • 数据将进行校验,防止篡改;
    • 支持多算法,一旦加密算法被破解,可及时更新为另一种算法;
    • 一次一密,每次加密的密钥都不相同;
    • 自定义安全随机数发生器,防止系统随机数接口被篡改,始终生成一样的密钥;
    • 防重放攻击;
    • 防模拟执行(脱离Android/iOS环境运行)。

    接口须知:

    如需使用该接口,请联系易盾获取详细说明文档。

    本地数据加解密接口

    接口用途:

    该接口用于对应用/游戏本地存储的数据进行加解密,保护本地数据安全(游戏类型应用可用于本地游戏存档保护)

    接口须知:

    1. 初始化接口的配置类必须设置gameKey
    2. 加密后的数据,需要接入方自行存储,风控 SDK 只提供加密和解密功能。
    3. 如果未调用初始化,此接口默认返回空字符串或全0 byte[]数组。

    函数原型:

    • 加密对象为 String 类型:
    String localSaveEncode(String inputData,int algIndex);
    String localSaveDecode(String inputData,int algIndex);
    
    • 加密对象为 byte[] 类型:
    String localSaveBytesEncode (byte[]inputData,int algIndex);
    byte[] localSaveBytesDecode (String inputData,int algIndex);
    

    参数说明:

    参数 说明
    inputData 需要加密或者解密的数据
    algIndex 加密 key 的绑定因子。参数为 0 时:因子为 APP 安装时间;参数为 1 时:因子为 APP 签名。

    返回值:

    • 若是加密接口,返回的数据即为原始数据的密文;
    • 若是解密接口,返回的数据即为密文对应的原始数据。

    View点击数据采集接口

      5.3.2版本支持。 

    接口用途:

    该接口用于对指定View进行自动化埋点采集点击事件,用于判断是否有模拟点击行为。 

    接口须知:

    1. 必须先调用初始化接口
    2. 支持多个view的调用,上限20个
    3. 必须在主线程调用 

    函数原型:

    public static int track(View view, String description);
    

    参数说明:

    参数 说明
    view 需要监控的view对象
    description 可选数据,可为null,表示对当前view的描述,比如登录,或者是注册,主要用于后续方便排查和分析 

    返回值说明:

    返回值 说明
    -1 未调用初始化接口或者当前传入参数view为空
    -2 当前运行在非主线程内
    -3 当前view已经被埋点不需要重复埋点
    -4 当前集合已满,目前预留20个埋点位
    200 成功

    模拟点击AI识别

    接口用途:

    批量的模拟点击极大的影响到游戏的正常运营,特别是工作室的参与,不仅影响到游戏的平台,还影响到游戏方的收入。易盾智能反外挂SDK提供相关的行为检测方案,使用模拟点击行为检测接口时,需要在游戏登录后,并且调用设置用户信息接口,设置role_id等信息后调用。

    接入须知:

    SDK5.3.5以之后版本支持该接口

    请在作弊情况较严重的玩法和场景下调用registerTouchEvent和unregisterTouchEvent,开启和关闭点击数据的采集,初次接入建议设置一个玩法和场景id,并同步给易盾,如需接入多个玩法和场景需提前与易盾沟通。 开启registerTouchEvent后,在该场景结束后必须调用unregisterTouchEvent关闭检测逻辑。

    (1)开启采集数据

    函数原型:
    public static void registerTouchEvent(int gameplayId,int sceneId)
    
    函数说明:

    调用该接口后,开始采集点击事件的相关数据。

    参数说明:
    参数 说明
    gameplayId 玩法id
    sceneId 场景id
    示例代码:
    HTProtect.registerTouchEvent(123,456);
    

    (2)关闭数据采集

    函数原型:
    public static void unregisterTouchEvent()
    
    函数说明:

    取消点击事件数据采集。

    示例代码:
    HTProtect.unregisterTouchEvent();
    
    Online Chat Tel:95163223 Free trial