|
|
пре 2 недеља | |
|---|---|---|
| .. | ||
| src | пре 2 недеља | |
| 00-概述与接入指南.md | пре 1 месец | |
| 01-基础资料.md | пре 1 месец | |
| 02-商品管理.md | пре 1 месец | |
| 03-平台商品管理(个性).md | пре 1 месец | |
| 04-订单管理.md | пре 1 месец | |
| 05-采购管理.md | пре 1 месец | |
| 06-调拨管理.md | пре 1 месец | |
| 07-其他出入库管理.md | пре 1 месец | |
| 08-盘点管理.md | пре 1 месец | |
| 09-库存管理.md | пре 1 месец | |
| 10-消息推送.md | пре 1 месец | |
| 11-路由管理.md | пре 1 месец | |
| README.md | пре 1 месец | |
| pom.xml | пре 1 месец | |
qdb-sdk 是企得宝ERP开放平台的 Java SDK,提供对 73 个开放API接口的完整封装。支持签名生成、请求发送、响应解析等全链路功能。
| 技术 | 版本 | 用途 |
|---|---|---|
| Java | 21 | 开发语言 |
| Maven | 3.6+ | 项目构建 |
| OkHttp | 4.12.0 | HTTP 客户端 |
| FastJson2 | 2.0.53 | JSON 序列化/反序列化 |
| Lombok | 1.18.36 | 代码简化 |
| SLF4J | 2.0.13 | 日志门面 |
注意:本 SDK 为独立 Maven 项目,不依赖 haha 零售系统任何内部模块,可独立使用或引入到任意 Java 项目。
将 qdb-sdk 安装到本地 Maven 仓库后,在项目中添加依赖:
<dependency>
<groupId>com.qdb</groupId>
<artifactId>qdb-sdk</artifactId>
<version>1.0.0</version>
</dependency>
或直接引入源码作为模块:
<dependency>
<groupId>com.qdb</groupId>
<artifactId>qdb-sdk</artifactId>
<version>1.0.0</version>
<scope>system</scope>
<systemPath>${project.basedir}/lib/qdb-sdk-1.0.0.jar</systemPath>
</dependency>
import com.qdb.sdk.QdbClient;
import com.qdb.sdk.QdbConfig;
// 创建配置(必填:clientId 和 clientSecret)
QdbConfig config = QdbConfig.builder()
.clientId("your_client_id") // 开放平台分配的 clientId
.clientSecret("your_client_secret") // 开放平台分配的 clientSecret
.build();
// 校验配置
config.validate();
// 创建客户端(单例使用,线程安全)
QdbClient client = new QdbClient(config);
SDK 默认接入正式环境,切换测试环境只需修改 apiUrl:
QdbConfig config = QdbConfig.builder()
.clientId("your_client_id")
.clientSecret("your_client_secret")
.apiUrl("https://apitest.7debao.com/router/api") // 测试环境
.build();
| 环境 | 默认值 |
|---|---|
| 正式环境 | https://api.7debao.com/router/api |
| 测试环境 | https://apitest.7debao.com/router/api |
┌─────────────────────────────────────────────────────┐
│ 调用方代码 │
│ QdbClient.getXxxApi().method(request) │
└─────────────────┬───────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────┐
│ BaseQdbApi │
│ ① 序列化请求参数为 JSON │
│ ② 调用 HttpUtil.post() │
│ ③ 解析响应 QdbResponse<T> │
│ ④ 检查 success 标识,失败则抛出 QdbException │
└─────────────────┬───────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────┐
│ HttpUtil │
│ ① 构建公共参数 Map(TreeMap 自动排序) │
│ ② 调用 SignUtil 计算 MD5 签名 │
│ ③ 拼接完整 URL:baseUrl?公共参数+sign │
│ ④ POST 请求,Body 为业务参数 JSON │
│ ⑤ 返回原始响应 JSON 字符串 │
└─────────────────┬───────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────┐
│ 企得宝ERP 开放平台 │
│ https://api.7debao.com/router/api │
└─────────────────────────────────────────────────────┘
签名规则(与企得宝开放平台文档一致):
拼装好的字符串首尾拼接 client_secret 进行 MD5(小写32位)
// 示例:SDK 内部自动完成签名
// 公共参数排序拼接后:client_idxxxformatjsonmethodxxxpartner_idxxx...
// 加签:secret + 拼接字符串 + secret → MD5
所有 API 返回统一结构:
{
"errorCode": null,
"msg": "操作成功",
"data": { ... },
"date": null,
"version": null,
"success": true
}
| 字段 | 类型 | 说明 |
|---|---|---|
| errorCode | String | 错误编码,成功时为 null |
| msg | String | 提示信息 |
| data | Object | 成功时返回数据,失败为 null |
| date | Date | 响应时间 |
| version | Integer | 版本信息 |
| success | Boolean | 成功为 true,失败为 false |
import com.qdb.sdk.QdbClient;
import com.qdb.sdk.QdbConfig;
import com.qdb.sdk.QdbException;
import com.qdb.sdk.model.request.*;
import com.qdb.sdk.model.response.QdbResponse;
import java.math.BigDecimal;
import java.util.List;
public class OrderExample {
public static void main(String[] args) {
// 1. 初始化客户端
QdbConfig config = QdbConfig.builder()
.clientId("your_client_id")
.clientSecret("your_client_secret")
.build();
QdbClient client = new QdbClient(config);
try {
// 2. 构建订单商品
OrderGoods goods = OrderGoods.builder()
.platformGoodsCode("SKU001") // 平台商品编码
.platformGoodsName("测试商品") // 平台商品标题
.quantity(new BigDecimal("2")) // 数量
.price(new BigDecimal("49.90")) // 单价
.realPrice(new BigDecimal("45.00")) // 实际售价
.build();
// 3. 构建支付信息(可选)
OrderPay pay = OrderPay.builder()
.payTypeCode("2") // 微信支付
.payTime("2024-01-24 15:30:00")
.payNo("WX202401241530001")
.build();
// 4. 构建订单上传请求
OrderSaveRequest request = OrderSaveRequest.builder()
.shopId(9900100000000136L) // 店铺ID
.tradeNo("T202401240001") // 平台交易单号
.platformTradeStatus("02") // 待发货
.platformRefundStatus("0") // 未退款
.orderTypeCode("2") // 在线交易
.postAmount(new BigDecimal("10.00")) // 运费
.payAmount(new BigDecimal("100.00")) // 付款金额
.receiverName("张三")
.receiverMobile("13800138000")
.receiverProvince("广东省")
.receiverCity("深圳市")
.receiverDistrict("南山区")
.receiverAddress("科技园南区A栋1001")
.ordersGoods(List.of(goods)) // 商品列表
.ordersPay(List.of(pay)) // 支付信息(可选)
.buyerMessage("请尽快发货")
.build();
// 5. 调用订单上传接口
QdbResponse<Void> response = client.getOrderApi().saveOrder(request);
if (response.isSuccess()) {
System.out.println("✅ 订单上传成功");
}
} catch (QdbException e) {
System.err.println("❌ 订单上传失败: [" + e.getErrorCode() + "] " + e.getMessage());
} finally {
// 6. 关闭客户端
client.shutdown();
}
}
}
import com.qdb.sdk.QdbClient;
import com.qdb.sdk.QdbConfig;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class QdbSdkConfig {
@Value("${qdb.client-id}")
private String clientId;
@Value("${qdb.client-secret}")
private String clientSecret;
@Value("${qdb.api-url:https://api.7debao.com/router/api}")
private String apiUrl;
@Bean
public QdbClient qdbClient() {
QdbConfig config = QdbConfig.builder()
.clientId(clientId)
.clientSecret(clientSecret)
.apiUrl(apiUrl)
.build();
return new QdbClient(config);
}
}
application.yml 配置:
qdb:
client-id: your_client_id
client-secret: your_client_secret
api-url: https://api.7debao.com/router/api
SDK 目前已实现以下 API 模块(共 73 个接口),完整接口明细请参考对应文档:
| 模块 | API 类 | 已实现方法 | 对应文档 |
|---|---|---|---|
| 订单管理 | OrderApi |
saveOrder() 订单上传 |
04-订单管理.md |
| 模块 | 接口数 | 对应文档 |
|---|---|---|
| 基础资料 | 9 | 01-基础资料.md |
| 商品管理 | 6 | 02-商品管理.md |
| 平台商品管理(个性) | 19 | 03-平台商品管理(个性).md |
| 订单管理(其余) | 15 | 04-订单管理.md |
| 采购管理 | 5 | 05-采购管理.md |
| 调拨管理 | 2 | 06-调拨管理.md |
| 其他出入库管理 | 3 | 07-其他出入库管理.md |
| 盘点管理 | 2 | 08-盘点管理.md |
| 库存管理 | 2 | 09-库存管理.md |
| 消息推送(回调接收) | 8 | 10-消息推送.md |
| 路由管理 | 1 | 11-路由管理.md |
SDK 统一使用 QdbException 异常类:
import com.qdb.sdk.QdbException;
try {
QdbResponse<Void> response = client.getOrderApi().saveOrder(request);
} catch (QdbException e) {
// 错误编码(对应企得宝API返回的 errorCode)
String errorCode = e.getErrorCode();
// 错误信息
String errorMsg = e.getMessage();
// 原始异常(如有)
Throwable cause = e.getCause();
System.err.println("错误码: " + errorCode + ", 信息: " + errorMsg);
}
| 异常场景 | 说明 |
|---|---|
clientId/clientSecret 为空 |
抛出 IllegalArgumentException,配置时需调用 config.validate() |
| 网络异常 | QdbException 包装 IOException,检查网络连通性 |
| HTTP 状态码非 200 | QdbException("HTTP 请求失败,状态码: xxx") |
| API 业务错误 | QdbException 包含 errorCode 和 msg(从企得宝返回) |
| 响应解析失败 | QdbException("API 响应解析失败") |
qdb-sdk/
├── pom.xml # Maven 构建文件(Java 21)
├── src/main/java/com/qdb/sdk/
│ ├── QdbClient.java # 主客户端入口
│ ├── QdbConfig.java # SDK 配置类
│ ├── QdbException.java # 自定义异常
│ ├── api/
│ │ ├── BaseQdbApi.java # API 基类(通用调用逻辑)
│ │ └── OrderApi.java # 订单管理 API
│ ├── model/
│ │ ├── request/ # 请求参数模型
│ │ │ ├── OrderSaveRequest.java # 订单上传请求
│ │ │ ├── OrderGoods.java # 订单商品
│ │ │ ├── OrderInvoice.java # 订单发票
│ │ │ └── OrderPay.java # 订单支付
│ │ └── response/
│ │ └── QdbResponse.java # 统一响应对象
│ └── util/
│ ├── SignUtil.java # MD5 签名工具
│ ├── HttpUtil.java # HTTP 客户端(OkHttp)
│ └── JsonUtil.java # JSON 工具(FastJson2)
├── 00-概述与接入指南.md # 企得宝 API 文档
├── 01-基础资料.md
├── ... # 其他 API 文档
新增一个业务 API 模块只需 3 步:
1. 创建请求模型(model/request/ 目录下):
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ShopQueryRequest {
private Long shopId;
private String shopName;
// ... 其他请求参数
}
2. 创建 API 类(api/ 目录下):
public class ShopApi extends BaseQdbApi {
private static final String METHOD_SHOP_LIST = "foonsu.erp.shop.shopInfo";
public ShopApi(QdbClient client) {
super(client);
}
public QdbResponse<List<ShopInfo>> queryShops(ShopQueryRequest request) throws QdbException {
return execute(METHOD_SHOP_LIST, request);
}
}
3. 注册到 QdbClient:
// 在 QdbClient.java 中添加
private final ShopApi shopApi;
// 在构造方法中初始化
this.shopApi = new ShopApi(this);
// 添加 Getter
public ShopApi getShopApi() { return shopApi; }
# 编译
mvn clean compile
# 打包
mvn clean package
# 安装到本地仓库
mvn clean install
# 跳过测试打包
mvn clean package -DskipTests
是的。QdbClient 可在多线程环境中安全使用,建议作为单例管理(如在 Spring 中声明为 @Bean)。
检查 clientId 和 clientSecret 是否正确。SDK 内部已实现完整的签名逻辑,包括字典序排列、key+value 拼接、首尾加 secret、MD5 加密。
修改 QdbConfig.apiUrl:
https://api.7debao.com/router/api(默认)https://apitest.7debao.com/router/api登录企得宝ERP开放平台后台,在应用管理中创建应用获取。
以 success 字段为准。SDK 内部通过 isSuccess() 判断,该方法只检查 success 是否为 true。
版本: 1.0.0
Java: 21+
更新日期: 2026-04-30