產品文檔 > 智能風控 > 實時風險決策

實時風險決策產品概述

一、產品簡介


頂象實時風險決策是一款基于設備指紋、規則引擎、指標策略、風險數據、機器學習等多項技術的業務風險防控產品, 支持快速私有化部署,幫助客戶快速建立自有的業務安全體系,解決仿冒、盜用、欺詐、作弊、垃圾、爬蟲等各類風險。

二、產品特點


  • 實時決策,利用策略和實時計算,同步識別風險,直接阻斷惡意風險

  • 近線分析,t+分鐘級的近線計算,計算各種特征,為實時決策提供指標參數

  • 離線挖掘,通過各種離線的挖掘和模型技術的應用,為實時決策和離線處置提供依據和能力,如:特征挖掘、模型平臺訓練、用戶風險畫像、設備風險畫像等

  • 快速私有化部署,支持平滑擴容和在線升級

三、產品示例


  1. 盜號防控示例

  2. 垃圾注冊防控示例

四、新手指南

4.1 業務流程


  1. 前端SDK收集設備相關信息,上報至頂象風控后臺;
  2. 頂象風控后臺通過上報的的設備信息,生成token,下發給用戶前端;
  3. 用戶前端的業務邏輯附帶token發送至用戶后端;
  4. 用戶后端把本次請求的token,連同AppId以及相關參數,經加密和加簽,發送至頂象風控后端;
  5. 頂象風控后端把風險識別結果返回給用戶后端;
  6. 用戶后端的業務邏輯處理,并把處理結果返回至用戶前端;

4.2 名詞解釋


名稱釋義
AppId應用公鑰,唯一標識。開通服務后可在實時風險決策的二級菜單“應用管理”中獲取
AppSecret應用私鑰,開通服務后可在實時風險決策的二級菜單“應用管理”中獲取,請妥善保管,勿泄漏給他人
ConstID設備指紋ID,通過采集設備的硬件信息生成的設備唯一標識。結合頂象風控系統,能夠在各個業務環節進行風險過濾和實時決策,為企業提供提供強力業務安全保障
用戶前端Web端或集成SDK的Android端、iOS端、微信小程序
用戶后端指企業的后臺服務器
風控后臺指部署在公有云或者私有云頂象的風控系統

五、開發前必讀

5.1 技術接入流程


接入實時風險決策,只需四步:

     第一步:獲取AppId、AppSecret,開通服務后可在實時風險決策的二級菜單“應用管理”中獲取,
            在接入前請與頂象技術人員溝通,以根據您的業務特點配置不同的風險策略;
     第二步:前端接入,即設備指紋埋點,支持Web、Android、iOS、微信小程序接入,
            接入方法及相關SDK下載,請見前端接入章節;
     第三步:后端集成SDK,接入方法及SDK下載,請見后端接入章節;
     第四步:調試完畢,部署上線,可在實時風險決策的二級菜單“風險監控”中查看風險數據詳情。

六、前端接入

  • 支持Web接入,支持IE8+、Chrome、Firefox、360瀏覽器、QQ瀏覽器等主流瀏覽器及Android、iOS上的內嵌Webview。如何引用JS請見Web接入章節

  • 支持Android接入,如何獲取SDK并接入,請見Android接入章節

  • 支持iOS接入,如何獲取SDK并接入,請見iOS接入章節

    提示:設備指紋token具有時效性,超過一定時間會過期,請勿自行緩存

6.1 Web接入

6.1.1 環境要求

兼容IE8+,Chrome,Firefox,360瀏覽器,QQ瀏覽器等主流瀏覽器。

6.1.2 引入JS

在頁面 HTML 中引入const-id.js,代碼如下:

<script src="https://cdn.dingxiang-inc.com/ctu-group/constid-js/index.js"></script>

6.1.3 生成token

頁面加載后,初始使用,需要在 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 (e, id) {
if (e) {
    // console.log('error: ' + e);
    return;
}
// console.log('token is ' + id);
// console.log(_dx.constID === id); // true
});

執行成功后,頁面中將會有一個全局變量_dx,可以通過_dx.constID訪問這個值。也可以繼續調用上面的初始化方法,同一個瀏覽器多次初始化返回的值相同。

options 字段說明 {#options-字段說明}

字段類型是否必填說明
AppIdString當前應用的標識,請聯系您在頂象的商務經理獲取
serverString服務接口,可選,如不填,則默認會用云服務接口
sceneString場景標識,例如loginsurvey
userIdString業務方的用戶唯一標識,例如用戶名、用戶ID、手機號、Email等

6.2 Android接入

6.2.1 環境要求

條目說明
開發目標Android 4.0+
開發環境Android Studio 3.0.1 或者 Eclipse + ADT
CPU架構ARM 或者 x86
SDK三方依賴

6.2.2 法規要求

根據《工業和信息化部 337號令》的規定,重點對以下四個方面開展規范整治工作。
(一)違規收集用戶個人信息方面
(二)違規使用用戶個人信息方面
(三)不合理索取用戶權限方面
(四)為用戶賬號注銷設置障礙方面
法規地址:http://miit.gov.cn/n1146295/n1652858/n1652930/n3757020/c7506353/content.html

其中SDK涉及到第一條:收集個人信息(包括唯一設備識別碼、網絡設備硬件地址等信息)。
法規規定,所采集的數據項目需在隱私政策中明確聲明,在客戶不同意隱私政策的情況下,不允許進行采集。且申請授權需與場景相關,請根據實際情況做出合理調整。

解決方式

需要客戶在集成了SDK的app中增加《隱私政策聲明》,來規避風險。并在客戶同意隱私政策后,進行sdk的調用。

隱私政策(擬,可根據實際情況進行修改)

為了識別設備/賬號異常狀態,我們將會接受并記錄您所使用的設備相關信息(包括設備型號、操作系統、設備設置、唯一設備標識符(IMEI碼)、網絡設備硬件地址(MAC)、設備環境等軟硬件特征信息,設備所在位置相關信息(包括您授權的GPS位置以及WLAN接入點、藍牙和基站等信息)

6.2.3 集成SDK

6.2.3.1 下載SDK

點擊下載SDK

點擊下載demo(僅做代碼配置演示使用,其中appId請在頂象后臺申請,SDK需要替換為鏈接中下載的SDK)

6.2.3.2 Android Studio 集成

SDK包集成內容:

  • libs文件夾下的jar和so
  • assets文件夾下的配置文件
libsjarso庫放到相應模塊的libs目錄下,assets下的文件放置到項目assets

在該Module的build.gradle中如下配置:
android{
    sourceSets {
        main {
            jniLibs.srcDirs = ['libs']
            assets.srcDirs = ['assets']
        }
    }

    packagingOptions {
        doNotStrip "**/libDX*.so"
    }
}

repositories{
    flatDir{
        dirs 'libs'
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation files('libs/dx-risk-x.x.x.jar')
}
6.2.3.3 添加SDK所需權限
<!-- 必選-默認申請 -->
<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.BLUETOOTH"/>

<!-- 可選-6.0或以上需動態申請 -->
<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" />
6.2.3.4 Proguard混淆配置
-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.**{*;}
6.2.3.5 API 6.0或以上動態權限申請說明

需要動態申請權限如下:

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);

   // 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.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();

}

6.2.4 接口使用說明

6.2.4.1 方法和參數說明
功能描述

采集端的設備指紋信息,上傳至風控后臺,再由風控后臺返回token。 該API為耗時操作,因此必須在非主線程上調用,否則會拋異常。

方法說明

DXRisk.java 該類是DxRisk SDK的風控組件接口,負責采集本地信息并返回用戶前端token。

初始化setup

SDK使用前必須調用先setupsetup主要用于數據/環境初始化,一般在ApplicationonCreate下調用:

/**
* 初始化參數,環境
* @param context
* @return
*/
public static boolean setup(Context context)

PS:下列兩種方式獲取token在網絡通暢的情況下沒有任何的不同。

常規Token
/**
 * @return token 通常返回長度為40的字符串。在網絡卡頓或不通的情況下,返回4-5k的字符串。
 * @throws DXRiskErrorException 如在主線程調用本API,或者appId為空等等,則會拋出該異常
 */
public static String getToken(String appId, HashMap<String, String> paramsMap) throws DXRiskErrorException
精簡Token

獲取輕量級Token可獲取的設備信息信息遠少于getToken(),可能會造成在判斷設備是否有風險時出現較大誤差,請謹慎使用。

/**
 `* @return token 通常返回長度為40的字符串。在網絡卡頓或不通的情況下,返回1k的字符串。
 `* @throws DXRiskErrorException 如在主線程調用本API,或者appId為空等等,則會拋出該異常
 */
public static String getLightToken(String appId, HashMap<String, String> paramsMap) throws DXRiskErrorException
6.2.4.2 使用示例
(1) 初始化setup

建議Application.onCreate下調用

@Override
public void onCreate() {
  super.onCreate();    
  // 環境初始化
  DXRisk.setup(this);
}
(2) 獲取token

整個過程由于是耗時操作,必須要在非主線程上執行,否則會crash

new Thread(){

    @Override
    public void run() {
      /* 私有化配置 */
      HashMap<String, String> params = new HashMap<String, String>();
      // 私有化部署服務端url
      params.put(DXRisk.KEY_URL, "https://constid.dingxiang-inc.com");
      // 開啟線上數據備份 
      params.put(DXRisk.KEY_BACKUP, DXRisk.VALUE_ENABLE_BACKUP);
      // 設置請求token超時時長ms,不設置默認為500ms
      parsms.put(DXRisk.KEY_DELAY_MS_TIME, "2000");

      // 開通服務后可在實時風險決策的菜單獲取
      String appId = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
       // 獲取設備指紋token
      final String token = DXRisk.getToken(appId, paramsMap);

      // TODO 把token通過Post請求,傳到用戶后端
  }
}.start();
6.2.4.3 異常說明

在獲取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

如果出現上述錯誤信息,請聯系頂象技術人員。

6.3 iOS接入

Apple Store上架請特別注意(2.2.3 節)

6.3.1環境需求

條目說明
兼容平臺iOS 8.0+
開發環境XCode 4.0 +
CPU架構armv7, arm64, i386, x86_64
SDK依賴libz, libresolv, libc++ , SystemConfiguration.framework , CoreLocation.framework , CoreTelephony.framework

6.3.2集成SDK

6.3.2.1 下載SDK

點擊下載SDK,SDK的目錄結構如下:

點擊下載集成demo

  • dx-risk-iOS-x.x.x-xxxxxxx目錄 DXRisk sdk
    • DXRisk.framework 不帶idfa獲取邏輯的Dynamic Library Framework
    • DXRiskWithIDFA.framework 帶idfa獲取邏輯的Dynamic Library Framework
    • DXRiskStatic.framework 不帶idfa獲取邏輯的Static Library Framework
    • DXRiskStaticWithIDFA.framework 帶idfa獲取邏輯的Static Library Framework
6.3.2.2 將SDK接入XCode
(1) 導入Framework

DXRisk.framework,DXRiskWithIDFA.framework,DXRiskStatic.framework,DXRiskStaticWithIDFA.framework`其中之一直接拖入工程目錄中,或者右擊總文件夾添加文件。

  • 如果App中包含廣告相關的功能,則選擇DXRiskWithIDFA.framework 或者 DXRiskStaticWithIDFA.framework,該版本可以提供更精準的token
  • 如果沒有廣告,獲取idfa可能導致拒絕上架,此時請選擇DXRisk.framework 或者 DXRiskStatic.framework
(2) 添加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 如下圖:

4A23453213E696EC12C2AE2A1070EA0C.jpg

(3) 配置打包腳本

以下的操作僅限導入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

6.3.3 接口使用說明

6.3.3.1方法和參數說明
// 風控組件: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 業務方用戶唯一標識,用戶名,用戶ID,Email等等,常用Key值可參考DXRiskManagerKeyUserId, DXRiskManagerKeyEmail等等
 @return token
 */
+ (NSString *)getToken:(NSString *)appId extendParams:(NSDictionary *)extendsParams;

/** 
 DXRiskManager -- 初始化方法
 */
+ (BOOL)setup;  
@end
6.3.3.2使用示例
示例一:Native
// 整個過程由于是耗時操作,必須要在非主線程上執行,否則會阻塞UI。如果本身已經在非UI線程上執行,則不需要另開線程
    dispatch_queue_t dxrisk_queue = dispatch_queue_create("com.dingxiang.dxrisk", DISPATCH_QUEUE_CONCURRENT);
    dispatch_async(dxrisk_queue, ^{
        // 根據業務邏輯,填充自定義字段
        NSDictionary *dic = @{DXRiskManagerKeyUserId: @"123456"};
        // 如需自定義服務端URL,填充DXRiskManagerKeyURL字段,如需備份私有化數據填充DXRiskManagerKeyBackup字段,如下注釋
        // NSDictionary *dic = @{DXRiskManagerKeyUserId: @"123456",DXRiskManagerKeyURL:@"http://xxxxxxx",DXRiskManagerKeyBackup:DXRiskManagerKeyBackupEnable};
        // 如需統計設備降級率,填充DXRiskManagerKeyDegradeNotify字段,如下注釋
        // NSDictionary *dic = @{DXRiskManagerKeyUserId: @"123456",DXRiskManagerKeyDegradeNotify:DXRiskManagerKeyDegradeNotifyEnable};
        // 獲取token
        // 注意:token最好不要保存在某個局部變量或者字段,每次使用時,都通過API獲取。
         //初始化
        BOOL isSuccess = [DXRiskManager setup];
        NSLog(@"setup success: %@" , isSuccess ? @"YES":@"NO");
        // 獲取token
        // 注意:token最好不要保存在某個局部變量或者字段,每次使用時,都通過API獲取。
        NSString *constID = [DXRiskManager getToken:@"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" extendsParams:dic];                    NSLog(@"token: %@", token);
        // TODO 把token通過Post請求,傳到業務后臺。
        // 下面是模擬頻繁調用的過程
        while(TRUE) {
             NSLog(@"constID: %@", [DXRiskManager getToken:@"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" extendsParams:dic]);
            [NSThread sleepForTimeInterval:.5];
        }
    });
示例二:JavaScript

將相關變量導入JSContext

    JSContext *jsContext = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
    jsContext[@"DXRiskManager"] = [DXRiskManager class];
    jsContext[@"DXRiskManagerKeyUserId"] = DXRiskManagerKeyUserId;
    jsContext[@"DXRiskManagerKeyBackup"] = DXRiskManagerKeyBackup;
    jsContext[@"DXRiskManagerKeyURL"] = DXRiskManagerKeyURL;
    jsContext.exceptionHandler = ^(JSContext *context, JSValue *exceptionValue) {
        context.exception = exceptionValue;
        NSLog(@"異常信息:%@", exceptionValue);
    };

使用

    // 根據業務邏輯,填充自定義字段(同Native使用示例)
  var isSuccess = DXRiskManager.setup()
  var token = DXRiskManager.getToken('xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' , {[DXRiskManagerKeyUserId]: '123456'})

私有化部屬的用戶,使用4.8.0以上版本的SDK, DXRiskManagerKeyURL填寫規則為ip+port(http://ip:port)或者域名(http://domain.com),注意后面不要拼"/"

6.3.3.3 異常說明

在獲取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

如果出現上述錯誤信息,請聯系頂象技術人員。

6.4 微信小程序接入

js接入

一、下載設備指紋js

私有化版本下載

SaaS版本下載

二、獲取密鑰

未注冊用戶可在頂象官網進行賬號注冊,創建應用獲取應用密鑰AppID和AppSecret。

三、使用

  1. 代碼接入
    const ConstId = require('本地設備指紋js存放路徑')
    Page({
     onLoad: function () {
       new ConstId({
         appId: '【這里填寫在頂象官網申請到的 AppID】', // 唯一標識,必填
         server: '' // constId 私有化服務接口,選填
       }, (e, id) => {
         if (e) {
           console.log(e)
           return
         }
         console.log('constId:', id)
       })
     }
    })
  2. SaaS用戶在小程序后臺配置業務域名https://constid.dingxiang-inc.com,私有化用戶配置部署域名,測試階段可以開啟微信開發者工具右上角詳情->本地設置->“不校驗域名”。

七、后端接入

7.1 第一步 申請AppId


  • 開通服務后可在實時風險決策的二級菜單“應用管理”中獲取到AppId、AppSecret。

7.2 第二步 下載SDK并接入


  • 非maven項目

    JAVA6版本SDK下載點擊下載, JAVA7、8版本SDK下載點擊下載, 如需其他版本SDK請聯系在線客服。

  • maven項目引入依賴(Java7及以上版本)

    <dependency>
      <groupId>com.dingxiang-inc</groupId>
      <artifactId>ctu-client-sdk</artifactId>
      <version>2.0</version>
    </dependency>
  • PHP版本SDK下載:點擊下載

  • C#版本SDK下載 支持.net framework 4.0:點擊下載

  • Python版本SDK下載: 點擊下載

  • NodeJS版本SDK參考下方示例,直接從npm安裝

  • Go版本SDK

  • 接入事件的event_code和事件需要的參數,請咨詢頂象技術人員或官網在線客服

7.3 返回參數說明

CtuRequest: 風控引擎的請求類,包含一次請求的所有業務數據

字段名稱類型是否必須說明
eventCodeString事件的唯一編碼,由頂象提供
flagString請求標記,客戶端可以標記該次請求
dataMap<String, object>Map結構,包含該次請求的業務數據

CtuResponse:風控引擎返回的結果類,包含引擎返回的識別結果

字段名稱類型說明
uuidString服務端返回的請求標識碼,供服務端排查問題
statusString服務端返回的狀態
resultCtuResult服務端返回的識別結果類

CtuResponse status狀態說明

狀態code描述出現的場景
SUCCESS成功調用成功無誤
INVALID_REQUEST_PARAMS請求不合法,缺少必須參數1. 請求url中缺少sign參數
2. 缺少AppId
3. 缺少eventCode
4. 缺少執行策略過程中的某些字段指標, 在這種情況下會額外返回錯誤描述信息在CtuResult中extraInfo的ruleeval_error和errorpolicy, 標識發生在哪條策略, 哪條規則
INVALID_REQUEST_BODY請求不合法,請求body為空請求中沒有傳CtuRequest對象
INVALID_REQUEST_NO_EVENT_DATA請求不合法,請求事件的數據為空請求中沒有傳業務數據, CtuRequest.data`
INVALID_REQUEST_SIGN請求簽名錯誤請求簽名校驗失敗
INVALID_APP_KEY不合法的AppId找不到傳入的AppId
INVALID_EVENT_CODE不合法的事件傳入的事件Code有誤
INVALID_APP_EVENT_RELATION應用和事件的綁定關系錯誤傳入的 AppId和事件Code沒有關聯關系
EVENT_GRAY_SCALE事件有灰度控制,非灰度請求事件設置了灰度值, 本次請求非灰度請求
POLICY_HAS_ERROR防控策略配置有錯誤執行策略過程中發生異常
NOT_SUPPORTED_POLICY_OPERATOR不支持防控策略里的操作符某個策略中使用的操作符不存在
SERVICE_INTERNAL_ERROR服務器內部錯誤執行過程中產生了異常, 在這種情況下會額外返回錯誤描述信息在CtuResult中extraInfo的exceptionmsg
QPS_EXCEEDING_MAXIMUM_THRESHOLD并發超過限制流量過大時,服務端會進行限流,超出部分流量返回ACCEPT

CtuResult 字段解釋

字段名稱類型說明
riskLevelRiskLevel類該次請求的風險級別,枚舉類型,包括 ACCEPT(無風險,建議放過),REVIEW(不確定,需要進一步審核),REJECT(有風險,建議拒絕)
riskTypeString風險類型,例如 垃圾注冊,賬號盜用
hitPolicyCodeString命中的策略code
hitPolicyNameString命中的策略標題
hitRulesList命中的規則列表,每個規則包括規則id和左變量
suggestPoliciesList建議的防控策略
suggestionList命中策略處置建議
flagString客戶端請求帶上來的標記
extraInfoMap<String, Object>附加信息

7.4 示例代碼


  • JAVA版
/**
 * 風控引擎url
 **/
public static final String url = "https://sec.dingxiang-inc.com/ctu/event.do";
/**
 * 應用AppId,公鑰
 **/
public static final String appId = "你的AppId";
/**
 * 應用AppSecret,私鑰
 **/
public static final String appSecret = "你的AppSecret";

public static void checkRisk() throws Exception {
    /**業務請求數據**/
    Map<String, Object> data = new HashMap<>();
    data.put("const_id", "exxxxxxwbZsF1PqoflWOyhKLIhAzw9X1"); // 設備指紋token,端上獲取 傳入后臺
    data.put("user_id", 456799324); // 用戶ID
    data.put("phone_number", "13800138000"); // 手機號
    data.put("source", 2); // 登錄來源
    data.put("ip", "127.0.0.1"); // 請求的ip地址

    data.put("activity_id", 1); // 活動ID
    data.put("register_date", "注冊時間,時間格式2017-09-27 10:09:20"); //用戶注冊時間
    data.put("ext_answer_end_date","答題結束時間,時間格式2017-09-27 10:09:20"); //答題結束時間
    data.put("ext_answer_start_date", "答題開始時間,時間格式2017-09-27 10:09:20"); //答題開始時間
    data.put("ext_open_id", "xxxxxea3174dde1f"); //微信登錄id
    data.put("ext_user_level", 5); //會員等級
    data.put("ext_prov_name", "北京市"); //手機所屬省份

    /**創建一個請求數據實例**/
    CtuRequest request = new CtuRequest();
    /**設置事件編碼**/
    request.setEventCode("activity_event");
    /**設置該次風控請求的業務數據**/
    request.setData(data);
    request.setFlag("activity_" + System.currentTimeMillis());
    /**創建一個客戶端實例**/
    CtuClient client = new CtuClient(url, appId, appSecret);
   /** CtuClient client = new CtuClient(url,appKey,appSecret, connectTimeout, connectionRequestTimeout,socketTimeout)
     用戶可以自定義超時設置
     connectTimeout,connectionRequestTimeout,socketTimeout 單位:毫秒
     默認超時設置均為2000毫秒     
     **/
    /**向風控引擎發送請求,獲取引擎返回的結果**/
    CtuResponse response = client.checkRisk(request);
    if (RiskLevel.ACCEPT.equals(response.getResult().getRiskLevel())) {
        System.out.printf(JSON.toJSONString(response));
        //... 業務代碼,當前請求沒有風險
    } else if (RiskLevel.REVIEW.equals(response.getResult().getRiskLevel())) {
        System.out.printf(JSON.toJSONString(response));
        //... 業務代碼,當前請求有一定風險,建議復審
    } else if (RiskLevel.REJECT.equals(response.getResult().getRiskLevel())) {
        System.out.printf(JSON.toJSONString(response));
        //... 業務代碼,當前請求有風險,建議拒絕
    }
}
  • PHP版
include "./CtuClient.php";

$url = "https://sec.dingxiang-inc.com/ctu/event.do";
$appId = "你的AppId";
$appSecret = "你的AppSecret";

// 時區
ini_set('date.timezone','Asia/Shanghai');

// 構造請求參數
$request = new CtuClient($url, $appId, $appSecret);
$reqJsonString =  json_encode($request, JSON_UNESCAPED_UNICODE);
$ctuRequest = new CtuRequest();

// $data 具體的業務參數,根據業務實際情況傳入
$data = array (
  "const_id" => "exxxxxxKgiPKBMmcwbZsF1PqoflWOyhKLIhAzw9X1",  // 設備指紋token,端上獲取 傳入后臺
  "user_id" => "438888824",
  "phone_number" => "13800138000", 
  "source" => 2, 
  "activity_id" => 1, 
  "ext_prov_name" => "北京市",
  "register_date" => date('Y-m-d H:i:s'), 
  "ext_answer_end_date" => date('Y-m-d H:i:s'),
  "ext_answer_start_date" => date('Y-m-d H:i:s'),
  "ext_user_level" => 5,
  "ext_open_id" => "58888888174dde1f", 
  "ip" => "127.0.0.1"
);

// $eventCode 事件code
$ctuRequest -> eventCode = "activity_event";
$ctuRequest -> flag = "activity_" . time();
$ctuRequest -> data = $data;

// 請求超時時間,單位秒
$timeout = 1;
//調用風控引擎
$responseData = $request -> checkRisk($ctuRequest, $timeout);
echo "風險引擎返回結果:" . $responseData. "\n";
$jsonResult = json_decode($responseData, true);
$result = $jsonResult['result']["riskLevel"];

// ... 根據不同風險做出相關處理
if ($result == "ACCEPT") {
    // 無風險,建議放過
    echo "風險結果:無風險,建議放過" . "\n";
} else if ($result == "REVIEW") {
    // 不確定,需要進一步審核
    echo "風險結果:不確定,需要進一步審核" . "\n";
} else if ($result == "REJECT") {
    // 有風險,建議拒絕
    echo "風險結果:有風險,建議拒絕" . "\n";
}
  • C#版
String appId = "560074aad5xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
 /**應用AppId,公鑰**/

String appSecret = "ea2662cxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
/**應用AppSecret,私鑰**/

String url = "https://sec.dingxiang-inc.com/ctu/event.do"; 
/** 風控引擎url**/
CtuClient ctuClient = new CtuClient(url, appId, appSecret);

Dictionary<string, string> data = new Dictionary<string, string>();
/**業務請求數據,根據實際情況傳入**/
data.Add("const_id", "exxxxxxKgiPKBMmcwbZsF1PqoflWOyhKLIhAzw9X1");// 設備指紋token,端上獲取 傳入后臺
data.Add("user_id", "438888824");
data.Add("ext_referer", "ext_refererext_referer");
data.Add("phone_number", "1801002000");
data.Add("ip", "123.21.21.12");
data.Add("time", "2016-10-15 20:12:12"); //時間格式 
CtuRequest ctuRequest = new CtuRequest();
ctuRequest.data = data;
ctuRequest.eventCode = "your event code";
ctuRequest.flag = "自定義標記,可以用uuid";
CtuResponse response = ctuClient.CheckRisk(ctuRequest);

/**向風控引擎發送請求,獲取引擎返回的結果**/
if (String.Equals(response.result.RiskLevel, "ACCEPT"))
{
     //... 業務代碼,當前請求沒有風險
}
else if (String.Equals(response.result.RiskLevel, "REVIEW"))
{
    //... 業務代碼,當前請求有一定風險,建議復審
}
else if (String.Equals(response.result.RiskLevel, "REJECT"))
{
    //... 業務代碼,當前請求有風險,建議拒絕
}
  • Python 版
# coding=utf-8
import json
from CtuRequest import CtuRequest
from CtuClient import CtuClient
from RiskLevel import RiskLevel

class Demo:
    URL = "https://sec.dingxiang-inc.com/ctu/event.do"
    #風控引擎url
    APP_ID = 'appId'
    #應用AppId,公鑰
    APP_SECERT = 'appSecret'
    #應用AppSecret,私鑰
    if __name__ == '__main__':
        event_code = 'event_code'
        flag = 'test1'
        data = { #業務請求數據,根據實際情況傳入
            'const_id': 'constId', #設備指紋token,端上獲取 傳入后臺
            'user_id': '123',
            'phone_number': '15700000000',
            'ip': '127.0.0.1'
        }
        ctuRequest = CtuRequest(event_code, flag, data)
        client = CtuClient(URL, APP_ID, APP_SECERT)
        #client.timeout = 2
        #設置超時時間 默認兩秒
        ctuResponse = client.checkRisk(ctuRequest)
        #向風控引擎發送請求,獲取引擎返回的結果
        print ctuResponse
        if ctuResponse["result"]["riskLevel"] == RiskLevel.ACCEPT:
            print "當前請求沒有風險"
            pass
        elif ctuResponse["result"]["riskLevel"] == RiskLevel.REVIEW:
            print "當前請求有一定風險,建議復審"
            pass
        elif ctuResponse["result"]["riskLevel"] == RiskLevel.REJECT:
            print "當前請求有風險,建議拒絕"
            pass
  • NodeJS版本
npm install dx-ctu-client-sdk --save
const ClientSDK = require('dx-ctu-client-sdk')

const sdk = new ClientSDK('服務url', '您的appId', '您的appSecret')

sdk.checkRisk({
  "data": {
    "phone_number": "17800000000",
    "user_id": "12345326232",
    "ip": "125.121.232.219",
    "const_id": "N4RG6TtsY6ILK5ePY6HVtjj12pu5Yi5wnjnbaUI41" // 設備指紋token,端上獲取 傳入后臺
  },
  "eventCode": "test_event_1",
  "flag": "test1"
}).then((resp) => {
  const level = resp.result.riskLevel

  if (level === 'ACCEPT') {
    // 業務代碼,當前請求沒有風險
  } else if (level === 'REVIEW') {
    // 業務代碼,當前請求有一定風險,建議復審
  } else if (level === 'REJECT') {
    // 業務代碼,當前請求有風險,建議拒絕
  }
})

// 設置超時時間
// checkRisk第二個參數為超時時間,默認為2000(2秒)
400-8786-123
QQ在線咨詢
在線咨詢
大发888真人