话接上文:【Part 1】连续更新:实时风控决策系统的对接之前端接入

今天我们来说一下风控决策系统的后端对接。也就是上接原文的第三步。

Step 3:后端接入

1 第一步 申请AppId

开通服务后可在实时风险决策的二级菜单“应用管理”中获取到AppId、AppSecret。

2 第二步 下载SDK并接入

  • 非maven项目

    JAVA6版本SDK下载点击下载.jar ),

    JAVA7、8版本SDK下载点击下载.jar )。

  • maven项目引入依赖(Java7及以上版本)
<dependency>
  <groupId>com.dingxiang-inc</groupId>
  <artifactId>ctu-client-sdk</artifactId>
  <version>2.2</version>
</dependency>

接入事件的event_code和事件需要的参数,请咨询官网在线客服

3 返回参数说明

CtuRequest: 风控引擎的请求类,包含一次请求的所有业务数据

字段名称类型是否必须说明
eventCodeString事件的唯一编码,由顶象提供
flagString请求标记,客户端可以标记该次请求
dataMap<String, object>Map结构,包含该次请求的业务数据
flagStringMap结构,包含该次请求的业务数据

CtuResponse:风控引擎返回的结果类,包含引擎返回的识别结果

字段名称类型说明
uuidString服务端返回的请求标识码,供服务端排查问题
statusString服务端返回的状态
resultCtuResult服务端返回的识别结果类

CtuResponse status状态说明

状态code描述出现的场景
SUCCESS成功调用成功无误
INVALID_REQUEST_PARAMS请求不合法,缺少必须参数1. 请求url中缺少sign参数 2. 缺少AppId 3. 缺少eventCode 4. 缺少执行策略过程中的某些字段指标, 在这种情况下会额外返回错误描述信息在CtuResult中extraInfo的_rule_eval_error和_error_policy, 标识发生在哪条策略, 哪条规则
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的_exception_msg
QPS_EXCEEDING_MAXIMUM_THRESHOLD并发超过限制流量过大时,服务端会进行限流,超出部分流量返回ACCEPT

CtuResult 字段解释

字段名称类型说明
riskLevelRiskLevel类该次请求的风险级别,枚举类型,包括 ACCEPT(无风险,建议放过),REVIEW(不确定,需要进一步审核),REJECT(有风险,建议拒绝)
riskTypeString风险类型,例如 垃圾注册,账号盗用
hitPolicyCodeString命中的策略code
handleFlagString处置标识
hitPolicyNameString命中的策略标题
handleFlagString处置标识
hitRulesList命中的规则列表,每个规则包括规则id和左变量
suggestPoliciesList建议的防控策略
suggestionList命中策略处置建议
flagString客户端请求带上来的标记
extraInfoMap<String, Object>附加信息

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("register_date", "注册时间,时间格式2017-09-27 10:09:20");
    //涉及时间参数,请勿传date类型,需要转为标准时间格式yyyy-MM-dd HH:mm:ss后以String类型传入
    data.put("ext_amount", "123.456"); // 涉及浮点类型,请转为String类型传入


    /**创建一个请求数据实例**/
    CtuRequest request = new CtuRequest();
    /**设置事件编码**/
    request.setEventCode("event_code");
    request.setData(data);
    request.setFlag("请求唯一标识符,可自定义,可选");
    /**创建一个客户端实例**/
    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,
  "register_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 = "event_code";
$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秒)

以上就是后端接入的大致流程。完成后端接入之后,即可进行调试,并部署上线,最后可以在后台实时看到风险数据。

以上。

实时风控引擎:免费试用


小飞象
80 声望5 粉丝