行驶证OCR识别
传入行驶证图片或url地址,智能识别行驶证图片上的文字信息
官网购买的套餐通过API调用时请使用“扣套餐次数”密钥进行调用
请求地址
POSThttps://api.shuxuntech.com/v1/vehicle/ocr
¥0.021元 / 次
阶梯计价,用量越大单价越低
企业认证后额外赠送 666 次调用额度
01 — 接口说明
请求参数与返回结果
所有请求需在 header 中携带签名信息,body 参数按 x-www-form-urlencoded 提交
| 名称 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| appKey | head | string | 是 | 数勋分配appKey |
| timestamp | head | string | 是 | unix时间毫秒值 |
| sign | head | string | 是 | 签名,说明 |
| image | body | string | 否 | 行驶证照片base64,不超过1mb |
| imgUrl | body | string | 否 | 行驶证图片url,不超过1mb |
| cardSide | body | string | 否 | 证件面:FRONT-正页(主页),BACK-副页(副本),不传默认FRONT |
签名算法说明
数勋分配的appKey、当前unix时间毫秒值timestamp、数勋分配的appSecret、 按顺序拼接sha256加密得到sign,查看如下示例
appKey = aaa;timestamp = 1682476904289;appSecret = bbb;sign = sha256(appKey+timestamp+appSecret)02 — 返回说明
返回结构与字段含义
顶层返回 code 与 msg,业务数据在 data 对象内,各字段含义见下方表格
返回字段描述
| 字段名 | 类型 | 描述 |
|---|---|---|
| code | string | 错误码 |
| msg | string | 错误描述 |
| isFee | int | 是否计费(1:计费,0:不计费) |
| seqNo | string | 调用流水号 |
| data | object | 返回数据 |
data对象说明
| 字段名 | 类型 | 描述 |
|---|---|---|
| result | int | 识别结果,详见result扫描结果说明 |
| resultDesc | string | 识别结果描述 |
| info | object | 正页(主页)扫描信息,cardSide为FRONT时返回,副页识别时返回null |
| backInfo | object | 副页(副本)扫描信息,cardSide为BACK时返回,正页识别时返回null |
info对象说明
| 字段名 | 类型 | 描述 |
|---|---|---|
| owner | string | 所有人 |
| issuedBy | string | 发证机关 |
| side | string | 证件面,正页返回“front”,表示是正面 |
| address | string | 地址 |
| vehicleType | string | 车辆类型 |
| registerDate | string | 注册日期,yyyy-MM-dd |
| type | int | 证件版本,返回 3,表示是行驶证 |
| engineNo | string | 发动机号码 |
| issueDate | string | 发证日期 |
| plateNo | string | 车牌号码 |
| useCharacter | string | 使用性质 |
| model | string | 品牌型号 |
| vin | string | 车架号 |
backInfo对象说明
| 字段名 | 类型 | 描述 |
|---|---|---|
| side | string | 证件面,副页返回“back”,表示是副页 |
| type | int | 证件版本,返回 3,表示是行驶证 |
| plateNo | string | 车牌号码 |
| issuedBy | string | 发证机关 |
| address | string | 地址 |
| fileNo | string | 档案编号 |
| subPageCode | string | 副页编号 |
| allowNum | string | 核定载人数 |
| totalMass | string | 总质量 |
| curbWeight | string | 整备质量 |
| loadQuality | string | 核定载质量 |
| totalQuasiMass | string | 准牵引总质量 |
| externalSize | string | 外廓尺寸 |
| fuelType | string | 燃油种类 |
| marks | string | 备注 |
| record | string | 检验记录 |
result扫描结果说明
| 字段名 | 类型 | 描述 |
|---|---|---|
| 1 | 识别成功,有数据 | |
| 2 | 识别成功,无数据 | |
| 3 | 识别失败,无法正确解析、未按要求传入参数、下载图片超时 |
code错误码说明
| code | 说明 |
|---|---|
| 0 | 成功 |
| 1 | 参数错误 |
| 2 | 无记录 |
| 3 | 第三方服务异常 |
| 4 | 签名错误 |
| 5 | 余额不足 |
| 6 | 调用频率超限 |
| 7 | 账号停用 |
| 8 | 接口已停用 |
| 9 | 联系服务商开通接口权限 |
| 10 | ip不在白名单 |
| 11 | 系统异常 |
| 12 | 实名状态错误 |
| 99 | 其他异常,具体返回为准 |
返回示例
正页返回
{ "code": "0", "msg": "成功", "isFee": 1, "seqNo": "q7q3znh36dl0fxugefouneng076l1kpg", "data": { "result": 1, "resultDesc": "识别成功,有数据", "info": { "owner": "杭州***有限公司**分公司", //所有人 "issuedBy": "江苏省**市公安局交通警察支队", //发证机关 "side": "front", //证件面:front-主页,back-副页 "address": "沭阳县***室", //住址 "vehicleType": "小型轿车", //车辆类型 "registerDate": "2016-12-28", //注册日期 "type": 3, //证件类型,3表示行驶证 "engineNo": "GB50***43", //发动机号 "issueDate": "2020-03-27", //发证日期 "plateNo": "苏HD***3", //号牌号码 "useCharacter": "非营运", //使用性质 "model": "吉利***2BEV03", //品牌型号 "vin": "L6T78Y4***0672" //车辆识别代号 }, "backInfo": null }}副页返回
{ "code": "0", "msg": "成功", "isFee": 1, "seqNo": "k2coqz5yr44r9ripd4hanmmik5tmgro4", "data": { "result": 1, "resultDesc": "识别成功,有数据", "info": null, "backInfo": { "side": "back", //证件面:front-主页,back-副页 "type": 3, //证件类型,3表示行驶证 "plateNo": "鲁Q1***P", //号牌号码 "issuedBy": "", //发证机关 "address": "", //住址 "fileNo": "37132***5928", //档案编号 "subPageCode": "375008***9902", //副页编号 "allowNum": "2人", //核定载人数 "totalMass": "--", //总质量 "curbWeight": "10300kg", //整备质量 "loadQuality": "--", //核定载质量 "totalQuasiMass": "38500kg", //准牵引总质量 "externalSize": "6850×2490×3980mm", //外廓尺寸 "fuelType": "柴油", //燃油种类 "marks": "强制报废期止:2032-07-11", //备注 "record": "检验有效期至2025年07月鲁Q柴油" //检验记录 } }}错误返回
{ "code": "1", "msg": "参数错误", "isFee": 0, "seqNo": null, "data": null}03 — 代码示例
七种语言,复制即用
签名规则:sha256(appKey + timestamp + appSecret),下列示例已包含完整签名流程
VehicleOcrDemo.java
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.security.MessageDigest;
/**
* 行驶证OCR - Java 示例代码
* 接口地址:https://api.shuxuntech.com/v1/vehicle/ocr
*
* 说明:本示例只使用 JDK 原生 API(java.net / java.security),不依赖任何第三方 jar 包,
* 也不需要本项目的工具类,复制到本地即可编译运行:
* javac VehicleOcrDemo.java
* java VehicleOcrDemo
*/
public class VehicleOcrDemo {
/** 数勋分配的 appKey,请替换为您自己的 appKey */
private static final String APP_KEY = "您的appKey";
/** 数勋分配的 appSecret,请替换为您自己的 appSecret */
private static final String APP_SECRET = "您的appSecret";
/** 接口地址 */
private static final String API_URL = "https://api.shuxuntech.com/v1/vehicle/ocr";
/** 图片base64 */
private static final String IMAGE = "";
/** 图片url */
private static final String IMG_URL = "";
/** 证件面:FRONT-正页(主页),BACK-副页(副本),不传默认FRONT */
private static final String CARD_SIDE = "FRONT";
public static void main(String[] args) throws Exception {
// 1、当前 unix 时间毫秒值,服务端要求与服务器时间相差不能超过 5 分钟
String timestamp = String.valueOf(System.currentTimeMillis());
// 2、签名:按顺序拼接 appKey + timestamp + appSecret 后做 sha256,得到小写十六进制字符串
String sign = sha256Hex(APP_KEY + timestamp + APP_SECRET);
// 3、业务参数,拼成表单内容
String body = "image=" + urlEncode(IMAGE) + "&" + "imgUrl=" + urlEncode(IMG_URL) + "&" + "cardSide=" + urlEncode(CARD_SIDE);
// 4、发起 POST 请求,appKey、timestamp、sign 放在请求头
HttpURLConnection conn = (HttpURLConnection) new URL(API_URL).openConnection();
conn.setRequestMethod("POST");
conn.setDoOutput(true);
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
conn.setRequestProperty("appKey", APP_KEY);
conn.setRequestProperty("timestamp", timestamp);
conn.setRequestProperty("sign", sign);
conn.setConnectTimeout(10000);
conn.setReadTimeout(20000);
conn.getOutputStream().write(body.getBytes("UTF-8"));
int status = conn.getResponseCode();
// 5、读取返回内容:报错时读错误流,避免只拿到一个异常看不到原因
InputStream in = (status >= 200 && status < 300) ? conn.getInputStream() : conn.getErrorStream();
String result = readAll(in);
conn.disconnect();
System.out.println("HTTP状态码=" + status);
System.out.println("返回结果=" + result);
}
/**
* sha256 加密,返回小写十六进制字符串
* 服务端校验签名用的就是这个算法(小写十六进制)
*/
private static String sha256Hex(String content) throws Exception {
byte[] bytes = MessageDigest.getInstance("SHA-256").digest(content.getBytes("UTF-8"));
StringBuilder sb = new StringBuilder(bytes.length * 2);
for (byte b : bytes) {
sb.append(Character.forDigit((b >> 4) & 0xF, 16));
sb.append(Character.forDigit(b & 0xF, 16));
}
return sb.toString();
}
/** url 编码,中文参数需要编码 */
private static String urlEncode(String value) throws Exception {
return URLEncoder.encode(value, "UTF-8");
}
/** 读取输入流内容 */
private static String readAll(InputStream in) throws Exception {
if (in == null) {
return "";
}
StringBuilder sb = new StringBuilder();
BufferedReader reader = new BufferedReader(new InputStreamReader(in, "UTF-8"));
try {
String line;
while ((line = reader.readLine()) != null) {
sb.append(line);
}
} finally {
reader.close();
}
return sb.toString();
}
}04 — 在线调试
先调通,再决定
用你自己的数据发一次真实请求,表单字段随接口定义自动生成,返回结果附字段注释
POSThttps://api.shuxuntech.com/v1/vehicle/ocr按次计费 · 优先扣套餐次数
请求参数
按接口定义自动生成
- image行驶证照片base64,不超过1mb
- imgUrl行驶证图片url,不超过1mb
- cardSide证件面:FRONT-正页(主页),BACK-副页(副本),不传默认FRONT
appKey / timestamp / sign调用时自动按 sha256 生成,无需手填
appKey=未获取 · timestamp=实时生成 · sign=自动生成
这是真实调用,会消耗套餐次数或账户余额; 请勿用真实证件信息反复试调
调不通时先看这里错误码与返回字段的完整说明见上方「02 — 返回说明」;签名口径与「03 — 代码示例」完全一致,可直接复制使用。
返回结果
点击左侧「提交并调用接口」,参数会就地组装、按文档口径签名后直接请求接口, 返回的 JSON 显示在这里。
在线调试使用你自己的 appKey,按实际调用计费。
返回结果是纯 JSON,字段含义见上方「02 — 返回说明」字段类型与取值说明以「02 — 返回说明」的字段表为准;错误码的完整定义同样在那一节。
05 — 产品价格
阶梯计价,用多少买多少
单次价格随调用量阶梯下降,大档位单价最低
| 调用量 | 价格 | 单价 |
|---|---|---|
| 20 次 | ¥ 0 | ¥ 0 |
| 500 次 | ¥ 15 | ¥ 0.03 |
| 1,000 次 | ¥ 28 | ¥ 0.028 |
| 5,000 次 | ¥ 135 | ¥ 0.027 |
| 10,000 次 | ¥ 260 | ¥ 0.026 |
| 30,000 次 | ¥ 750 | ¥ 0.025 |
| 50,000 次 | ¥ 1,200 | ¥ 0.024 |
| 100,000 次 | ¥ 2,200 | ¥ 0.022 |
| 200,000 次 | ¥ 4,200 | ¥ 0.021 |