ERP 接口和测试工具介绍
一、ERP 接口概述
ERP 接口用于 T 系列 ERP 与外围系统的集成,将 ERP、T-Code、T-BOSS 协调为一个整体。接口以 HTTP API 形式提供,第三方系统通过标准协议调用即可与 ERP 进行数据交互。
什么是 API 接口
API(Application Programming Interface,应用程序接口)是一组预先定义的函数,允许应用程序与开发人员基于某软件或硬件进行交互,无需访问源码或理解内部工作机制。

实际应用场景
场景一:T-Code 与 ERP 对接
T-Code 是手机端仓库管理系统。仓库人员在 T-Code 上操作出入库,数据通过 ERP 接口与 ERP 实时同步。
以采购入库单为例:ERP 提供「登录接口」和「单据保存接口」,T-Code 完成登录后录入采购入库单,保存时直接调用 ERP 的单据保存接口,生成一张 ERP 中的采购入库单——无需 T-Code 重写存盘逻辑。
场景二:第三方系统集成
客户自定义程序(如 WMS、PLM)通过调用 ERP 接口,将自有系统的数据同步到 ERP。例如客户开发的小程序需要生成采购入库单,只需按接口规范传参调用即可。
二、接口调用流程
2.1 获取登录凭证
调用接口前需通过「登录接口」获取 LoginId。LoginId 是此次登录的身份标识,后续所有接口调用都必须在 Headers 中传入。
2.2 调用业务接口
以「单据保存接口」为例,在 Headers 中传入 LoginId,Body 中按规范传入 HeadData(表头)和 BodyData(表身)即可完成单据新增或修改。
2.3 接口基本信息
登录接口
| 信息 | 值 | 备注 |
|---|---|---|
| 接口名称 | 用户登录 | 根据语言别、授权凭证等实现用户登录 |
| 请求状态 | POST | RESTful 方式 |
| 接口路径 | http://localhost:23798/api/User/login | 向服务器地址发送 POST 请求 |
请求参数(登录接口)
Headers
| 参数名称 | 参数值 | 是否必须 | 示例 | 备注 |
|---|---|---|---|---|
| Languageid | 0 | 是 | 客户端语言别,0:简体 1:繁体 2:英文 | |
| Authorization | 是 | Basic REVNT19BRE1JTjoxMjM= | 授权凭证,由 登录代号_操作员代号:密码 组成字符串的 Base64 加密值 | |
| ClientType | 否 | TestMgr | 用户自定义的客户端识别号 | |
| Content-Type | 否 | application/json | 用于指定数据的传输类型 | |
| Key | 否 | ccd105791a7447e58638b43XXXXXXX46 | 验证注册网上的授权码 |
返回数据(登录接口)
| 名称 | 类型 | 是否必须 | 备注 | 其他信息 |
|---|---|---|---|---|
| LoginId | string | 否 | 返回的 LoginId | |
| CompNo | string | 否 | 帐套代号 | |
| UserNo | string | 否 | 操作员代号 | |
| LoginIdExpiry | number | 否 | 登录超时时间(秒) | |
| ClientType | string | 否 | 客户端自定义识别号 | |
| LanguageId | number | 否 | 客户端语言别 |
调用范例(登录接口)
返回的 JSON:
{
"LoginId": "e835943e-55c2-4bf0-832d-6f4166592941",
"CompNo": "DEMO",
"UserNo": "ADMIN",
"LoginIdExpiry": 604800,
"ClientType": "WMS",
"LanguageId": 0
}
备注
- 向服务器发送 POST 请求,请求参数按实际录入,返回
LoginId等字段。 - 先判断返回的 HttpStatusCode 是否为 200,是则表示调用成功,否则返回错误信息。
- 登录接口不需要频繁调用,只有当没有获得
LoginId或登录已超时后才需要再次调用。LoginIdExpiry以秒为单位,调用前记录本地时间,接口返回后加上LoginIdExpiry值即为下次需要重新登录的时机。 - 除登录接口外,其他接口调用必须在 Headers 中传入
LoginId。
所有接口都以 JSON 格式返回。
单据保存接口
| 信息 | 值 | 备注 |
|---|---|---|
| 接口名称 | 单据保存、修改 | 根据单据 ID 新增或修改单据 |
| 请求状态 | POST | RESTful 方式 |
| 接口路径 | http://localhost:23798/api/Bill/SaveBill | 向服务器地址发送 POST 请求 |
Headers(单据保存)
| 参数名称 | 参数值 | 是否必须 | 示例 | 备注 |
|---|---|---|---|---|
| Content-Type | application/json | 是 | 用于指定数据的传输类型 | |
| LoginId | 是 | e835943e-55c2-4bf0-832d-6f4166592941 | 用户登录的 LoginId |
Body(单据保存)
| 数据名称 | 字段名称 | 类型 | 是否必须 | 默认值 | 示例 | 备注 | 其他信息 |
|---|---|---|---|---|---|---|---|
| HeadData | object | 必须 | 表头数据 | ||||
| EntryOrderId | string | 非必须 | WMS | 调用方业务编码 | 调用方唯一编码,关联 ERP 单据,避免重复提交。重复时返回提示 | ||
| CallId | string | 必须 | PC | 调用的单据识别号 | "SA":销售出库单,"PC":采购入库单 | ||
| CusNo | string | 非必须 | CS001 | 厂商代号 | |||
| DepNo | string | 非必须 | CGB | 部门代号 | |||
| SalNo | string | 非必须 | CG001 | 业务员代号 | |||
| Rem | string | 非必须 | 这是表头备注 | 备注 | |||
| UsrNo | string | 非必须 | ADMIN | 制单人 | 账套验证的 LoginId 需添加 UsrNo,用户登录则无需 | ||
| ExtendProps | object | 非必须 | "CUS_OS_NO":"OS0C220001","ZDY":"自定义" | 扩展功能 | 字段名需与数据库表名一致 | ||
| BodyData | object [] | 必须 | 表身数据 | item 类型: object | |||
| BilId | string | 非必须 | PO | 转入来源单识别号 | "PO":表示采购订单 | ||
| BilNo | string | 非必须 | PO0C220001 | 转入来源单单号 | |||
| BilItm | number | 非必须 | 1 | 转入来源单项次 | |||
| PrdNo | string | 非必须 | YL1 | 货品代号 | |||
| WhNo | string | 非必须 | 003 | 仓库代号 | |||
| BatNo | string | 非必须 | PH01 | 批号 | |||
| PrdMark | string | 非必须 | TZ01 | 特征 | |||
| PrdLoc | string | 非必须 | CW01 | 储位 | |||
| Unit | string | 非必须 | 1 | 单位 | |||
| Qty | number | 非必须 | 3 | 主数量 | |||
| Qty1 | number | 非必须 | 6 | 副数量 | |||
| Up | number | 非必须 | 2 | 主单价 | |||
| Up1 | number | 非必须 | 1 | 副单价 | |||
| Tax | number | 非必须 | 1 | 税金 | |||
| DisCnt | number | 非必须 | 9 | 折扣 | |||
| Rem | string | 非必须 | 这是表身摘要 | 摘要 | |||
| ExtendProps | object | 非必须 | "Valid_DD":"2020-12-23","ZDY":"自定义","SEQ_ITM":1 | 扩展功能 | 字段名需与数据库表名一致 |
返回数据(单据保存)
| 名称 | 类型 | 是否必须 | 示例 | 备注 | 其他信息 |
|---|---|---|---|---|---|
| EntryOrderId | string | 非必须 | WMS | 调用方业务编码 | |
| CallID | string | 非必须 | PC | 调用的单据识别号 | |
| CallNO | string | 非必须 | PC0C240001 | 生成的单据号码 | |
| CallOK | string | 非必须 | T | 执行是否成功,是:"T" 否:"F" | |
| Data | object | 非必须 | "TF_TABNAME": "TF_PSS","BIL_ITM": "0","MF_TABNAME": "MF_PSS","BIL_NO": "PC0C100005","BIL_ID": "PC" | 单据信息,JSON 字符串格式 | |
| ErrorStr | string | 非必须 | 错误信息 |
调用范例(单据保存)
Request
无来源:
{
"HeadData": {
"EntryOrderId": "WMS",
"CallId": "PC",
"CusNo": "CS001",
"DepNo": "0000"
},
"BodyData": [
{
"PrdNo": "1001",
"Qty": 12.5
},
{
"PrdNo": "1002",
"Qty": 1
}
]
}
有来源(添加其他参数代表修改转入数据,如 BodyData 中 "Qty":3 代表修改来源单数量为 3):
{
"HeadData": {
"EntryOrderId": "WMS",
"CallId": "PC",
"CusNo": "CS001",
"DepNo": "0000"
},
"BodyData": [
{
"BilId": "PO",
"BilNo": "PO0C210001",
"BilItm": 1
}
]
}
Response
{
"EntryOrderId": "WMS",
"CallID": "PC",
"CallNO": "PC0C240001",
"CallOK": "T",
"Data": "{\r\n \"TF_TABNAME\": \"TF_PSS\",\r\n \"BIL_ITM\": \"0\",\r\n \"MF_TABNAME\": \"MF_PSS\",\r\n \"BIL_NO\": \"PC0C240001\",\r\n \"BIL_ID\": \"PC\"\r\n}",
"ErrorStr": ""
}
备注(单据保存)
- 必须在 Headers 中传入用户登录或账套验证的
LoginId。 - 采用账套验证获取的
LoginId时,HeadData中UsrNo不能为空。用户登录则无需添加UsrNo。 - Body 中 JSON 字段尽量不要添加赋空值的字段。
ExtendProps为扩展字段,需要对应数据库表的字段,自定义字段同样在这里处理。- 统一字段与接口所需数据库表字段重复时,只取统一字段的值。
- 接口程序不处理审核,无审核流直接终审,有审核流处于未审状态。
- 可查看后台表
LOG_BILLSAVE查看执行信息。 - 当
EntryOrderId不为空时,可查看后台表LOG_OTHERSAVE查看单据关联信息。
2.4 C# 代码示例
以下以 C# 语言为例,展示开发过程中调用登录接口和单据保存接口的代码。
private void btnGetLoginId_Click(object sender, EventArgs e) {
// Basic 64 加密:账套代号_操作员代号:密码
string authorization = "DEMO_ADMIN:";
byte[] b = System.Text.Encoding.Default.GetBytes(authorization);
authorization = "Basic " + Convert.ToBase64String(b);
HttpWebRequest request = (HttpWebRequest) WebRequest.Create("http://localhost:23798/api/User/login");
request.Headers["Authorization"] = authorization;
request.Headers["Languageid"] = "0";
request.Headers["ClientType"] = "WMS";
request.Method = "POST";
request.ContentType = "application/json";
string bodyString = "";
byte[] buffer = Encoding.UTF8.GetBytes(bodyString);
request.ContentLength = buffer.Length;
try {
request.GetRequestStream().Write(buffer, 0, buffer.Length);
using(HttpWebResponse response = (HttpWebResponse) request.GetResponse()) {
using(StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8)) {
MessageBox.Show(reader.ReadToEnd());
}
}
} catch (Exception ex) {
MessageBox.Show(ex.Message);
}
}
// 保存单据(单据保存接口)
private void btnSaveBill_Click(object sender, EventArgs e) {
HttpWebRequest request = (HttpWebRequest) WebRequest.Create("http://localhost:23798/api/Bill/SaveBill?CallID=PC&isConfirm=F");
request.Headers["LoginId"] = "e835943e-55c2-4bf0-832d-6f4166592941";
request.Headers["ClientType"] = "WMS";
request.Method = "POST";
request.ContentType = "application/json";
string bodyString = "{\"HeadData\": {\"EntryOrderId\":\"WMS\",\"CallId\":\"PC\",\"CusNo\": \"CS01\",\"DepNo\": \"0001\"},\"BodyData\": [{\"PrdNo\": \"1001\",\"Qty\": \"12.5\"},{\"PrdNo\": \"1002\",\"Qty\": \"1\"}]}";
byte[] buffer = Encoding.UTF8.GetBytes(bodyString);
request.ContentLength = buffer.Length;
try {
request.GetRequestStream().Write(buffer, 0, buffer.Length);
using(HttpWebResponse response = (HttpWebResponse) request.GetResponse()) {
using(StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8)) {
MessageBox.Show(reader.ReadToEnd());
}
}
} catch (Exception ex) {
MessageBox.Show(ex.Message);
}
}
三、JSON 简介
所有接口都以 JSON 格式返回。JSON(JavaScript Object Notation)是一种与开发语言无关的轻量级数据存储格式,用于存储和交换文本信息,几乎每种开发语言都有处理 JSON 的 API。
优点:易于阅读和编写,易于程序解析与生成。
数据结构
| 数据结构 | Object(无序的键-值集合) | Array(有序的值集合) |
|---|---|---|
| 结构样式 | {key:value, key:value…} | [value, value…] |
| 举例 | {"小明": "50分", "小红": "99分"} | [1, "hi"] |
JSON 数据示例
{
"APP": [
{
"name": "天猫",
"role": "买买买",
"carts": [
{ "name": "洗发水", "price": "50" },
{ "name": "沐浴露", "price": "60" }
]
},
{
"name": "京东",
"role": "买买买",
"carts": [
{ "name": "键盘", "price": "300" },
{ "name": "鼠标", "price": "300" }
]
}
]
}
四、接口测试
4.1 调用准备
- 运行 ServrConfig 启动 ERP 服务
- 云主机上防火墙开通
23788、23798端口 - ERP 序列号需要注册接口系统或条码系统
- 如需使用单据打印接口,请配置服务的模拟帐户
- 可访问
http://localhost:23798/api/help获取帮助




4.2 单据查询接口
基本信息(单据查询)
| 信息 | 值 | 备注 |
|---|---|---|
| 接口名称 | 单据查询 | 根据单据 ID、单据号码、单据项次查询单据信息 |
| 请求状态 | GET | RESTful 方式 |
| 接口路径 | http://localhost:23798/api/Bill/QueryBill | 向服务器地址发送 GET 请求 |
请求参数(单据查询)
Headers
| 参数名称 | 参数值 | 是否必须 | 示例 | 备注 |
|---|---|---|---|---|
| Content-Type | application/json | 是 | 用于指定数据的传输类型 | |
| LoginId | 679e0b11-8483-428c-82bd-83383b57e9f5 | 是 | 用户登录的 LoginId |
Query Params
| 参数名称 | 是否必须 | 示例 | 备注 |
|---|---|---|---|
| CallID | 是 | CallID=PO | 调用的单据识别号 |
| Bil_Id | 是 | Bil_Id=PO | 查询单据 ID |
| Bil_No | 是 | Bil_No=PO0C110001 | 查询单据号码 |
| Bil_Itm | 是 | Bil_Itm=0 | 查询单据项次 |
返回数据(单据查询)
| 名称 | 类型 | 是否必须 | 示例 | 备注 | 其他信息 |
|---|---|---|---|---|---|
| EntryOrderId | string | 非必须 | WMS | 调用方业务编码 | |
| CallID | string | 非必须 | PC | 调用的单据识别号 | |
| CallNO | string | 非必须 | PC0C240001 | 单据号码 | |
| CallOK | string | 非必须 | T | 执行是否成功,是:"T" 否:"F" | |
| Data | object | 非必须 | json 格式数据 | 单据信息,JSON 字符串格式 | |
| ErrorStr | string | 非必须 | 错误信息 |
4.3 Postman 测试工具
Postman 是一款接口测试工具,支持发送任何类型的 HTTP 请求(GET/PUT/POST/DELETE),通过填写 URL、Headers、Body 等即可发送请求。
安装与创建请求:
打开 Postman 程序,跳过登录和更新提示。弹出创建提示时选择创建 Collection,录入名称后点击 Create 创建。


若关掉了创建窗口,可在主界面点击 New 按钮或新增图标重新打开。

测试步骤:
需要创建两个请求:用户登录请求和采购订单查询请求。先通过登录请求获取 LoginId,再传入查询请求。
Step 1:用户登录请求
- 请求类型选择
POST,地址输入http://localhost:23798/api/User/login - 点击
Authorization页签,TYPE 选择Basic Auth,Username 输入DEMO_ADMIN(格式为账套代号_用户名),Password 输入密码 - 点击
Preview Request后 Headers 中自动生成Authorization参数

- 在
Headers页签下输入其他参数,如Languageid、ClientType、Content-Type - 点击
Send,下方Body页签显示返回数据,从中找到LoginId

- 可点击
Save保存请求,录入名称后点击save to保存

Step 2:采购订单查询请求
-
点击
+新建请求,类型选择GET,地址输入http://localhost:23798/api/Bill/QueryBill -
在
Params页签下输入参数CallID、Bil_Id、Bil_No、Bil_Itm及对应值也可直接在地址栏输入完整 URL:
http://localhost:23798/api/Bill/QueryBill?CallID=PO&Bil_Id=PO&Bil_No=PO0C110001&Bil_Itm=0,参数会自动解析到 Params 页签。

- 在
Headers页签输入Content-Type: application/json和LoginId(值为 Step 1 返回的 LoginId) - 点击
Send,下方Body显示返回数据。返回数据中包含HEADDATA、BODYDATA1等字段时表示调用成功。同时可查看Status,200表示请求通过

Step 3:添加测试断言(可选)
在 Tests 页签编写判断逻辑,验证返回数据是否正确:
pm.test("检测是否返回HEADDATA字段", function () {
pm.expect(pm.response.text()).to.include("HEADDATA");
});
点击 Send 运行后,查看 Test Results 页签:绿色 PASS 表示通过,红色 FAIL 表示失败。

JSON 格式化:
返回的 JSON 数据可能不易阅读,可使用在线 JSON 解析工具(如 https://www.sojson.com/),将数据粘贴后点击格式化,即可得到清晰的键值结构。


保存请求:
点击 Save 保存请求,保存后在左侧可展开查看已保存的请求。


Postman 还有其他丰富功能,可自行查阅教程。其他接口测试工具如 Restlet Client、Mockbin 等,原理类似,按需选用即可。
4.4 现有接口类型
| 接口名称 | 接口类型 | 请求类型 | 接口路径 |
|---|---|---|---|
| 用户登录 | 登录 | POST | http://localhost:23798/api/User/login |
| 账套验证 | 账套验证 | POST | http://localhost:23798/api/WMS/GetToken |
| 单据保存、修改 | 单据操作 | POST | http://localhost:23798/api/Bill/SaveBill |
| 单据打印 | 单据操作 | POST | http://localhost:23798/api/Bill/PrintBillReport |
| 单据审核 | 单据操作 | POST | http://localhost:23798/api/audit/executeaudit |
| 单据查询 | 单据操作 | GET | http://localhost:23798/api/Bill/QueryBill |
| 单据删除 | 单据操作 | POST | http://localhost:23798/api/Bill/DeleteBill |
| 查询视窗 | 查询 | GET | http://localhost:23798/api/Bill/QueryWin_GetData |
| 货品履历查询 | 查询 | GET | http://localhost:23798/api/MrpCZ/GetMrpCZData |
| 货品库存查询 | 查询 | GET | http://localhost:23798/api/TbrECC/GetPrdStock_One |
| 详细资料查询 | 查询 | GET | http://localhost:23798/api/Bill/QueryDataDetail |
4.5 现有单据 CallID 列表
以下单据均支持新增、删除、修改、查询接口:
| CallID | 单据名称 | CallID | 单据名称 | |
|---|---|---|---|---|
| PO | 采购订单 | IJ | 库存调整单 | |
| SO | 销售订单 | T6 | 采购入库送检 | |
| PC | 采购入库单 | TY | 采购入库验收 | |
| PB | 采购入库退回单 | TP | 生产缴库验收 | |
| SB | 销售出库退回单 | W1 | 库存入仓单 | |
| TW | 托外加工单 | WO | 库存出仓单 | |
| WT | 批次托外单 | MM | 成品缴库单 | |
| TC | 托工退回单 | M2 | 生产退料 | |
| M4 | 托工领料 | M3 | 生产补料 | |
| M5 | 托工退料 | YB | 采购验收退回 | |
| M6 | 托工补料 | YM | 制成品验收退回 | |
| M7 | 非生产领料 | YK | 托工验收退回 | |
| M8 | 非生产退料 | MB | BOM 组合生产单 | |
| IC | 库存调拨单 | MD | BOM 切割分装单 | |
| MC | 原料调拔单 | MX | 入不良品仓 | |
| PI | 盘点单 | CK | 备货单 | |
| PJ | 盘点单(批号) | PN | 订单变更 |
五、HTTP 协议基础
5.1 HTTP 协议
HTTP(HyperText Transfer Protocol,超文本传输协议)是基于 TCP/IP 之上的应用层协议,遵循请求(Request)/响应(Response)模型。

请求报文构成:
- 请求行(Request Line):请求方法、URL、协议/版本
- 请求头(Request Header)
- 请求正文(Request Body)
POST /test.html HTTP/1.1 // 请求行
HOST:www.test.com?indexid=2 // 请求头
Content-Length: 16
Content-Type: text/html
// 空行,请求头结束
Username=admin&password=admin // 请求正文
响应报文构成:
- 响应行(Response Line)
- 响应头(Response Header)
- 响应正文(Response Body)
HTTP/1.1 200 OK // 响应行
Date: Sun, 15 Nov 2015 11:02:04 GMT // 响应头
Content-Length: 360
Content-Type: text/html
// 空行,响应头结束
<html> // 响应正文
<body>Hello World</body>
</html>
5.2 HTTPS 协议
HTTP 存在以下问题:请求信息明文传输、数据完整性未校验、无身份验证机制。
HTTPS 在 HTTP 基础上加入 SSL/TLS 层,通过 SSL 证书验证服务器身份并对通信进行加密。

HTTPS 与 HTTP 的区别:
| HTTP | HTTPS | |
|---|---|---|
| 安全性 | 明文传输 | SSL/TLS 加密 |
| 默认端口 | 80 | 443 |
| 证书 | 不需要 | 需要申请 SSL 证书 |
5.3 Base64 加密
使用 Postman 测试时可通过自带的 Base64 加密对账套用户名密码加密。如工具不带此功能,可使用在线加密工具。
示例:打开站长工具在线加密网址,将 账套代号_用户代号:密码 录入左边,点击"Base64 加密",右边显示加密结果。将 Basic 与加密结果用空格拼接即为 Authorization 参数值。
例如账套代号 DEMO,用户代号 ADMIN,密码 123,加密结果为 REVNT19BRE1JTjoxMjM=,最终 Authorization 值为 Basic REVNT19BRE1JTjoxMjM=。
