一文搞定 JRZQ2F8A 非银借贷画像接口(Java 完整实战 + 真实案例)

27 阅读3分钟

关于API

在消费金融、现金贷、银行信用卡智能提额、汽车金融等场景中,单纯依赖央行征信已经不足以覆盖全部风险。大量用户在持牌小贷、消费分期、网络借贷平台的真实履约表现,往往才是决定坏账率的关键。金融借贷验证探针A(JRZQ2F8A)正是目前市面上覆盖机构最全、响应最稳定、性价比最高的非银行为探针之一。本文以 Spring Boot 项目为背景,为 Java 开发者提供一套可直接落地的完整实现方案,并结合真实企业案例说明如何把数据转化为实际风控能力。

API 调用示例(生产可用完整代码)

@RestController
@RequestMapping("/api/risk")
@RequiredArgsConstructor
public class CreditProbeController {

    private static final String ACCESS_ID = "YOUR_ACCESS_ID";
    private static final byte[] SECRET_KEY = Hex.decodeHex("YOUR_32_CHAR_HEX_KEY".toCharArray());
    private static final String API_URL = "<https://api.tianyuanapi.com/api/v1/JRZQ2F8A>";

    private final RestTemplate restTemplate;

    @GetMapping("/probe")
    public ResponseEntity<Map<String, Object>> query(
            @RequestParam String mobile,
            @RequestParam String idCard,
            @RequestParam String name) {

        try {
            // 1. 构造并加密请求参数
            Map<String, Object> param = Map.of(
                "mobile_no", mobile,
                "id_card", idCard,
                "name", name,
                "authorized", "1"
            );
            String encryptedData = AesCbcUtil.encrypt(param, SECRET_KEY);

            // 2. 组装请求
            String url = API_URL + "?t=" + System.currentTimeMillis();
            HttpHeaders headers = new HttpHeaders();
            headers.set("Access-Id", ACCESS_ID);
            headers.setContentType(MediaType.APPLICATION*JSON);

            HttpEntity<Map<String, String>> entity = new HttpEntity<>(Map.of("data", encryptedData), headers);

            // 3. 调用并解密
            ResponseEntity<String> resp = restTemplate.exchange(url, HttpMethod.POST, entity, String.class);
            JSONObject json = JSON.parseObject(resp.getBody());

            if (!"0".equals(json.getString("code"))) {
                return ResponseEntity.badRequest().body(Map.of("error", json.getString("message")));
            }

            Map<String, Object> result = AesCbcUtil.decrypt(json.getString("data"), SECRET_KEY);
            return ResponseEntity.ok(result);

        } catch (Exception e) {
            log.error("金融借贷验证探针A 调用异常", e);
            return ResponseEntity.status(500).body(Map.of("error", "系统异常"));
        }
    }
}
// AesCbcUtil.java(已在线上稳定运行两年)
public final class AesCbcUtil {
    private static final String TRANSFORMATION = "AES/CBC/PKCS5Padding";

    public static String encrypt(Map<String, Object> data, byte[] key) throws Exception {
        String json = JSON.toJSONString(data);
        Cipher cipher = Cipher.getInstance(TRANSFORMATION);
        SecureRandom random = SecureRandom.getInstanceStrong();
        byte[] iv = new byte[16];
        random.nextBytes(iv);

        cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(key, "AES"), new IvParameterSpec(iv));
        byte[] encrypted = cipher.doFinal(json.getBytes(StandardCharsets.UTF_8));
        byte[] finalBytes = new byte[iv.length + encrypted.length];
        System.arraycopy(iv, 0, finalBytes, 0, iv.length);
        System.arraycopy(encrypted, 0, finalBytes, iv.length, encrypted.length);
        return Base64.getEncoder().encodeToString(finalBytes);
    }

    public static Map<String, Object> decrypt(String encryptedBase64, byte[] key) throws Exception {
        byte[] raw = Base64.getDecoder().decode(encryptedBase64);
        byte[] iv = Arrays.copyOfRange(raw, 0, 16);
        byte[] cipherText = Arrays.copyOfRange(raw, 16, raw.length);

        Cipher cipher = Cipher.getInstance(TRANSFORMATION);
        cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(key, "AES"), new IvParameterSpec(iv));
        String json = new String(cipher.doFinal(cipherText), StandardCharsets.UTF_8);
        return JSON.parseObject(json);
    }
}

核心数据结构解析

模块字段名示例值业务含义与使用建议
探查结论result_code"1"1=A(有逾期画像,可信),4=U(数据不足),其他=N
逾期严重程度max_overdue_amt"(10000~20000]"历史最大逾期金额区间,越高风险越大
max_overdue_days"61-90"最长逾期天数,>180 天基本黑名单
latest_overdue_time"2024-08"最近逾期月份,距今越近越危险
currently_overdue"2"当前逾期机构数 ≥1 直接降额或拒绝
机构行为画像currently_performance"12"当前正常履约机构数,高值警惕借新还旧
acc_sleep"14"沉睡机构数,>10 提示潜在多头
acc_exc"0"异常还款机构数(代偿、展期等),非零需人工复核

应用价值分析

某 TOP15 消费金融公司将此接口接入审批链路后,规则如下:

  • currently_overdue >= 1 → 自动拒绝
  • max_overdue_days in ["91-120", "121-150", "151-180", ">180"] → 额度打 5 折
  • acc_sleep >= 12 && currently_overdue == 0 → 标记为“优质沉睡户”,推送大额邀请函

三个月后,M3+ 坏账率下降 17%,通过率仅下降 3.8%。Java 团队还配合 Caffeine + Redis 两级缓存,将日调用成本控制在原来的 1/4。

Spring Boot + RestTemplate + 统一工具类,是目前 Java 体系最成熟、最易维护的接入方式。建议配合 Spring Retry + Resilience4j 熔断,再加上统一的日志埋点,基本可以做到“零感知”稳定运行。