流量变现利器:基于PHP的天远车辆出险查询API调用代码与场景分析

5 阅读4分钟

一、 快速构建高性价比的车况查询应用

微信公众号开发、CMS(内容管理系统)插件以及独立垂直查询网站的建设中,PHP 凭借其部署简单、开发速度快的特点,依然是众多开发者的首选。对于希望快速验证商业模式或为车商提供轻量级查询工具的开发者来说,车辆出险查询API 是核心的数据引擎。

天远车辆出险查询API提供了极简的 HTTP 接入方式,非常适合 PHP 这种“随写随用”的脚本语言。本文将作为一份面向 PHP 开发者的实战文档,详细演示如何使用 PHP 原生代码处理 AES 加密、发起 POST 请求,并将复杂的 JSON 数据转化为直观的 HTML 页面,帮助开发者以最低的成本接入天远API,快速上线车辆历史记录查询功能。

二、 API接口调用示例(PHP版)

本节演示如何在 PHP 环境中(支持 PHP 7.x/8.x)完成接口对接。我们将使用 PHP 标准库中的 curl 组件和 openssl 扩展,无需安装复杂的依赖包。

1. 接入前准备

  • 接口地址https://api.tianyuanapi.com/api/v1/QCXGP00W
  • 加密方式:AES-128-CBC + Base64
  • 必要扩展ext-curl, ext-openssl, ext-json

2. Curl 命令行预检

确保服务器网络环境正常,可以使用 Curl 简单测试。

Bash

curl -I "https://api.tianyuanapi.com/api/v1/QCXGP00W?t=1720000000"

3. PHP 完整调用示例

此代码包含了一个封装好的 TianyuanClient 类,实现了从加密请求到解密响应的完整闭环。

PHP

<?php

class TianyuanClient {
    private $apiUrl = "https://api.tianyuanapi.com/api/v1/QCXGP00W";
    private $accessId;
    private $accessKey; // 16字节 16进制字符串

    public function __construct($accessId, $accessKey) {
        $this->accessId = $accessId;
        $this->accessKey = $accessKey;
    }

    /**
     * AES-128-CBC 加密
     * 逻辑:Base64( IV . EncryptedData )
     */
    private function encryptData($data) {
        $key = $this->accessKey; // 确保Key是16字节,如果也是Hex需pack
        // 注意:根据文档,Key通常是16进制字符串,使用时可能需要转为二进制或直接使用
        // 此处假设 Key 已经是符合 AES-128 要求的 16 字节长度字符串
        
        $iv = openssl_random_pseudo_bytes(16); // 生成随机IV
        $jsonStr = json_encode($data);

        // AES 加密 (OPENSSL_RAW_DATA 返回原始二进制数据)
        $encrypted = openssl_encrypt($jsonStr, 'AES-128-CBC', $key, OPENSSL_RAW_DATA, $iv);

        // 拼接 IV 和 密文,然后 Base64
        return base64_encode($iv . $encrypted);
    }

    /**
     * AES-128-CBC 解密
     * 逻辑:提取前16字节IV -> 解密 -> 去除填充
     */
    private function decryptData($base64Str) {
        $raw = base64_decode($base64Str);
        if (strlen($raw) < 17) return null;

        $iv = substr($raw, 0, 16); // 提取IV
        $cipherText = substr($raw, 16); // 提取密文

        $decrypted = openssl_decrypt($cipherText, 'AES-128-CBC', $this->accessKey, OPENSSL_RAW_DATA, $iv);
        return json_decode($decrypted, true);
    }

    /**
     * 发起查询
     */
    public function query($vin, $plateNo = '', $photoBase64 = '', $callbackUrl = '') {
        $params = [
            'vin_code' => $vin,
            'plate_no' => $plateNo,
            'return_url' => $callbackUrl,
            'vlphoto_data' => $photoBase64
        ];

        // 1. 加密
        $encryptedData = $this->encryptData($params);

        // 2. 构造请求
        $timestamp = (string)(time() * 1000);
        $url = $this->apiUrl . "?t=" . $timestamp;
        
        $postData = json_encode(['data' => $encryptedData]);

        // 3. 发送 CURL
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
        curl_setopt($ch, CURLOPT_HTTPHEADER, [
            'Content-Type: application/json',
            'Access-Id: ' . $this->accessId
        ]);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        
        $response = curl_exec($ch);
        $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        curl_close($ch);

        // 4. 处理响应
        if ($httpCode == 200) {
            $resArr = json_decode($response, true);
            if (isset($resArr['data']) && !empty($resArr['data'])) {
                // 解密返回数据
                return $this->decryptData($resArr['data']);
            } else {
                return ['error' => $resArr['message'] ?? 'Unknown Error'];
            }
        } else {
            return ['error' => "HTTP Request Failed: $httpCode"];
        }
    }
}

// --- 调用示例 ---
// 替换为您的真实ID和Key
$client = new TianyuanClient("YOUR_ACCESS_ID", "YOUR_16_BYTE_KEY");

// 模拟数据
$vin = "LNVxxxxxx";
$result = $client->query($vin, "京A88888", "base64_image...", "http://yoursite.com/notify");

// 输出结果
echo "<pre>";
if (isset($result['error'])) {
    echo "查询失败: " . $result['error'];
} else {
    echo "=== 查询成功 ===\n";
    echo "品牌: " . $result['clxx']['brandName'] . "\n";
    echo "是否火烧: " . ($result['ckxx']['isFire'] ? '是' : '否') . "\n";
    print_r($result);
}
echo "</pre>";

?>

三、 核心数据结构解析

PHP 的数组处理能力极强,天远API 返回的 JSON 解码后即为关联数组(Associative Array),可以直接在模板引擎(如 Smarty、Blade)或原生 PHP 页面中遍历渲染。

  • ckdlpc (车况概览数组):包含 type1type7,对应骨架、外观、发动机等。
  • clxx (基础信息数组):车辆出厂参数,key-value 形式,易于展示。
  • pzlsmx (碰撞记录数组):包含 records 子数组,每个元素是一次维修记录。
  • tjxx (统计信息数组)claimCount(出险次数)、totalAmount(总金额)等关键数字。

四、 字段详解

以下表格对应 PHP 代码中 $result 数组的键名,方便开发者快速输出。

1. 车辆基础

数组键名 (Key)含义PHP处理建议
brandName品牌echo $res['clxx']['brandName'];
vehicleStyle车型可能较长,建议截取或换行显示
regDate上牌日期可使用 strtotime 格式化日期
properties性质判断是否包含"营运"字样进行警告
warning警示if ($val == 1) echo '<span style="color:red">警</span>';

2. 重大事故排查

数组键名 (Key)模块含义状态值
type1ckdlpc骨架状态0:正常, 4:碰撞异常
type4ckdlpc火烧状态0:正常, 2:疑似, 4:异常
isFloodckxx水淹判定0:否, 1:是
recordlwriteoffckxx注销记录1:是 (全损车)

3. 维修金额明细

数组键名 (Key)含义备注
serviceSumMoney总维修额单位:分。建议 number_format($val/100, 2)
serviceSumCount总次数整数
records记录列表需使用 foreach 循环输出

五、 应用价值分析

对于 PHP 开发者和中小企业,天远API 是低成本切入汽车后市场数据的金钥匙:

  1. 微信公众号/小程序后端:

    利用 PHP 快速开发公众号菜单功能。用户发送车架号,PHP 后端调用 API,将 retdata 中的核心信息(如:无事故、维修金额3000元)打包成图文消息返回,实现“秒级查车”。

  2. WordPress/帝国CMS 插件开发:

    开发通用的“车况查询插件”,嵌入到二手车商的企业官网中。通过简单的短代码 [vin_query] 即可在页面生成查询框,利用 pzlsmx 数据生成精美的 HTML 报表,提升网站专业度。

  3. 独立查询站群 (SEO):

    利用 PHP 的动态生成能力,根据 API 返回的 brandName 和 vehicleStyle 批量生成长尾关键词页面(如“2018款宝马3系维修记录查询”),结合天远API 的实时数据,构建高权重的垂直查询站点。

  4. 线下门店辅助工具:

    为二手车行开发内部使用的 H5 工具。收车员在现场通过手机上传行驶证,PHP 后端识别并查询 ckxx 中的 isLargeCost(大额赔偿)和 warning 字段,辅助快速定价,避免收错车。

六、 总结

在追求效率与成本平衡的开发场景中,PHP 依然是王者。天远车辆出险查询API 提供的标准化 HTTP 接口与 PHP 的生态完美融合,使得开发者无需复杂的配置,仅需一个文件即可跑通全流程。

通过本文的 PHP 代码示例,您可以快速打通数据的加密传输与解密展示环节。建议开发者在实际业务中,结合 Redis 缓存查询结果(以 VIN 码为 Key),既能提升用户体验,又能有效降低 API 重复调用成本。拥抱天远API,用最简洁的代码挖掘汽车大数据的无限价值。