前言

最近老板要我开发一个商城App,在注册登录环节过滤掉虚假用户,减少这些恶意流量对App运营的影响。偶然想起来,在今年的华为开发者大会上了解到虚假用户检测功能,于是准备试试集成在我们的App上。集成后发现效果还真不错,不仅对虚假用户识别率高,而且目前这项功能是免费开放的。老板再也不用担心之前的虚假用户撞库、恶意刷帖、薅羊毛等问题了。

今天简单总结了一下我开发过程的教程,分享给大家!

官网的Demo和Sample代码体验

华为官网上有实例代码可以直接下下来看,除了虚假用户检测(UserDetect),还有其他4个功能的示例代码,都是支持Java和Kotlin两种开发语言的:华为官网的示例代码Java/Kotlin,下载下来以后,根据官网页面的提示说明,改一下包名就可以运行。

我自己写的简易sample,朋友们感兴趣也可以下下来参考。

商城App集成安全检测 sample示例

1 开发前准备

1.1 Android studio安装

开发工具还没有装的小伙伴可以先自己下载一下:
Android studio官网下载:https://developer.android.com/studio?ha_source=hms1
Android studio安装教程:https://www.cnblogs.com/xiadewang/p/7820377.html

1.2 在AppGallery Connect中配置相关信息

在开发应用前,需要在AppGallery Connect中配置相关信息。具体操作步骤

1.3 配置华为maven仓地址

打开Android Studio项目级“build.gradle”文件:

在这里插入图片描述

添加HUAWEI agcp插件以及Maven代码库:

  • 在“buildscript > repositories”中配置HMS Core SDK的Maven仓地址。
  • 在“allprojects > repositories”中配置HMS Core SDK的Maven仓地址。
  • 如果App中添加了“agconnect-services.json”文件则需要在“buildscript > dependencies”中增加agcp配置。
buildscript {
    repositories {
        google()
        jcenter()
        // 配置HMS Core SDK的Maven仓地址。
        maven {url 'https://developer.huawei.com/repo/'}
    }
    dependencies {
        ...
        // 增加agcp配置。
        classpath 'com.huawei.agconnect:agcp:1.4.2.300'
    }
}
 
allprojects {
    repositories {
        google()
        jcenter()
        // 配置HMS Core SDK的Maven仓地址。
        maven {url 'https://developer.huawei.com/repo/'}
    }
}

这里需要说明的是,Maven仓地址无法直接在浏览器中打开访问,只能在IDE中配置。需要添加多个Maven代码库的话,将华为公司的Maven仓地址配置在最后哦。

1.4 添加编译依赖

打开应用级的“build.gradle”文件:

在这里插入图片描述

在文件头 apply plugin: 'com.android.application' 下一行添加如下配置:

apply plugin: 'com.huawei.agconnect'

在“dependencies”中添加如下编译依赖:

dependencies {
    implementation 'com.huawei.hms:safetydetect:5.0.5.301'
}

1.5 配置混淆脚本

如果你自己开发时要用到AndResGuard,那就还需要在应用级的“build.gradle”文件中加入AndResGuard允许清单,代码可以参考官网的混淆配置

2 代码开发

2.1 创建SafetyDetectClient

// 替换成自己的 activity 或者 context作为参数.
SafetyDetectClient client = SafetyDetect.getClient(MainActivity.this);

2.2初始化虚假用户行为检测

在使用该能力前,需要先通过initUserDetect接口完成初始化工作。我在商城App的LoginAct.java类的onResume方法里来调用初始化接口,示例代码如下:

@Override
protected void onResume() {
    super.onResume();
 
    // 初始化虚假用户检测API
    SafetyDetect.getClient(this).initUserDetect();
}

2.3 发起检测请求

我设计的是在商城App用户登录阶段进行虚假用户检测的,一般检测请求也可以设计在抢购、抽奖等环节。

先在LoginAct.java中的onLogin方法中,调用SafetyDetectUtil的callUserDetect方法来发起检测。我具体的业务逻辑:商场App在判断用户名和密码是否正确之前发起虚假用户检测,然后通过回调方法来获取检测结果,并做相应的处理。若检测结果为真实用户,则允许该用户登录,否则不允许其登录操作

private void onLogin() {
    final String name = ...
    final String password = ...
    new Thread(new Runnable() {
        @Override
        public void run() {
// 调用经过封装后的虚假用户检测接口,此处需要传入当前的Activity或上下文并添加回调处理
            SafetyDetectUtil.callUserDetect(LoginAct.this, new ICallBack<Boolean>() {
                @Override
                public void onSuccess(Boolean userVerified) {
                    // 虚假用户检测成功                   
                    if (userVerified){
                        // 检测结果为成功,继续登录
                        loginWithLocalUser(name, password);
                    } else {
                        // 检测结果为失败,登录失败
                        ToastUtil.getInstance().showShort(LoginAct.this, R.string.toast_userdetect_error);
                    }
                }
            });
        }
    }).start();
}

SafetyDetectUtil.java中的callUserDetect方法封装了虚假用户检测中的关键流程,如APP ID的获取、responseToken的获取以及向App Server发送responseToken等,详见:

public static void callUserDetect(final Activity activity, final ICallBack<? super Boolean> callBack) {
    Log.i(TAG, "User detection start.");
    // 从app目录下的agconnect-services.json文件中读取app_id字段
    String appid = AGConnectServicesConfig.fromContext(activity).getString("client/app_id");
    // 调用虚假用户检测 API,并添加回调来做后续的异步处理
    SafetyDetect.getClient(activity)
        .userDetection(appid)
        .addOnSuccessListener(new OnSuccessListener<UserDetectResponse>() {
            @Override
            public void onSuccess(UserDetectResponse userDetectResponse) {
                // 虚假用户检测成功,通过 getResponseToken 方法来获取responseToken
                String responseToken =userDetectResponse.getResponseToken();
                // 将该responseToken发送到App Server
                boolean verifyResult = verifyUserRisks(activity, responseToken);
                callBack.onSuccess(verifyResult);
                Log.i(TAG, "User detection onSuccess.");
            }
        })
}

到这里,responseToken就通过虚假用户检测API拿到啦。

2.4 获取检测结果

获得上述的responseToken后,提交至App服务端,再由App服务端发送到Safety Detect Server,调用verify云侧接口获取结果。不过在中国大陆地区,由于User Detect不支持验证码二次验证,为了保证检测同样准确有效,调用的是nocaptcha云侧接口来获取检测结果。

具体步骤:
a) 获取Access Token
打开AppGallery Connect网站 - “我的应用” - “HMSPetStoreApp” - “分发” - “应用信息”,可以查看SecretKey,如图:

在这里插入图片描述

然后使用SecretKey和APP ID请求华为认证服务获取Access Token,获取方法参考

b) 调用Safety Detect Server接口获取结果
根据上一步中获取到的Access Token,和之前获取到的responseToken,调用Safety Detect Server的检测结果查询接口,小伙伴戳这里参考接口调用方法

最后获取的检测结果,可以通过App Server直接返回给App。True代表真实用户,False代表虚假用户,App可以根据自身业务场景来完成对应的防护处理。

2.5 关闭虚假用户检测

小伙伴们记得用完以后关闭服务,释放资源哦。在App的LoginAct.java 类的onPause方法中调用关闭接口:

@Override
protected void onPause() {
    super.onPause();
    // 关闭虚假用户检测API
    SafetyDetect.getClient(this).shutdownUserDetect();
}

结后语

整个代码开发过程就结束啦,保姆级教程,是不是超简单,给大家看下效果:
Demo演示请戳此

附官方开发指南

华为虚假用户检测开发指南


原文链接:https://developer.huawei.com/consumer/cn/forum/topic/0202445499791050552?fid=18

原作者:晚上吃啥


华为开发者论坛
352 声望56 粉丝

华为开发者论坛是一个为开发者提供信息传播、开发交流、技术分享的交流空间。开发者可以在此获取技术干货、华为源码开放、HMS最新活动等信息,欢迎大家来交流分享!