打造智能风控中台:以Node.js重构数据聚合层
在现代 Fintech 应用架构中,前端业务极其灵活,往往需要后端快速响应不同场景的风控需求。传统的做法是后端分别请求身份核验、反欺诈、司法等多个接口,然后组装数据,这容易导致接口延迟高、数据格式混乱。
天远数据 的 天远贷前风险报告接口 (代码 COMBTY16)采用了"All-in-One"的组合包模式。对于 Node.js 开发者而言,这简直是福音------你可以直接利用 JavaScript 对 JSON 的强大处理能力,在中间层(Middleware)快速清洗出业务所需的"红绿灯"信号,将复杂的原始数据转化为前端易读的 Risk Profile。
本文将演示如何在 Node.js (TypeScript) 环境下对接该接口,并重点解析 3C租赁 与 实名核验 场景的数据处理。
TypeScript 集成实战:类型安全的接口调用
在 Node.js 中,我们通常使用 axios 或 got 发起请求。为了保证代码的健壮性,首先需要根据 API 文档定义请求与响应的 TypeScript 接口。
1. 定义核心类型 (Typing)
天远 API 的参数和响应结构非常清晰,利用 Interface 可以避免"魔法字符串"带来的维护噩梦。
TypeScript
jsx
// types/tianyuan.ts
// 1. 请求参数结构
export interface RiskReportRequest {
name: string; // 姓名 [cite: 1]
mobile_no: string; // 手机号码 [cite: 1]
id_card: string; // 身份证号码 [cite: 1]
authorization_url: string; // 授权书URL (必填) [cite: 1]
authorized: "0" | "1"; // 是否授权 (1-已授权) [cite: 1]
user_type?: "1" | "2" | "3"; // 关系类型 [cite: 1]
vehicle_type?: "0" | "1" | "2"; // 车辆类型 [cite: 1]
}
// 2. 响应组合包结构
export interface CombineResponse {
responses: SubProduct[]; // 子产品响应列表
}
export interface SubProduct {
api_code: string; // 子产品代码
success: boolean; // 调用是否成功
data: any | null; // 子产品响应数据
error?: string; // 错误信息
}
// 3. 定义具体的子产品数据结构 (以实名核验为例)
export interface StandLiveInfo {
finalAuthResult: "0" | "1"; // 实名核验结果 0:一致
verification: "0" | "1"; // 三要素核验
inTime: string; // 在网时长
}
2. 封装 API Client
在 Node.js 中,处理加密和 Base64 编码非常简单。
TypeScript
jsx
import axios from 'axios';
import { RiskReportRequest, CombineResponse } from './types/tianyuan';
// 模拟加密函数 (实际请参考官方文档实现AES)
const encryptData = (jsonStr: string): string => {
// 占位:AES加密逻辑
const buffer = Buffer.from(jsonStr, 'utf-8');
return buffer.toString('base64'); // Base64编码 [cite: 1]
};
export const fetchRiskProfile = async (userInfo: RiskReportRequest) => {
const API_URL = 'https://api.tianyuanapi.com/api/v1/COMBTY16';
const timestamp = Date.now(); // 13位时间戳 [cite: 1]
try {
// 1. 序列化并加密
const rawData = JSON.stringify(userInfo);
const encryptedData = encryptData(rawData);
// 2. 发起 POST 请求
const response = await axios.post<CombineResponse>(
`${API_URL}?t=${timestamp}`,
{
data: encryptedData // 放入请求体 data 字段 [cite: 1]
},
{
headers: { 'Content-Type': 'application/json' },
timeout: 10000 // 10秒超时
}
);
// 3. 初步校验响应结构
if (response.data && Array.isArray(response.data.responses)) {
return response.data.responses;
}
throw new Error('Invalid API Response Structure');
} catch (error) {
console.error('Tianyuan API Error:', error);
return null;
}
};
异步数据清洗:从"组合包"到"业务画像"
Node.js 最擅长的就是处理 JSON。接口返回的 responses 数组包含多个子产品,我们需要将其"清洗"为业务更关注的扁平化结构。
1. 身份核验 (KYC) - 守门员
子产品代码 : DWBG8B4D (data字段中的 standLiveInfo)
这是所有业务的第一道防线。在 Node.js 中,我们可以快速提取并校验:
finalAuthResult: 实名核验结果。只有当返回"0"(一致) 时,才继续后续流程。inTime: 手机在网时长。- 值
0: [0,3) 个月。新号,风险极高。 - 值
99: 手机状态异常/离网。 - 开发者应拒绝
inTime为0或99的用户。
- 值
2. 租赁/分期风险评估 - 场景化风控
子产品代码 : DWBG8B4D (data字段中的 leasingRiskAssessment)
针对手机租赁、3C分期等特定场景,天远 API 提供了非常细致的维度。
| 关键字段 | 类型 | 业务含义 | 开发者注意 (Dev Note) |
|---|---|---|---|
riskFlag |
int | 风险标识 | 1=高风险,2=低风险。最直接的判断依据。 |
threeCPlatformApplicationCountLast7Days |
String | 3C平台近7天申请数 | 短期内频繁申请3C产品,极大概率是"撸机党"或急需变现。 |
threeCInstitutionApplicationCountLast3DaysNight |
String | 3C机构近3天夜间申请数 | 夜间(通常指0-6点)高频申请,是典型的异常欺诈行为特征。 |
3. 代码清洗示例
TypeScript
jsx
// 简单的清洗函数,将复杂嵌套转为扁平对象
const cleanRiskData = (responses: any[]) => {
const report: any = {};
// 查找多维报告子产品
const dwbg = responses.find(r => r.api_code === 'DWBG8B4D');
if (dwbg && dwbg.success && dwbg.data) {
const data = dwbg.data;
// 提取身份状态
report.isRealName = data.standLiveInfo?.finalAuthResult === '0'; //
// 提取租赁风险
report.leasingRisk = {
isHighRisk: data.leasingRiskAssessment?.riskFlag === 1, //
nightApplyCount: data.leasingRiskAssessment?.threeCInstitutionApplicationCountLast3DaysNight || "0" //
};
// 提取反欺诈分
report.scores = {
fraud: data.fraudScore, //
credit: data.creditScore //
};
}
return report;
};
业务价值延伸:构建实时阻断策略
利用 天远贷前风险报告接口 的数据,结合 Node.js 的事件驱动特性,我们可以实现毫秒级的实时阻断。
策略一:夜间高危行为拦截
在 3C 租赁场景中,利用 leasingRiskAssessment 数据。如果用户在凌晨 2 点下单,且 API 返回 threeCPlatformApplicationCountLast3DaysNight (近3天夜间申请次数) > 0,系统应自动触发"人脸识别"或"人工复审"流程,而不是直接通过。
策略二:关联风险排查
利用 riskSupervision (关联风险监督) 字段。
- 同身份证关联手机号数 (
rentalRiskListIdCardRelationsPhones): 如果该值过大(例如 > 3),说明同一身份证在短时间内绑定了多个手机号进行申请,这是典型的团伙欺诈特征。开发者应在后端设置阈值报警。
结语
通过 Node.js 集成 天远贷前风险报告接口,我们不仅是完成了一次 API 调用,更是构建了一个轻量级、响应迅速的风控中台。
该接口提供的 组合包 (responses) 结构 10极大地减少了前后端的交互次数。对于全栈开发者而言,建议在 BFF 层将 fraudScore 、leasingRiskAssessment 等核心指标进行标准化清洗,为前端提供简单直观的 pass 或 reject 信号,从而提升用户体验并保障业务安全。