Math99 LaTeX 公式渲染、格式转换与OCR识别服务
Math99 面向外部合作方提供 LaTeX 公式的渲染、格式转换与OCR识别能力:前端引入 tiny.math99.js 即可自动渲染页面公式,或通过 LaTeX 编辑器 SDK 编辑、新增单个公式;后端提供 LaTeX 转 SVG / MathML、OCR 识别等开放接口,适合大批量存量公式转换,业务数据统一采用 AES 加密传输。
适合已有大批存量公式需要转换的客户。通过开放接口批量将 LaTeX 转成 SVG / MathML,或识别图片中的公式与文字。
appid 与 partnerInfo 均在此获取。127.0.0.1,用户亦可自行设置:登录 https://latex.processon.com/manage/login 个人管理后台,点击左侧「开发管理」,在右侧添加域名白名单即可。前端接入
公式渲染
引入脚本后,页面中已有的 LaTeX 公式会自动渲染,无需额外调用。
引入方式
方式一:HTML 引用
<head>
<script type="text/javascript" src="https://latex.processon.com/assets/js/tiny.math99.js"></script>
</head> 方式二:JS 引用(推荐,可实时更新)
//js引入
var script = document.createElement('script');
script.type = 'text/javascript';
script.src = 'https://latex.processon.com/assets/js/tiny.math99.js' + "?v="+ (new Date().getTime();
document.getElementsByTagName('head')[0].appendChild(script); 初始化设置
tinymath.init("appID")
备注
公式渲染兼容以下常见富文本编辑器:TinyMCE、CKEditor 4 / CKEditor 5、Quill、wangEditor、UEditor、KindEditor、Simditor、Froala Editor、Summernote、Jodit、ProseMirror、Slate.js、Tiptap、Lexical、Draft.js 等。
公式编辑器
通过 SDK 以 iframe 唤起 LaTeX 公式编辑器:用户在编辑器中输入或编辑公式后点击插入,结果经回调返回。调起编辑器目前仅支持此 SDK 方式。
1. 引入 SDK
在 HTML 文件的 <head> 标签中添加以下代码,引入 po-latex-math99.js 文件:
<script src="https://latex.processon.com/assets/js/po-latex-math99.js"></script> 2. 初始化 SDK
在 HTML 文件的 <script> 标签中调用 PoLatexMath.init() 方法进行初始化:
PoLatexMath.init({
appID: appID,
iframeSrc: 'https://latex.processon.com/feditor',
}, function (data) {
console.log(data)
}); 参数说明:
- appID:您的 应用 ID,需替换为实际值。
- iframeSrc:iframe 的源地址。
3. 打开 LaTeX 编辑器
调用 PoLatexMath.open() 方法打开 iframe,如果需要编辑器回显数据,该方法接收一个对象参数。
传入参数
| 参数名 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
spanId | String | 否 | 无 | 公式锚点唯一标识,可用于后续公式操作定位。 |
content | String | 否 | 无 | 传入 LaTeX 公式内容 |
调用示例
// 打开一个空白编辑器
PoLatexMath.open();
// 在编辑器打开时显示传入的公式
PoLatexMath.open({
spanId: 'latex-123',
content: "$(1 + x)^n \\geq 1 + nx \\quad (x > -1, \\ n \\in \\mathbb{N}^+ ) $",
}); - spanId 需保证在页面中的唯一性,避免不同公式之间产生冲突。
- content 中的 LaTeX 公式语法需符合 LaTeX 标准。
- 调用此方法前,请确保 PoLatexMath SDK 已正确初始化。
4. LaTeX 编辑器返回数据
在公式编辑器中输入 LaTeX 公式后,点击插入按钮,PoLatexMath.init() 回调函数中会有返回数据。
返回参数
| 参数名 | 类型 | 说明 | 是否可能为空 |
|---|---|---|---|
editorType | String | 编辑器类型标识 | 否 |
latexOut | String | 输出 LaTeX 源码 | 否 |
outMathML | String | 输出 MathML 结构化数据 | 否 |
outSvgImage | String | 输出可直接渲染的 SVG | 否 |
spanId | String | 公式所在容器的 DOM 元素 ID(根据调用时传入的 spanId 参数原样返回) | 是 |
返回示例
{
"editorType":"latex",
"latexOut": "$(1 + x)^n \\geq 1 + nx \\quad (x > -1, \\ n \\in \\mathbb{N}^+ )$",
"outMathML": "<math xmlns=\"http://www.w3.org/1998/Math/MathML\">\n <mo class=\"classmath99-latex-svg-g math99-latex-(-1-2\" stretchy=\"false\" style=\"font-family: Symbol, Aa楷宋, AaKaiSong;\">(</mo>\n <mn class=\"classmath99-latex-svg-g math99-latex-1-2-3\" style=\"font-family: "Times New Roman", Aa楷宋, AaKaiSong;\">1</mn>\n <mo class=\"classmath99-latex-svg-g math99-latex-+-4-5\" style=\"font-family: Symbol, Aa楷宋, AaKaiSong;\">+</mo>\n <mi class=\"classmath99-latex-svg-g math99-latex-x-6-7\" style=\"font-family: "Times New Roman", Aa楷宋, AaKaiSong; font-style: italic;\">x</mi>\n <msup>\n <mo class=\"classmath99-latex-svg-g math99-latex-)-7-8\" stretchy=\"false\" style=\"font-family: Symbol, Aa楷宋, AaKaiSong;\">)</mo>\n <mi class=\"classmath99-latex-svg-g math99-latex-n-9-10\" style=\"font-family: "Times New Roman", Aa楷宋, AaKaiSong; font-style: italic;\">n</mi>\n </msup>\n <mo class=\"classmath99-latex-svg-g math99-latex-geq-11-15\" style=\"font-family: Symbol, Aa楷宋, AaKaiSong;\">≥</mo>\n <mn class=\"classmath99-latex-svg-g math99-latex-1-16-17\" style=\"font-family: "Times New Roman", Aa楷宋, AaKaiSong;\">1</mn>\n <mo class=\"classmath99-latex-svg-g math99-latex-+-18-19\" style=\"font-family: Symbol, Aa楷宋, AaKaiSong;\">+</mo>\n <mi class=\"classmath99-latex-svg-g math99-latex-n-20-21\" style=\"font-family: "Times New Roman", Aa楷宋, AaKaiSong; font-style: italic;\">n</mi>\n <mi class=\"classmath99-latex-svg-g math99-latex-x-21-22\" style=\"font-family: "Times New Roman", Aa楷宋, AaKaiSong; font-style: italic;\">x</mi>\n <mstyle scriptlevel=\"0\">\n <mspace width=\"1em\"/>\n </mstyle>\n <mo class=\"classmath99-latex-svg-g math99-latex-(-29-30\" stretchy=\"false\" style=\"font-family: Symbol, Aa楷宋, AaKaiSong;\">(</mo>\n <mi class=\"classmath99-latex-svg-g math99-latex-x-30-31\" style=\"font-family: "Times New Roman", Aa楷宋, AaKaiSong; font-style: italic;\">x</mi>\n <mo class=\"classmath99-latex-svg-g math99-latex->-32-33\" style=\"font-family: Aa楷宋, AaKaiSong;\">></mo>\n <mo class=\"classmath99-latex-svg-g math99-latex--34-35\" style=\"font-family: Symbol, Aa楷宋, AaKaiSong;\">−</mo>\n <mn class=\"classmath99-latex-svg-g math99-latex-1-35-36\" style=\"font-family: "Times New Roman", Aa楷宋, AaKaiSong;\">1</mn>\n <mo class=\"classmath99-latex-svg-g math99-latex-,-36-37\" style=\"font-family: Symbol, Aa楷宋, AaKaiSong;\">,</mo>\n <mtext class=\"classmath99-latex-svg-g math99-latex- -38-40\"> </mtext>\n <mi class=\"classmath99-latex-svg-g math99-latex-n-40-41\" style=\"font-family: "Times New Roman", Aa楷宋, AaKaiSong; font-style: italic;\">n</mi>\n <mo class=\"classmath99-latex-svg-g math99-latex-in-42-45\" style=\"font-family: Symbol, Aa楷宋, AaKaiSong;\">∈</mo>\n <msup>\n <mrow data-mjx-texclass=\"ORD\">\n <mi mathvariant=\"double-struck\" class=\"classmath99-latex-svg-g math99-latex-N-54-55\" style=\"font-family: "Times New Roman", Aa楷宋, AaKaiSong; font-style: normal;\">N</mi>\n </mrow>\n <mo class=\"classmath99-latex-svg-g math99-latex-+-57-58\" style=\"font-family: Symbol, Aa楷宋, AaKaiSong;\">+</mo>\n </msup>\n <mo class=\"classmath99-latex-svg-g math99-latex-)-59-60\" stretchy=\"false\" style=\"font-family: Symbol, Aa楷宋, AaKaiSong;\">)</mo>\n</math>",
"outSvgImage": "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"30.415ex\" height=\"2.53ex\" role=\"img\" focusable=\"false\" viewBox=\"0 -893.3 13443.3 1118.3\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" aria-hidden=\"true\" style=\"vertical-align: -0.509ex;\"><defs><path id=\"MJX-13-TEX-N-A0\" d=\"\"></path><path id=\"MJX-13-TEX-D-2115\" d=\"M20 664Q20 666 31 683H142Q256 683 258 681Q259 680 279 653T342 572T422 468L582 259V425Q582 451 582 490T583 541Q583 611 573 628T522 648Q500 648 493 654Q484 665 493 679L500 683H691Q702 676 702 666Q702 657 698 652Q688 648 680 648Q633 648 627 612Q624 601 624 294V-8Q616 -20 607 -20Q601 -20 596 -15Q593 -13 371 270L156 548L153 319Q153 284 153 234T152 167Q152 103 156 78T172 44T213 34Q236 34 242 28Q253 17 242 3L236 -1H36Q24 6 24 16Q24 34 56 34Q58 35 69 36T86 40T100 50T109 72Q111 83 111 345V603L96 619Q72 643 44 648Q20 648 20 664ZM413 419L240 648H120L136 628Q137 626 361 341T587 54L589 68Q589 78 589 121V192L413 419Z\"></path></defs><g stroke=\"currentColor\" fill=\"currentColor\" stroke-width=\"0\" transform=\"scale(1,-1)\"><g data-mml-node=\"math\"><g data-mml-node=\"mo\" style=\"font-family: Symbol, Aa楷宋, AaKaiSong;\" class=\"classmath99-latex-svg-g math99-latex-(-1-2\" transform=\"translate(0 -25)\"><text data-variant=\"-explicitFont\" transform=\"scale(1,-1)\" font-size=\"884px\">(</text></g><g data-mml-node=\"mn\" style=\"font-family: "Times New Roman", Aa楷宋, AaKaiSong;\" class=\"classmath99-latex-svg-g math99-latex-1-2-3\" transform=\"translate(294.9,0)\"><text data-variant=\"-explicitFont\" transform=\"scale(1,-1)\" font-size=\"884px\">1</text></g><g data-mml-node=\"mo\" style=\"font-family: Symbol, Aa楷宋, AaKaiSong;\" class=\"classmath99-latex-svg-g math99-latex-+-4-5\" transform=\"translate(959.2,0)\"><text data-variant=\"-explicitFont\" transform=\"scale(1,-1)\" font-size=\"884px\">+</text></g><g data-mml-node=\"mi\" style=\"font-family: "Times New Roman", Aa楷宋, AaKaiSong; font-style: italic;\" class=\"classmath99-latex-svg-g math99-latex-x-6-7\" transform=\"translate(1666.8,0)\"><text data-variant=\"-explicitFont\" transform=\"scale(1,-1)\" font-size=\"884px\">x</text></g><g data-mml-node=\"msup\" transform=\"translate(2090.6,0)\"><g data-mml-node=\"mo\" style=\"font-family: Symbol, Aa楷宋, AaKaiSong;\" class=\"classmath99-latex-svg-g math99-latex-)-7-8\" transform=\"translate(0 -25)\"><text data-variant=\"-explicitFont\" transform=\"scale(1,-1)\" font-size=\"884px\">)</text></g><g data-mml-node=\"mi\" style=\"font-family: "Times New Roman", Aa楷宋, AaKaiSong; font-style: italic;\" transform=\"translate(327.9,363) scale(0.707)\" class=\"classmath99-latex-svg-g math99-latex-n-9-10\"><text data-variant=\"-explicitFont\" transform=\"scale(1,-1)\" font-size=\"884px\">n</text></g></g><g data-mml-node=\"mo\" style=\"font-family: Symbol, Aa楷宋, AaKaiSong;\" class=\"classmath99-latex-svg-g math99-latex-geq-11-15\" transform=\"translate(3058.9,0)\"><text data-variant=\"-explicitFont\" transform=\"scale(1,-1)\" font-size=\"884px\">≥</text></g><g data-mml-node=\"mn\" style=\"font-family: "Times New Roman", Aa楷宋, AaKaiSong;\" class=\"classmath99-latex-svg-g math99-latex-1-16-17\" transform=\"translate(3822.1,0)\"><text data-variant=\"-explicitFont\" transform=\"scale(1,-1)\" font-size=\"884px\">1</text></g><g data-mml-node=\"mo\" style=\"font-family: Symbol, Aa楷宋, AaKaiSong;\" class=\"classmath99-latex-svg-g math99-latex-+-18-19\" transform=\"translate(4486.3,0)\"><text data-variant=\"-explicitFont\" transform=\"scale(1,-1)\" font-size=\"884px\">+</text></g><g data-mml-node=\"mi\" style=\"font-family: "Times New Roman", Aa楷宋, AaKaiSong; font-style: italic;\" class=\"classmath99-latex-svg-g math99-latex-n-20-21\" transform=\"translate(5194,0)\"><text data-variant=\"-explicitFont\" transform=\"scale(1,-1)\" font-size=\"884px\">n</text></g><g data-mml-node=\"mi\" style=\"font-family: "Times New Roman", Aa楷宋, AaKaiSong; font-style: italic;\" class=\"classmath99-latex-svg-g math99-latex-x-21-22\" transform=\"translate(5636,0)\"><text data-variant=\"-explicitFont\" transform=\"scale(1,-1)\" font-size=\"884px\">x</text></g><g data-mml-node=\"mstyle\" transform=\"translate(6059.8,0)\"><g data-mml-node=\"mspace\"></g></g><g data-mml-node=\"mo\" style=\"font-family: Symbol, Aa楷宋, AaKaiSong;\" class=\"classmath99-latex-svg-g math99-latex-(-29-30\" transform=\"translate(7059.8,0) translate(0 -25)\"><text data-variant=\"-explicitFont\" transform=\"scale(1,-1)\" font-size=\"884px\">(</text></g><g data-mml-node=\"mi\" style=\"font-family: "Times New Roman", Aa楷宋, AaKaiSong; font-style: italic;\" class=\"classmath99-latex-svg-g math99-latex-x-30-31\" transform=\"translate(7354.7,0)\"><text data-variant=\"-explicitFont\" transform=\"scale(1,-1)\" font-size=\"884px\">x</text></g><g data-mml-node=\"mo\" style=\"font-family: Aa楷宋, AaKaiSong;\" class=\"classmath99-latex-svg-g math99-latex->-32-33\" transform=\"translate(8056.3,0)\"><text data-variant=\"-explicitFont\" transform=\"scale(1,-1)\" font-size=\"884px\">></text></g><g data-mml-node=\"mo\" style=\"font-family: Symbol, Aa楷宋, AaKaiSong;\" class=\"classmath99-latex-svg-g math99-latex--34-35\" transform=\"translate(8806.1,0)\"><text data-variant=\"-explicitFont\" transform=\"scale(1,-1)\" font-size=\"884px\">−</text></g><g data-mml-node=\"mn\" style=\"font-family: "Times New Roman", Aa楷宋, AaKaiSong;\" class=\"classmath99-latex-svg-g math99-latex-1-35-36\" transform=\"translate(9291.6,0)\"><text data-variant=\"-explicitFont\" transform=\"scale(1,-1)\" font-size=\"884px\">1</text></g><g data-mml-node=\"mo\" style=\"font-family: Symbol, Aa楷宋, AaKaiSong;\" class=\"classmath99-latex-svg-g math99-latex-,-36-37\" transform=\"translate(9733.6,0)\"><text data-variant=\"-explicitFont\" transform=\"scale(1,-1)\" font-size=\"884px\">,</text></g><g data-mml-node=\"mtext\" class=\"classmath99-latex-svg-g math99-latex- -38-40\" transform=\"translate(10121.7,0)\"><use data-c=\"A0\" xlink:href=\"#MJX-13-TEX-N-A0\"></use></g><g data-mml-node=\"mi\" style=\"font-family: "Times New Roman", Aa楷宋, AaKaiSong; font-style: italic;\" class=\"classmath99-latex-svg-g math99-latex-n-40-41\" transform=\"translate(10371.7,0)\"><text data-variant=\"-explicitFont\" transform=\"scale(1,-1)\" font-size=\"884px\">n</text></g><g data-mml-node=\"mo\" style=\"font-family: Symbol, Aa楷宋, AaKaiSong;\" class=\"classmath99-latex-svg-g math99-latex-in-42-45\" transform=\"translate(11091.4,0)\"><text data-variant=\"-explicitFont\" transform=\"scale(1,-1)\" font-size=\"884px\">∈</text></g><g data-mml-node=\"msup\" transform=\"translate(12000.1,0)\"><g data-mml-node=\"TeXAtom\" data-mjx-texclass=\"ORD\"><g data-mml-node=\"mi\" class=\"classmath99-latex-svg-g math99-latex-N-54-55\" style=\"font-family: "Times New Roman", Aa楷宋, AaKaiSong; font-style: normal;\"><text data-variant=\"-explicitFont\" transform=\"scale(1,-1) translate(150,0)\" font-size=\"884px\">N</text></g></g><g data-mml-node=\"mo\" style=\"font-family: Symbol, Aa楷宋, AaKaiSong;\" transform=\"translate(755,363) scale(0.707)\" class=\"classmath99-latex-svg-g math99-latex-+-57-58\"><text data-variant=\"-explicitFont\" transform=\"scale(1,-1)\" font-size=\"884px\">+</text></g></g><g data-mml-node=\"mo\" style=\"font-family: Symbol, Aa楷宋, AaKaiSong;\" class=\"classmath99-latex-svg-g math99-latex-)-59-60\" transform=\"translate(13148.3,0) translate(0 -25)\"><text data-variant=\"-explicitFont\" transform=\"scale(1,-1)\" font-size=\"884px\">)</text></g></g></g></svg>",
"spanId": ""
} 后端接入
LaTeX 转 SVG / MathML
请求头
| 属性名 | 必选 | 类型 | 描述 |
|---|---|---|---|
partnerInfo | 是 | String | 合作方ID |
appid | 是 | String | 应用ID |
X-Referer | 是 | String | 调用方的公司域名 |
Content-Type | 是 | String | application/json |
参数分为两部分
1、请求 body 体中参数
| 参数 | 必选 | 类型 | 说明 |
|---|---|---|---|
info | 是 | string | AES 加密后的数据 |
time | 是 | long | 时间戳,精确到毫秒 注:这里的 time 值与 info 中加密的 time 值是同一个的 |
env | 是 | string | 环境 注:PRD(生产环境) |
info 加密前是一个 json 对象,对象中的 key 如下:
| 参数 | 必选 | 类型 | 说明 |
|---|---|---|---|
inType | 是 | String | 输入类型【latex】 |
content | 是 | String 数组 | 输入的内容(源码内容) |
outType | 是 | String 数组 | 输出类型【std:标准,mathml:MathML;】 注:标准即输出 SVG 格式 |
time | 是 | long | 时间戳,精确到毫秒 |
mode | 否 | String | 学科模式,physics-mode:物理、chemistry-mode:化学、math-mode:数学 |
fontSize | 否 | String | 设置字体大小,eg: 50pt 或者 50px |
body 体请求示例
加密前的数据,没有顺序限制:
{"time":1749122516172,"inType":"latex","outType":["draw","mathml"],"content":["实际价格 = 原价 \\times (134343 - 折扣率)","x = \\frac{-b \\pm \\sqrt{D}}{2a}"],"mode":"ph"} 加密后的数据:
fT4JVBjD3jvnHYQY9ns3b7W92zPyciiSpX9rvTqGfih5xAlmrkllql56R/GaZoLmahA4ddEElWo6vniz5n1VwxyZeSLDLS6Uw/aPmh0itLOFM73HDGrfH4OoHaPeAGKuPpugC8H6J3xGwDCOCbSdVpyiMy59OD/6f7ULI0VhezpL2LXHLfSAk0QSKEhLz3Ow0+g4r5jMyWBKt+oXzJiaM1xMZ+4uLA7QZi/iGQu+h0w= {
"time": "1749122516172",
"env": "DEV",
"info": "fT4JVBjD3jvnHYQY9ns3b7W92zPyciiSpX9rvTqGfih5xAlmrkllql56R/GaZoLmahA4ddEElWo6vniz5n1VwxyZeSLDLS6Uw/aPmh0itLOFM73HDGrfH4OoHaPeAGKuPpugC8H6J3xGwDCOCbSdVpyiMy59OD/6f7ULI0VhezpL2LXHLfSAk0QSKEhLz3Ow0+g4r5jMyWBKt+oXzJiaM1xMZ+4uLA7QZi/iGQu+h0w="
} 返回参数
| 参数名 | 必选 | 类型 | 说明 |
|---|---|---|---|
code | 是 | string | 响应码 |
msg | 是 | string | 响应码的描述信息 |
data | 否 | string | object | 具体业务具体规划 |
返回示例
{
"code": "200",
"msg": "调用成功",
"data": {
"mathml": {
"code": "200",
"msg": "调用成功",
"data": [
"<math ...", "<math ...",...
]
},
"draw": {
"code": "200",
"msg": "调用成功",
"data": [
"<svg ...","<svg ...",....
]
}
}
}
或者
{
"code": "200",
"msg": "调用成功",
"data": {
"mathml": {
"code": "61689",
"msg": "未购买此服务",
"data": "0x1748511300732"
},
"draw": {
"code": "200",
"msg": "调用成功",
"data": [
"<svg ...","<svg ...",....
]
}
}
} 备注
- 外层响应码
code = 200:请求成功,需根据实际返回的数据类型进一步解析data。code ≠ 200:请求失败,请查看msg获取错误描述;data为内部错误码(形如0x1747028551459),仅用于写入日志、供开发人员定位问题,无需向用户展示。
- 内层业务响应码:当外层
code = 200时,data中每个业务字段(如mathml、draw)的结构均为code、msg、data三个子属性。code = 200:子属性data即为该业务返回的业务数据(数组形式)。code ≠ 200:该业务调用出错,请查看msg获取错误描述。
附加信息
信息加密算法 请参考 《(附)AES 加密算法》。
OCR 识别
请求头
| 属性名 | 必选 | 类型 | 描述 |
|---|---|---|---|
partnerInfo | 是 | String | 合作方ID |
appid | 是 | String | 应用ID |
X-Referer | 是 | String | 调用方的公司域名 |
Content-Type | 是 | String | application/json |
参数分为两部分
1、请求 body 体中参数
| 参数 | 必选 | 类型 | 说明 |
|---|---|---|---|
info | 是 | string | AES 加密后的数据 |
time | 是 | long | 时间戳,精确到毫秒 注:这里的 time 值与 info 中加密的 time 值是同一个的 |
env | 是 | string | 环境 注:DEV(测试环境)/ PRD(生产环境) |
info 加密前是一个 json 对象,对象中的 key 如下:
| 参数 | 必选 | 类型 | 说明 |
|---|---|---|---|
picType | 是 | String | 图片类型【common:一般图片识别;printed:印刷体图片识别;handwritten:手写体图片识别】 注:不同的图片类型,识别速度、访问限频不同。 |
content | 是 | byte[] | 图片原始数据,不需要做任何处理,最大不能超过 2MB。java 获取图片内容的示例:byte[] bytes = java.nio.file.Files.readAllBytes(java.nio.file.Paths.get("/latex/xxx.png")); |
time | 是 | long | 时间戳,精确到毫秒 |
body 体请求示例
加密前的数据,没有顺序限制:
{"picType":"handwritten","time":1751181115761,"content":xxx} 加密后的数据:
fT4JVBjD3jvnHYQY9ns3b7W92zPyciiSpX9rvTqGfih5xAlmrkllql56R/GaZoLmahA4ddEElWo6vniz5n1VwxyZeSLDLS6Uw/aPmh0itLOFM73HDGrfH4OoHaPeAGKuPpugC8H6J3xGwDCOCbSdVpyiMy59OD/6f7ULI0VhezpL2LXHLfSAk0QSKEhLz3Ow0+g4r5jM {
"time": "1749122516172",
"env": "DEV",
"info": "fT4JVBjD3jvnHYQY9ns3b7W92zPyciiSpX9rvTqGfih5xAlmrkllql56R/GaZoLmahA4ddEElWo6vniz5n1VwxyZeSLDLS6Uw/aPmh0itLOFM73HDGrfH4OoHaPeAGKuPpugC8H6J3"
} 返回参数
| 参数名 | 必选 | 类型 | 说明 |
|---|---|---|---|
code | 是 | string | 响应码 |
msg | 是 | string | 响应码的描述信息 |
data | 否 | string | object | 具体业务具体规划 |
返回示例
{
"code": "200",
"msg": "调用成功",
"data": {
"latex": "一、填空题(每小题3分,共10小题)\n(1)求极限 $\\lim _{x \\rightarrow 0} \\frac{\\ln \\cos x}{x^{2}}$\n(2)求曲线 $y-x+e^{y}=0$ 在点 $x=1$ 处的切线方程\n(3)计算不定积分 $\\int \\frac{\\ln \\ln x}{x} d x$\n(4)求曲线 $y=\\frac{1+x}{1-e^{-x}}$ 的渐近线个数\n(5)求 $f(x)=\\left|x e^{-x}\\right|$ 的导数\n(6)已知 $f(x)$ 可导,$y=f\\left(e^{x^{2}}\\right)$ ,求 $d y$"
}
} 备注
常见错误码
| 码值 | 描述 |
|---|---|
401 | 参数错误(字段值不正确、传入数据过大等) |
402 | 一般是由于合作方ID(appid)错误导致 |
407 | 加密信息解密时出现错误 |
409 | 处理业务时出现异常 |
412 | 接口访问频繁 |
500 | 处理业务时,出现错误 |
509 | 当前有业务处理中,请稍后再试 |
511 | 当天 ocr 使用次数已达上限 |
5001 | 业务处理失败 |
- code 非 200 时,查看 msg 描述信息,【data 中的数据打到日志中,供开发人员分析问题,不需要给用户展示,一般是类似这样的错误码(eg:0x1747028551459)】
- code 是 200 的时候 data 中的数据就是返回的业务类型数据,具体数据结构参考上方的返回示例
样例数据
点击图片可放大 {
"code": "200",
"msg": "调用成功",
"data": {
"latex": "一、填空题(每小题3分,共10小题)\n(1)求极限 $\\lim _{x \\rightarrow 0} \\frac{\\ln \\cos x}{x^{2}}$\n(2)求曲线 $y-x+e^{y}=0$ 在点 $x=1$ 处的切线方程\n(3)计算不定积分 $\\int \\frac{\\ln \\ln x}{x} d x$\n(4)求曲线 $y=\\frac{1+x}{1-e^{-x}}$ 的渐近线个数\n(5)求 $f(x)=\\left|x e^{-x}\\right|$ 的导数\n(6)已知 $f(x)$ 可导,$y=f\\left(e^{x^{2}}\\right)$ ,求 $d y$"
}
} 附加信息
信息加密算法 请参考 《(附)AES 加密算法》。
(附)AES 加密算法
信息加密算法描述
加密算法:AES/CBC/PKCS5Padding 注:AES-128位
测试环境--秘钥值:xxxx 注:这是base64 encode之后的数据,使用时需要进行decode
测试环境--向量值:yyyy 注:这是base64 encode之后的数据,使用时需要进行decode 相关 java 加密代码(参考使用)
public class AESUtils {
/**
* 算法的名称
*/
private static final String AES = "AES";
private static final String ALGORITHM = "AES/CBC/PKCS5Padding";
/**
* 编码 UTF-8
*/
private static final String UTF_8 = "UTF-8";
/**
* 加密
* @param needEncryptByte 待加密内容
* @param key 加密key
* @param iv 向量
* @return
* @throws Exception
*/
public static byte[] encrypt(byte[] needEncryptByte, byte[] key, byte[] iv) throws Exception {
//设置秘钥
SecretKeySpec keySpec = new SecretKeySpec(key, AES);
//设置向量
IvParameterSpec ivSpec = new IvParameterSpec(iv);
Cipher cipher = Cipher.getInstance(ALGORITHM);
cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec);
return cipher.doFinal(needEncryptByte);
}
}