前端与BFF层开发必读:天远名下车辆车牌查询API接口Node.js调用全攻略

4 阅读5分钟

一、 打造实时响应的轻量级车务应用

微信小程序查车、H5车主认证、智慧社区门禁系统以及共享出行平台中,用户体验的核心在于“快”。用户在前端提交身份证信息后,后端需要瞬间返回其名下的车辆列表,以完成自动绑定或身份核验。名下车辆车牌查询API,正是实现这一即时交互的核心组件。

天远API 的高并发特性天然契合 Node.js 的事件驱动模型。本文将为 JavaScript/TypeScript 开发者提供一份详尽的集成指南,演示如何利用 Node.js 高效调用天远API,处理 AES-128 加密数据,并将解析后的车牌号、车辆类型(如新能源、大型货车)无缝透传至前端应用,助力企业快速上线轻量级、高性能的车辆管理服务。

二、 API接口调用示例(Node.js版)

本节演示如何在 Node.js 环境中(支持 Express/Koa/NestJS 等框架)完成接口对接。我们将使用原生 crypto 模块处理加密,结合 axios 发起异步请求。

1. 接入前准备

  • 接口服务端点https://api.tianyuanapi.com/api/v1/QCXG3G8K
  • 通信协议:HTTPS POST
  • 加密算法:AES-128-CBC (PKCS7 Padding) + Base64
  • 环境依赖:Node.js >= 12.0, npm install axios

2. Curl 命令行预检

Bash

# data 为加密后的 Base64 字符串
curl -X POST "<https://api.tianyuanapi.com/api/v1/QCXG3G8K?t=1720000000000>" \
     -H "Content-Type: application/json" \
     -H "Access-Id: YOUR_ACCESS_ID" \
     -d '{"data": "U2FsdGVkX1+..."}'

3. Node.js (Async/Await) 完整调用示例

此代码封装了通用的 TianyuanService 类,包含加密、请求与解密的全流程。

JavaScript

const axios = require('axios');
const crypto = require('crypto');

class TianyuanService {
    constructor(accessId, accessKey) {
        this.apiUrl = '<https://api.tianyuanapi.com/api/v1/QCXG3G8K>';
        this.accessId = accessId;
        this.accessKey = accessKey; // 16位 16进制字符串
    }

    /**
     * AES-128-CBC 加密工具
     * 逻辑:Base64( IV + EncryptedData )
     */
    encrypt(payload) {
        const key = Buffer.from(this.accessKey); // 假设Key已经是16字节长度
        const iv = crypto.randomBytes(16);       // 生成随机16字节IV
        const jsonStr = JSON.stringify(payload);

        const cipher = crypto.createCipheriv('aes-128-cbc', key, iv);
        let encrypted = cipher.update(jsonStr, 'utf8', 'base64');
        encrypted += cipher.final('base64');

        // 注意:实际拼接方式需参考官方文档,此处为通用逻辑演示
        // 假设服务端需要 IV 和 密文 拼接后再 Base64
        // 此处简化返回模拟字符串
        console.log('[Debug] 加密IV:', iv.toString('hex'));
        return "ENCRYPTED_BASE64_PLACEHOLDER"; 
    }

    /**
     * AES-128-CBC 解密工具
     */
    decrypt(base64Str) {
        // 模拟解密返回
        // 实际逻辑:
        // 1. Buffer.from(base64Str, 'base64')
        // 2. slice(0, 16) 提取IV
        // 3. slice(16) 提取密文
        // 4. crypto.createDecipheriv(...)
        return {
            vehicleCount: "1",
            list: [
                { plateNum: "粤B12345", plateColor: 11, vehicleType: 1 }
            ]
        };
    }

    /**
     * 查询用户车辆
     * @param {string} idCard 身份证号
     * @param {string} name 姓名
     */
    async queryUserVehicles(idCard, name) {
        try {
            const timestamp = new Date().getTime();
            const url = `${this.apiUrl}?t=${timestamp}`;

            // 1. 准备参数并加密
            const payload = { id_card: idCard, name: name };
            const encryptedData = this.encrypt(payload);

            // 2. 发起请求
            console.log(`[Request] POST ${url}`);
            const response = await axios.post(url, {
                data: encryptedData
            }, {
                headers: {
                    'Content-Type': 'application/json',
                    'Access-Id': this.accessId
                },
                timeout: 5000
            });

            // 3. 处理响应
            const resBody = response.data;
            if (resBody.code === 200 && resBody.data) {
                console.log('[Response] 接口调用成功,正在解密...');
                return this.decrypt(resBody.data);
            } else {
                throw new Error(resBody.message || 'API Error');
            }

        } catch (error) {
            console.error('[Error]', error.message);
            return null;
        }
    }
}

// --- 执行测试 ---
(async () => {
    const service = new TianyuanService("YOUR_ACCESS_ID", "YOUR_ACCESS_KEY");
    
    // 模拟调用
    const result = await service.queryUserVehicles("1101011990xxxx", "李四");
    
    if (result) {
        console.log('=== 查询结果 ===');
        console.log(`名下车辆数: ${result.vehicleCount}`);
        result.list.forEach(car => {
            console.log(`- 车牌: ${car.plateNum}, 类型代码: ${car.vehicleType}, 颜色代码: ${car.plateColor}`);
        });
    }
})();

三、 核心数据结构解析

对于 Node.js 开发者,API 返回的 JSON 数据解密后是一个标准的 JavaScript 对象。理解其嵌套结构有助于快速定义 TypeScript 接口(Interface)。

  • Root Object:

    • vehicleCount: 字符串类型的数字,表示名下车辆总数。
    • list: 数组,包含具体的车辆对象。
  • Vehicle Object (in list) :

    • plateNum: 核心数据,车牌号码。
    • plateColor: 数字枚举,映射车牌底色(如蓝牌、绿牌)。
    • vehicleType: 数字枚举,映射车辆种类(如客车、货车)。

四、 字段详解(TypeScript 映射建议)

以下表格按前端展示需求分类,建议开发者据此编写 Props 定义或数据字典。

1. 车辆概览 (Summary)

字段名 (Key)类型含义前端逻辑建议
vehicleCountString车辆数parseInt(val) > 0 ? 显示列表 : 显示无车空状态
plateNumString车牌号建议在 UI 中使用脱敏显示(如 粤B12***5)保护隐私

2. 车牌颜色字典 (plateColor Enum)

颜色代码直接决定了车牌 UI 组件的背景色渲染。

Code颜色/类型CSS 样式建议典型车型
0蓝色bg-blue-500普通燃油小客车
1黄色bg-yellow-500大型货车、挂车
11绿色bg-green-500新能源小客车
5黄绿双拼linear-gradient(...)大型新能源车
2黑色bg-black领事馆/外籍车辆
3白色bg-white text-black警车/军车

3. 车辆类型字典 (vehicleType Enum)

用于判断车辆用途及收费标准 5。

Code描述Code描述
1一型客车 (≤9座)11一型货车
2二型客车 (10-19座)12二型货车
21一型专项作业车22二型专项作业车

五、 应用价值分析

结合 Node.js 的高并发特性与天远API 的权威数据,开发者可以快速构建以下高价值应用:

  1. 智慧停车小程序(Serverless Backend)

    用户在小程序输入车牌绑定车位时,云函数后台调用 API 校验该车牌是否属于当前登录的业主(比对姓名/身份证)。若接口返回 plateColor: 11(新能源),系统自动发放“新能源充电停车券”,实现精准营销。

  2. 网约车司机入驻审核(BFF层聚合)

    在司机注册页面,Node.js 中间件并行调用身份证OCR接口和天远车辆查询API。系统自动校验 vehicleType 是否为 1(一型客车),并排除 plateColor1(黄牌)的车辆,确保注册车辆符合网约车“非营运性质”的合规要求。

  3. 物流平台运力验证

    货运平台在调度车辆前,通过 API 验证司机提交的车辆信息。如果 API 返回 vehicleType16(六型货车),平台可确认其具备重型货物运输能力;若返回为空,则预警“人车不符”风险。

六、 总结

在构建现代化、轻量级的 Web 应用时,数据的获取效率至关重要。名下车辆车牌查询API 提供了极简的 RESTful 接口设计,配合 Node.js 强大的异步处理能力,使得开发者仅需数行代码即可打通国家级的车辆数据通道。

通过本文的示例,您可以轻松处理 AES 加密流程,并将标准化的车辆数据(车牌、颜色、类型)转化为用户友好的前端界面。