主题
对接指南
本文帮助您从零开始完成接口对接。请按顺序阅读,完成每一步即可成功调用。
第一步:获取凭证
在调用接口前,您需要联系我们获取以下信息:
| 凭证 | 说明 | 示例 |
|---|---|---|
AccessKey(AK) | 访问标识,用于身份识别 | your_access_key |
SecretKey(SK) | 密钥,用于计算签名,不可暴露给客户端 | your_secret_key |
安全警告
SecretKey 仅允许保存在服务端或安全环境变量中,严禁写入前端代码、日志、版本控制系统。
第二步:确定服务地址
| 环境 | 基地址 | 用途 |
|---|---|---|
| 测试环境 | http://203.2.112.61:8095 | 开发联调,数据不影响生产 |
| 正式环境 | https://api.juyu.top | 生产使用 |
所有接口均以 /openapi 为前缀,完整示例:
POST http://203.2.112.61:8095/openapi/order/createOrder第三步:构造请求
一个完整的 API 请求由以下部分组成:
┌─────────────────────────────────────────────┐
│ POST /openapi/order/createOrder HTTP/1.1 │ ← 请求方法 + 路径
│ Host: api.juyu.top │ ← 服务地址
│ Content-Type: application/json; charset=UTF-8 │ ← 内容类型
│ X-Access-Key: your_access_key │ ← 身份标识
│ X-Timestamp: 1718236800 │ ← 时间戳(Unix秒)
│ X-Nonce: a1b2c3d4e5f6 │ ← 防重放随机串
│ X-Sign: 6a8f3c...(小写hex) │ ← 签名
│ │
│ {"cusSelfOid":"ORDER-001", ...} │ ← 业务请求体
└─────────────────────────────────────────────┘公共请求头
| 请求头 | 类型 | 必填 | 说明 | 示例值 |
|---|---|---|---|---|
Content-Type | String | 是 | 固定值 | application/json; charset=UTF-8 |
X-Access-Key | String | 是 | 分配给您的访问标识 | your_access_key |
X-Timestamp | String | 是 | Unix 秒时间戳(十进制字符串),须与签名计算一致 | 1718236800 |
X-Sign | String | 是 | HMAC-SHA256 签名结果(小写十六进制) | 6a8f3c1d2e... |
X-Nonce | String | 建议 | 防重放随机串,建议每次请求唯一 | a1b2c3d4e5f6 |
第四步:计算签名
签名用于验证请求的合法性和完整性。
4.1 收集参与签名的参数
规则:
- POST/PUT 等非 GET 请求:URL Query 参数 + JSON Body 一级字段 合并参与签名
- 同名键以 Body 为准
- 键
_t、sign不参与签名 - 值为
null的字段不参与签名 - Body 值的字符串转换规则:
| 值类型 | 转换规则 | 示例 |
|---|---|---|
| 字符串 | 原样 | "hello" → hello |
| 数值 / 布尔 | 转字符串 | 100 → 100,true → true |
| 对象 / 数组 | 紧凑 JSON | [1,2] → [1,2] |
4.2 构造规范化串
将收集到的参数按参数名升序排序后拼接:
text
paramPart = key1=value1&key2=value2&...
canonical = paramPart + "|ts=" + timestamp + "|ak=" + accessKey4.3 计算签名值
text
X-Sign = HMAC-SHA256(canonical, secretKey) // 结果转小写十六进制字符串第五步:发起请求并验证
完整请求示例
假设参数如下:
| 项 | 值 |
|---|---|
| AccessKey | test_ak |
| SecretKey | test_sk |
| 接口 | POST /openapi/order/createOrder |
| 时间戳 | 1718236800 |
| Body | {"cusSelfOid":"ORDER-001","companyWorkNo":"101121"} |
签名计算过程:
text
① 收集参数(Body 一级字段):
cusSelfOid = ORDER-001
companyWorkNo = 101121
② 按参数名升序排列拼接:
paramPart = "companyWorkNo=101121&cusSelfOid=ORDER-001"
③ 拼接规范化串:
canonical = "companyWorkNo=101121&cusSelfOid=ORDER-001|ts=1718236800|ak=test_ak"
④ HMAC-SHA256 签名:
X-Sign = HMAC-SHA256(canonical, "test_sk")
= "a3f8e2b1c4d5..." // 小写十六进制最终请求:
http
POST /openapi/order/createOrder HTTP/1.1
Host: api.juyu.top
Content-Type: application/json; charset=UTF-8
X-Access-Key: test_ak
X-Timestamp: 1718236800
X-Nonce: rand123456
X-Sign: a3f8e2b1c4d5...
{"cusSelfOid":"ORDER-001","companyWorkNo":"101121"}统一响应体
所有接口返回统一结构:
json
{
"code": 200,
"message": "success",
"result": { ... },
"traceId": "20260613120000-abc123"
}| 字段 | 类型 | 说明 |
|---|---|---|
code | Integer | 业务状态码,200 表示成功 |
message | String | 提示信息 |
result | Object / Array / null | 业务数据 |
traceId | String | 链路追踪标识(可选) |
请以 code 判断业务是否成功,不要依赖 HTTP 状态码。
常见错误码
code | 含义 | 排查方向 |
|---|---|---|
| 200 | 成功 | — |
| 400 | 参数校验失败 | 检查必填参数、格式 |
| 401 | 签名验证失败 | 检查 AK/SK、canonical 串、时间戳 |
| 403 | 无权限 | 确认 AK 是否已开通对应接口 |
| 500 | 服务端异常 | 提供 traceId 联系技术支持 |
接口清单
| 分组 | 接口 | 路径 | 说明 |
|---|---|---|---|
| 订单 | 创建订单 | /openapi/order/createOrder | 新增订单,返回具语运单号 |
| 订单 | 修改订单 | /openapi/order/updateOrder | 按具语运单号更新 |
| 订单 | 取消订单 | /openapi/order/orderCancel | 商家侧取消订单 |
| 订单 | 物流取消 | /openapi/order/logisticsCancel | 物流侧取消待揽收订单(0→2) |
| 订单 | 绑定物流运单 | /openapi/order/bindWaybill | 回传物流运单号并同步轨迹 |
| 运单 | 运单数据拉取 | /openapi/waybill/getWaybillData | 按条件拉取运单 |
| 运单 | 轨迹数据拉取 | /openapi/waybill/getTrackData | 按条件拉取轨迹 |
| 运单 | 运单号转换 | /openapi/waybill/convertJyWaybillNo | 物流运单号批量转具语运单号 |
| 超区 | 地址关键字检索 | /openapi/superzone/searchAddressByKeyword | 地址联想(索引/地图) |
| 超区 | 超区公司列表 | /openapi/superzone/superZonePriceList | 超区配置列表查询 |
| IM | 获取登录令牌 | /openapi/im/getAccountToken | 获取 IM SDK 登录令牌 |
| IM | 是否可使用 IM | /openapi/im/isIm | 查询 IM 开关状态 |
| IM | 创建企业控制台群聊 | /openapi/im/createTeam | 商家/物流发起企业控制台客服群 |
联调建议
- 先跑通签名:用最简参数(如取消订单只需
jyWaybillNo)验证签名是否正确 - 时间戳对齐:确保服务器时间与标准时间偏差在 5 分钟内
- Body 一致性:用于计算签名的 Body 内容必须与实际发送的请求体完全一致(包括字段顺序、空格)
- 签名失败排查清单:
- [ ] AK 是否正确
- [ ] 时间戳是否与签名计算时一致
- [ ] 参数是否按名称升序排列
- [ ] null 值字段是否已排除
- [ ] Body 中对象/数组是否用了紧凑 JSON(无空格)