Spring Boot 集成金蝶 API 演示

✨ Spring Boot 集成金蝶 API 演示:登录 / 注销 + Cookie 保存

本文将通过 Spring Boot 完整实现一套金蝶接口集成模型,包括:

  • ✅ 普通登录
  • ✅ AppSecret 登录
  • ✅ 注销
  • ✅ Cookie 保存与复用

📅 项目结构

src/
├── controller/
│   └── KingdeeController.java         // API 接口
├── service/
│   ├── KingdeeService.java            // 登录/注销逻辑
├── component/
│   └── KingdeeSessionManager.java     // Cookie 管理
├── resources/
│   └── static/pages/kingdee.html      // 前端测试页

✨ 1. Cookie 保存组件 KingdeeSessionManager

package org.example.component;import org.springframework.stereotype.Component;import java.util.List;/*** ==================================================* This class KingdeeSessionManager is responsible for [功能描述].** @author Darker* @version 1.0* ==================================================*/@Component
public class KingdeeSessionManager {private String cookie;public void saveFromHeaders(List<String> cookies) {if (cookies != null && !cookies.isEmpty()) {// 可扩展支持多个 Cookie,但这里我们只取第一个this.cookie = cookies.get(0);}}public String getCookie() {return this.cookie;}public boolean hasCookie() {return cookie != null && !cookie.isEmpty();}public void clear() {this.cookie = null;}
}

✨ 2. 金蝶服务层 KingdeeService

package org.example.service;import org.example.component.KingdeeSessionManager;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.*;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;import java.util.HashMap;
import java.util.Map;/*** ==================================================* This class KingdeeService is responsible for 金蝶 API 服务.** @author Darker* @version 2.0* ==================================================*/
@Service
public class KingdeeService {private static final String BASE_URL = "https://your.kingdee.server/K3Cloud";@Autowiredprivate KingdeeSessionManager sessionManager;private ResponseEntity<String> postWithOptionalCookie(String url, Map<String, Object> payload, boolean withCookie) {RestTemplate restTemplate = new RestTemplate();HttpHeaders headers = new HttpHeaders();headers.setContentType(MediaType.APPLICATION_JSON);if (withCookie && sessionManager.hasCookie()) {headers.add("Cookie", sessionManager.getCookie());}HttpEntity<Map<String, Object>> request = new HttpEntity<>(payload, headers);return restTemplate.postForEntity(url, request, String.class);}/*** 普通登录*/public String login() {String url = BASE_URL + "/Kingdee.BOS.WebApi.ServicesStub.AuthService.ValidateUser.common.kdsvc";Map<String, Object> payload = new HashMap<>();payload.put("parameters", new Object[]{"你的数据中心 ID", "你的用户名", "你的密码", 2052});ResponseEntity<String> response = postWithOptionalCookie(url, payload, false);// 记录 CookiesessionManager.saveFromHeaders(response.getHeaders().get(HttpHeaders.SET_COOKIE));return response.getBody();}/*** AppSecret 登录*/public String loginByAppSecret() {String url = BASE_URL + "/Kingdee.BOS.WebApi.ServicesStub.AuthService.LoginByAppSecret.common.kdsvc";Map<String, Object> payload = new HashMap<>();payload.put("parameters", new Object[]{"你的数据中心 ID",                             // 数据中心 ID"你的用户名",                                  // 用户名"你的 AppID",    							  // AppID"你的 AppSecret",           				  // AppSecret2052});ResponseEntity<String> response = postWithOptionalCookie(url, payload, false);sessionManager.saveFromHeaders(response.getHeaders().get(HttpHeaders.SET_COOKIE));return response.getBody();}/*** 注销:需要携带 Cookie*/public String logout() {String url = BASE_URL + "/Kingdee.BOS.WebApi.ServicesStub.AuthService.Logout.common.kdsvc";Map<String, Object> payload = new HashMap<>();payload.put("parameters", new Object[]{});ResponseEntity<String> response = postWithOptionalCookie(url, payload, true);// 如果注销成功(返回 true),则清除本地 cookieif ("true".equalsIgnoreCase(response.getBody().trim())) {sessionManager.clear();}return response.getBody();}
}

✨ 3. Controller 接口 KingdeeController

package org.example.controller;import org.example.service.KingdeeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.RestTemplate;
import org.springframework.http.ResponseEntity;
import org.springframework.web.util.UriComponentsBuilder;/*** ==================================================* This class KingdeeController is responsible for [功能描述].** @author Darker* @version 1.0* ==================================================*/@RestController
@RequestMapping("/kingdee")
public class KingdeeController {@Autowiredprivate KingdeeService kingdeeService;@GetMapping("/login")public ResponseEntity<?> login() {try {String result = kingdeeService.login();return ResponseEntity.ok(result);} catch (Exception e) {return ResponseEntity.internalServerError().body("登录失败:" + e.getMessage());}}@GetMapping("/logout")public ResponseEntity<?> logout() {try {String result = kingdeeService.logout();return ResponseEntity.ok(result);} catch (Exception e) {return ResponseEntity.internalServerError().body("注销失败:" + e.getMessage());}}@GetMapping("/login-app-secret")public ResponseEntity<?> loginByAppSecret() {try {String result = kingdeeService.loginByAppSecret();return ResponseEntity.ok(result);} catch (Exception e) {return ResponseEntity.internalServerError().body("AppSecret 登录失败:" + e.getMessage());}}
}

✨ 4. 前端测试页 kingdee.html

<!DOCTYPE html>
<html lang="zh">
<head><meta charset="UTF-8"><title>金蝶 API 测试</title><script>async function callApi(endpoint) {const res = await fetch(`/kingdee/${endpoint}`);const text = await res.text();document.getElementById('result').innerText = `[${endpoint}]:\n` + text;}</script>
</head>
<body><h2>金蝶 API 测试</h2><button onclick="callApi('login')">普通登录</button><button onclick="callApi('login-app-secret')">AppSecret 登录</button><button onclick="callApi('logout')">注销</button><pre id="result"></pre>
</body>
</html>

⚠️ Cookie 保存说明

  • 登录成功后,金蝶服务器会通过 Set-Cookie 头返回一个会话ID
  • 后续操作(注销 / 探量 / 单据传递)必须附带 Cookie
  • 本文中通过 KingdeeSessionManager 自动管理 Cookie,无需手动处理

🔗 金蝶 API 官方开发文档

官方开放平台:

  • 【K3Cloud Web API】总览:https://open.kingdee.com
  • 登录接口说明:https://open.kingdee.com/doc/view?doc_id=1055
  • App ID / Secret 说明:https://open.kingdee.com/doc/view?doc_id=1297
  • 提交单据示例:https://open.kingdee.com/doc/view?doc_id=1061

🔧 扩展方向

  • ✉ 增加 callKingdeeService(String serviceName, Object[] parameters) 通用调用方法
  • ✔ 支持查询单据 / 提交审核 / 操作单据
  • 📄 将登录状态持久化到 Redis

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/901938.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

React 受控表单绑定基础

React 中最常见的几个需求是&#xff1a; 渲染一组列表绑定点击事件表单数据与组件状态之间的绑定 受控表单绑定是理解表单交互的关键之一。 &#x1f4cd;什么是受控组件&#xff1f; 在 React 中&#xff0c;所谓“受控组件”&#xff0c;指的是表单元素&#xff08;如 &l…

基于FPGA的AES加解密系统verilog实现,包含testbench和开发板硬件测试

目录 1.课题概述 2.系统测试效果 3.核心程序与模型 4.系统原理简介 4.1 字节替换&#xff08;SubBytes&#xff09; 4.2 行移位&#xff08;ShiftRows&#xff09; 4.3 列混合&#xff08;MixColumns&#xff09; 4.4 轮密钥加&#xff08;AddRoundKey&#xff09; 4.…

6.5 GitHub监控系统实战:双通道采集+动态调度打造高效运维体系

GitHub Sentinel Agent 定期更新功能设计与实现 关键词:GitHub API 集成、定时任务调度、Python 爬虫开发、SMTP 邮件通知、系统稳定性保障 1. GitHub 项目数据获取功能 1.1 双通道数据采集架构设计 #mermaid-svg-ZHJIMXcMAyDHVhmV {font-family:"trebuchet ms",v…

Explorer++:轻量级高效文件管理器!!

项目简介 Explorer 是一款专为Windows操作系统设计的轻量级且高效的文件管理器。作为Windows资源管理器的强大替代方案&#xff0c;它提供了丰富的特性和优化的用户体验&#xff0c;使得文件管理和组织变得更加便捷高效。无论是专业用户还是普通用户&#xff0c;都能从中受益&a…

7、生命周期:魔法的呼吸节奏——React 19 新版钩子

一、魔法呼吸的本质 "每个组件都是活体魔法生物&#xff0c;呼吸节奏贯穿其生命始终&#xff0c;"邓布利多的冥想盆中浮现三维相位图&#xff0c;"React 19的呼吸式钩子&#xff0c;让组件能量流转如尼可勒梅的炼金术&#xff01;" ——以霍格沃茨魔法生理…

理解计算篇--正则表达式转NFA--理论部分

空正则表达式转NFA单字符正则表达式转NFA拼接正则表达式转NFA选择正则表达式转NFA重复正则表达式转NFA 正则表达式转NFA–实战部分 空正则表达式转NFA 转换步骤&#xff1a; 构建1个只有1个状态的NFA起始状态也是接受状态没有规则&#xff0c;即规则集为空 单字符正则表达式…

稳态模型下的异步电机调速【运动控制系统】

异步电动机&#xff1a; n1是同步转速&#xff08;电机和磁芯同步时候的转速&#xff09; n&#xff1a;电机的实际转速 异步电动机恒压频比的概念&#xff0c;为什么基频以下可以采取恒压频率&#xff0c;基频以上不可以采用恒压频比&#xff1a; 异步电动机的恒压频比&…

【KWDB 创作者计划】_算法篇---Stockwell变换

文章目录 前言一、Stockwell变换原理详解1.1 连续S变换定义1.2 离散S变换1.3简介 二、S变换的核心特点2.1频率自适应的时频分辨率2.1.1高频区域2.1.2低频区域 2.2无交叉项干扰2.3完全可逆2.4相位保持2.5与傅里叶谱的直接关系 三、应用领域3.1地震信号分析3.2生物医学信号处理3.…

云计算(Cloud Computing)概述——从AWS开始

李升伟 编译 无需正式介绍亚马逊网络服务&#xff08;Amazon Web Services&#xff0c;简称AWS&#xff09;。作为行业领先的云服务提供商&#xff0c;AWS为全球开发者提供了超过170项随时可用的服务。 例如&#xff0c;Adobe能够独立于IT团队开发和更新软件。通过AWS的服务&…

Python爬虫第17节-动态渲染页面抓取之Selenium使用下篇

目录 引言 一、获取节点信息 1.1 获取属性 1.2 获取文本值 1.3 获取ID、位置、标签名、大小 二、切换Frame 三、延时等待 3.1 隐式等待 3.2 显式等待 四、前进后退 五、Cookies 六、选项卡管理 七、异常处理 引言 这一节我们继续讲解Selenium的使用下篇&#xff0…

容器docker入门学习

这里写目录标题 容器容器的软件厂商 dockerdocker引擎 虚拟化虚拟化技术 docker安装详解1、安装检查2、安装yum相关的工具3、安装docker-ce软件4、查看docker版本5、启动docker服务6、设置docker开机启动7、查看有哪些docker容器运行进程8、查看容器里有哪些镜像9、下载nginx软…

文献总结:NIPS2023——车路协同自动驾驶感知中的时间对齐(FFNet)

FFNet 一、文献基本信息二、背景介绍三、相关研究1. 以自车为中心的3D目标检测2. 车路协同3D目标检测3. 特征流 四、FFNet网络架构1. 车路协同3D目标检测任务定义2. 特征流网络2.1 特征流生成2.2 压缩、传输与解压缩2.3 车辆传感器数据与基础设施特征流融合 3. 特征流网络训练流…

git 出现 port 443 Connection timed out

梯子正常延迟不算严重&#xff0c;但在使用git push时反复出现 fatal: unable to access https://github.com/irvingwu5/xxxx.git/ Error in the HTTP2 framing layer Failed to connect to github.com port 443 after 136353 ms: Connection timed out 将git的网络配置与梯子…

【2025年4月18日】android studiio最新设置沉浸式状态栏教程

&#x1f62b;【2025年4月18日】搞了一整天&#xff0c;终于完美搞定 Android 沉浸式状态栏&#xff08;WebView 本地HTML&#xff09; 最近在做一个个人项目&#xff0c;用 Android 加载本地 HTML 做个小工具。按理说用 WebView 加载页面很简单嘛——结果沉浸式状态栏这个坑…

如何删除 Launchpad 中 Chrome 的图标

有一天突然在 Launchpad 中出现下面的图标&#xff0c;在 Finder 的 Applications 中也没有&#xff0c;不知道如何删除。最终在《How to remove chrome app icons from launchpad?》中找到了答案。中文互联网上并没有搜到相关帖子&#xff0c;遂作记录。 解决办法很简单&am…

PHP8.2.9NTS版本使用composer报错,扩展找不到的问题处理

使用composer install时报错&#xff1a; The openssl extension is required for SSL/TLS protection but is not available. If you can not enable the openssl extension, you can disable this error, at y our own risk, by setting the ‘disable-tls’ option to true.…

一本通 2063:【例1.4】牛吃牧草 1005:地球人口承载力估计

Topic&#xff1a; Ideas&#xff1a; 为什么把这两道题放在一起呢&#xff1f;就是因为这两道题很类似&#xff0c;都是很简单的数学题&#xff0c;只要你会列出数学等式&#xff0c;你就学会这道题了&#xff01; 下面把计算过程展示给大家 Code&#xff1a; //2025/04/18…

基于用户的协同过滤推荐系统实战项目

文章目录 基于用户的协同过滤推荐系统实战项目1. 推荐系统基础理论1.1 协同过滤概述1.2 基于用户的协同过滤原理1.3 相似度计算方法1.3.1 余弦相似度(Cosine Similarity)1.3.2 皮尔逊相关系数(Pearson Correlation)1.3.3 欧几里得距离(Euclidean Distance)1.3.4 调整余弦相似度…

【SpringBoot】基于Filter实现SQL注入过滤器

最近扫出了一个SQL注入安全漏洞&#xff0c;用户的非法输入可能导致数据泄露、数据篡改甚至系统崩溃&#xff0c;为了有效防范 SQL 注入攻击&#xff0c;除了在代码层面使用参数化查询和预编译语句外&#xff0c;还可以通过实现一个Filter来过滤掉潜在的危险输入。本文将介绍如…