接入说明#

  • 提示:官网文档仅供参考,具体接入时请联系数美提供正式对接文档

1. 注意项#

  • 如果接入过旧版数美 SDK,请将旧版SDK的 smsdk.jarlibsmsdk.so 或者aar包全部从项目中移除,避免发生代码冲突。

  • 检查完善APP的隐私协议

    1. 完善您APP隐私协议中采集个人信息部分说明,涵盖如下个人信息

      (1)个人信息数据项

      (2)设备 IP 地址

      (3)设备硬件序列号

      (4)设备 MAC 地址

      (5)设备安装应用列表

      (6)设备唯一标识码(IMEI / android_id / iccid / imsi)

    2. 完善您 APP 隐私协议中,关于个人信息共享给第三方说明的部分,明确描述会给到第三方的个人信息数据项和使用目的,强烈建议此部分由您专业的法务团队优化完善,详情可参考第7部分 隐私政策说明

2. 导入 aar 包#

  1. 将 smantifraud.aar 拷贝到 module 的 libs 目录下;

  2. 在 build.gradle 中增加依赖配置,配置如下所示:

android {
……
defaultConfig {
……
ndk {
abiFilters 'armeabi', 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'
// 选择实际需要的cpu架构
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar', 'smantifraud.aar'])
……
}
  1. 添加权限
    ●在AndroidManifest.xml中添加如下权限:
<!-- 必选权限 -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- 强烈建议权限 -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
  1. 注意:
    SDK 默认使用 HTTP 传输数据,在 targetSdkVersion >= 28 时需要在 AndroidManifest.xml 增加如下配置
<application
...
android:usesCleartextTraffic="true"
...

如果 AndroidManifest.xml 中设置了 android:networkSecurityConfig 属性,则上面的属性会自动失效,所以需要在 networkSecurityConfig 文件中添加如下内容

<network-security-config>
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">fengkongcloud.com</domain>
</domain-config>
</network-security-config>

3. 初始化SDK#

String getCurProcessName(Context context) {
int pid = android.os.Process.myPid();
ActivityManager mActivityManager = (ActivityManager) context
.getSystemService(Context.ACTIVITY_SERVICE);
for (ActivityManager.RunningAppProcessInfo appProcess : mActivityManager
.getRunningAppProcesses()) {
if (appProcess.pid == pid) {
return appProcess.processName;
}
}
return null;
}
// 如果AndroidManifest.xml中没有指定主进程名字,主进程名默认与packagename相同
// 如下条件判断保证只在主进程中初始化SDK
if (this.getPackageName().equals(getCurProcessName(this))) {
SmAntiFraud.SmOption option = new SmAntiFraud.SmOption();
//1.通用配置项
option.setOrganization("xxxxxxx"); //必填,组织标识,邮件中organization项
option.setAppId("xxxxxxxx"); //必填,应用标识,登录数美后台应用管理查看
option.setPublicKey("xxxxxxxx"); //必填,加密KEY,邮件中android_public_key附件内容
option.setAinfoKey("xxxxxxxx"); //必填,加密KEY,邮件中Android ainfo key项
// 2连接机房特殊配置项
//
// 2.1业务机房在国内
// 1) 用户分布:中国(默认设置)
// option.setArea(SmAntiFraud.AREA_BJ);
// 2) 用户分布:全球
// option.setArea(SmAntiFraud.AREA_BJ);
// 注意,此处 host 必须添加协议头(https:// 或 http://),下同。
// String host = "http://fp-it-acc.fengkongcloud.com";
// option.setUrl(host + "/v3/profile/android");
// option.setConfUrl(host + "/v3/cloudconf");
//
// 2.2业务机房在欧美
// 1) 用户分布:欧美
// option.setArea(SmAntiFraud.AREA_FJNY);
// 2) 用户分布:全球
// option.setArea(SmAntiFraud.AREA_FJNY);
// String host = "http://fp-na-it-acc.fengkongcloud.com";
// option.setUrl(host + "/v3/profile/android");
// option.setConfUrl(host + "/v3/cloudconf");
//
// 2.3业务机房在东南亚
// 1) 用户分布:东南亚
// option.setArea(SmAntiFraud.AREA_XJP)
// 2) 用户分布:全球
// option.setArea(SmAntiFraud.AREA_XJP);
// String host = "http://fp-sa-it-acc.fengkongcloud.com";
// option.setUrl(host + "/v3/profile/android");
// option.setConfUrl(host + "/v3/cloudconf");
// 2.4 私有化特殊配置
// 1) 设置 area
// option.setArea("xxxxxx"); // 必填,组织标识,邮件中organization项
// 2) 设置私有地址
// String host = "https://private-host"; // 将 private-host 替换为您自己的主机名(域名)
// option.setUrl(host + "/v3/profile/android");
// option.setTraceUrl(host + "/v3/tracker?os=android");
// option.setTraceUrl(host + "/v3/tracker?os=android");
//3.SDK初始化
SmAntiFraud.create(this, option);
//4.获取设备标识,注意获取deviceId,这个接口在需要使用deviceId时地方调用
String deviceId = SmAntiFraud.getDeviceId();
}

● SDK初始化时机:
安装后首次启动时,在用户同意隐私协议后,立即初始化SDK。避免出现用户未同意隐私协议已经采集数据问题;如需授权,需要在授权结束时(无论用户是否同意授权)再初始化 SDK。后继启动时,应在启动后立即初始化SDK。
● getDeviceId调用时机:
SmAntiFraud.getDeviceId()接口在真正需要DeviceId时再进行调用。
不要缓存调用getDeviceId的结果,deviceId在sdk内部会做缓存和更新处理。在create后至少需要 2s 以上间隔再调用 getDeviceId() 方法,否则会有小概率出现 ANR 问题。如果需要调用 SmAntiFraud.create(ctx, option) 后立即获取设备标识,请使用回调方法获取

SmAntiFraud.registerServerIdCallback(new SmAntiFraud.IServerSmidCallback() {
@Override
public void onSuccess(String deviceId) {
// 服务器下发成功或缓存中有可用 deviceId
// 可能会触发两次
}
@Override
public void onError(int errorCode) {
// errorCode 含义
// -1: ERROR_NO_NETWORK,无网络(检查网络是否正常连接)
// -2: ERROR_NO_RESPONSE,服务器无响应(检查接入是否有问题)
// -3: ERROR_SERVER_RESPONSE,服务器响应错误(检查配置是否填写正确)
}
});

注意:如果使用回调方法,在用户网络情况差等客观异常情况下,客户端可能会出现获取不到回调的情况,所以建议非必要情况不要使用回调作为获取deviceId的唯一方式,在需要的时候调用getDeviceId()获取即可。

4.生命周期控制#

接入的时候保证SmAntiFraud.create只在主进程调用一次。所以需要在调用前判断当前进程是否是主进程而不是其他 如 :push 或 :ipc等后台服务进程。防止重复初始化。

5.java代码混淆#

当项目接入sdk后,项目可能要求混淆自身代码,同时可能会混淆第三方jar中的class,这里需要注意的是不要混淆sdk的jni接口类,防止找不到函数,proguard-rules.pro 混淆规则文件中添加如下规则:

-keep class com.ishumei.** {*;}

6. 检查接入是否成功#

可以使用以下方法之一检测 SDK 接入是否成功:

  1. 抓包查看数美服务器code返回值是否为 1100,服务器默认域名:fp-it.fengkongcloud.com
  2. 进入管理后台 https://www.fengkongcloud.com,选择 "设备风险趋势" -> “设备详情” 查看是否有当次产生的数据

7.隐私政策建议#

您应向您的终端用户逐一明示您嵌入的第三方SDK收集使用个人信息的目的、方式和范围。
您应当在《隐私政策》中明确告知终端用户,您谨慎地选择了数美科技作为合作方,并委托其收集、使用、加工和处理终端用户个人信息。数美科技建议您在《隐私政策》中的“数据共享与披露”的表述条款中增加如下内容:
为了实现风险控制和反欺诈识别的目的,进而保护您的账户和交易安全,我们的产品可能会集成第三方的SDK或类似应用程序,具体如下:

SDK名所属公司名称SDK收集数据的类型SDK用途隐私政策链接
数美SDK北京数美时代科技有限公司个人常用设备信息:设备MAC地址、蓝牙MAC地址、SIM卡信息(ICCID、IMSI)、唯一设备识别码(IMEI、IDFA、安卓ID、设备硬件序列号)、安装软件列表、设备的基本配置信息(设备名称、CPU、内存、屏幕、型号、操作系统)、系统及软件相关配置信息、 WIFI及蜂窝网络信息(WIFI网卡MAC地址、WIFI热点的MAC地址、WIFI名称、周边WIFI信息列表、网络连接方式、运营商信息) 网络身份标识信息:ip地址用于风险控制和反欺诈,以保障账户和交易全https://www.ishumei.com/legal/cn/privacy.html

购买咨询