金蝶星空云OpenAPI对接

本文使用spring boot 来配置对接金蝶接口,由于客户使用的金蝶客户端6.2版本,所以金蝶官网的webapi的开发指南并不适用,最新金蝶版本sdk,使用的配置按照文档生成后报密钥转换异常,个人怀疑是版本不同原因,本人亲自尝试,也可能本人配置的问题,大家亲自尝试(客户端旧版本,SDK最新版本,一下是本人具体的使用过程,请参考,由于还没有正式参与业务开发,本文通过单元测试来验证最后结果:

相关的配置文件:```

loginInfo.properties
logininfo.acctID=xxxxxxxxx
logininfo.userName=xxxxxxxxx
logininfo.password=xxxxxxxxx
logininfo.appID=xxxxxx
logininfo.appSec=xxxxxxxxxxx
logininfo.serverUrl=http://xxxxxxxxxxx/K3cloud/

登录配置类

@Component
@PropertySource(value = {"classpath:kingdeelogin.properties"})
@ConfigurationProperties(prefix = "logininfo")
public class LoginConfig {private String serverUrl;private String acctID;private int lCID = 2052;private String userName;private String password;String appId;String appSecret;String orgNum;String secSmartKet;int connectTimeout;int requestTimeout;int stockTimeout;String proxy;public String getServerUrl() {return this.serverUrl;}public LoginConfig setServerUrl(String serverUrl) {this.serverUrl = serverUrl;return this;}public String getAcctID() {return acctID;}public void setAcctID(String acctID) {this.acctID = acctID;}public int getlCID() {return this.lCID;}public LoginConfig setlCID(int lCID) {this.lCID = lCID;return this;}public String getUserName() {return this.userName;}public LoginConfig setUserName(String userName) {this.userName = userName;return this;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public String getAppId() {return this.appId;}public LoginConfig setAppId(String appId) {this.appId = appId;return this;}public String getAppSecret() {return this.appSecret;}public LoginConfig setAppSecret(String appSecret) {this.appSecret = appSecret;return this;}public String getOrgNum() {return this.orgNum;}public void setOrgNum(String orgNum) {this.orgNum = orgNum;}public String getSecSmartKet() {return this.secSmartKet;}public void setSecSmartKet(String secSmartKet) {this.secSmartKet = secSmartKet;}public int getConnectTimeout() {return this.connectTimeout;}public void setConnectTimeout(int connectTimeout) {this.connectTimeout = connectTimeout;}public int getRequestTimeout() {return this.requestTimeout;}public void setRequestTimeout(int requestTimeout) {this.requestTimeout = requestTimeout;}public int getStockTimeout() {return this.stockTimeout;}public void setStockTimeout(int stockTimeout) {this.stockTimeout = stockTimeout;}public String getProxy() {return this.proxy;}public void setProxy(String proxy) {this.proxy = proxy;}
}

KingdeeService接口:

package com.k3cloud.k3cloud_demo.service;import com.k3cloud.k3cloud_demo.vo.ResultVo;/****/
public interface KingdeeService {/*** @Description: 金蝶登录接口*/boolean login() throws Exception;/*** @Description: 金蝶查询接口* @param content 查询参数*/ResultVo view(String formId, String content) throws Exception;String findOne(String formId, String content) throws Exception;/*** @Description: 保存接口* @param content json格式参数*/void save(String formId, String content) throws Exception;/*** 提交* @param formId* @param content* @throws Exception*/void submit(String formId, String content) throws Exception;/*** 审核* @param formId* @param content* @throws Exception*/void audit(String formId, String content) throws Exception;/*** 不审核* @param formId* @param content* @throws Exception*/void unAudit(String formId, String content) throws Exception;/*** 状态改变接口*/void statusConvert(String formId, String content) throws Exception;String findListByParam(String formId, String content)  throws Exception;}

KingdeeServiceImpl 实现类:

package com.k3cloud.k3cloud_demo.service.impl;import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.k3cloud.k3cloud_demo.config.K3CloundConfig;
import com.k3cloud.k3cloud_demo.config.LoginConfig;
import com.k3cloud.k3cloud_demo.service.KingdeeService;
import com.k3cloud.k3cloud_demo.util.HttpUtil;
import com.k3cloud.k3cloud_demo.util.ResultUtil;
import com.k3cloud.k3cloud_demo.vo.ResultVo;
import org.json.JSONArray;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.*;@Service
public class KingdeeServiceImpl implements KingdeeService {@Autowiredprivate LoginConfig loginConfig;public static String POST_K3CloudURL = "http://xxxxx.com/K3cloud/";/*** 连接超时时间*/private static final int CONN_TIMEOUT = 30000;/*** 请求超时时间*/private static final int READ_TIMEOUT = 30000;// Cookie ֵprivate static String CookieVal = null;private static Map map = new HashMap();static {map.put("Save","Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.Save.common.kdsvc");map.put("View","Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.View.common.kdsvc");map.put("Submit","Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.Submit.common.kdsvc");map.put("Audit","Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.Audit.common.kdsvc");map.put("UnAudit","Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.UnAudit.common.kdsvc");map.put("StatusConvert","Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.StatusConvert.common.kdsvc");map.put("ViewList","Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.ExecuteBillQuery.common.kdsvc");}@Overridepublic boolean login() throws Exception {boolean bResult = false;String sUrl = "Kingdee.BOS.WebApi.ServicesStub.AuthService.ValidateUser.common.kdsvc";JSONArray jParas = new JSONArray();jParas.put(loginConfig.getAcctID());jParas.put(loginConfig.getUserName());jParas.put(loginConfig.getPassword());jParas.put(loginConfig.getlCID());HttpURLConnection connection = initUrlConn(sUrl, jParas);// ��ȡCookieString key = null;Map<String, List<String>> headerFields = connection.getHeaderFields();for (int i = 1; (key = connection.getHeaderFieldKey(i)) != null; i++) {if (key.equalsIgnoreCase("Set-Cookie")) {String tempCookieVal = connection.getHeaderField(i);if (tempCookieVal.startsWith("kdservice-sessionid")) {CookieVal = tempCookieVal;break;}}}BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));String line;while ((line = reader.readLine()) != null) {bResult = line.contains("\"LoginResultType\":1");}reader.close();connection.disconnect();return bResult;}@Overridepublic void save(String formId, String content) throws Exception {invoke("Save", formId, content);}@Overridepublic String findOne(String formId, String content) throws Exception{return invoke("View", formId, content);}@Overridepublic ResultVo view(String formId, String content) throws Exception {String result = invoke("View", formId, content);JSONObject jsonObject = JSON.parseObject(result);Map<String,Object> map = (Map<String, Object>) jsonObject.get("Result");Map<String,Object> responseStatus = (Map<String, Object>) map.get("ResponseStatus");if(responseStatus!=null){Boolean isSuccess = (Boolean) responseStatus.get("IsSuccess");if(isSuccess){return ResultUtil.success(JSON.toJSONString(map.get("Result")));}else{List<Map<String,Object>> errors = (List<Map<String, Object>>) responseStatus.get("Errors");return ResultUtil.error(responseStatus.getOrDefault("ErrorCode","0").toString(),JSON.toJSONString(errors));}}return ResultUtil.success(JSON.toJSONString(map.get("Result")));}public String findListByParam(String formId, String content)  throws Exception{Map<String,Object> header = new HashMap<>();header.put("Cookie",CookieVal);String viewList = HttpUtil.httpPost(POST_K3CloudURL.concat(map.get("ViewList").toString()), header, content);System.out.println(viewList);return invoke("ViewList", formId, content);}@Overridepublic void submit(String formId, String content) throws Exception {invoke("Submit", formId, content);}@Overridepublic void audit(String formId, String content) throws Exception {invoke("Audit", formId, content);}@Overridepublic void unAudit(String formId, String content) throws Exception {invoke("UnAudit", formId, content);}@Overridepublic void statusConvert(String formId, String content) throws Exception {invoke("StatusConvert", formId, content);}private String invoke(String deal, String formId, String content)throws Exception {StringBuilder sb = new StringBuilder();String sUrl = String.valueOf(map.get(deal));JSONArray jParas = new JSONArray();if(!deal.equalsIgnoreCase("ViewList")){jParas.put(formId);}jParas.put(content);HttpURLConnection connectionInvoke = initUrlConn(sUrl, jParas);BufferedReader reader = new BufferedReader(new InputStreamReader(connectionInvoke.getInputStream()));String line;while ((line = reader.readLine()) != null) {String sResult = new String(line.getBytes(), "utf-8");sb.append(sResult);}reader.close();connectionInvoke.disconnect();return sb.toString();}// HttpURLConnectionprivate HttpURLConnection initUrlConn(String url, JSONArray paras)throws Exception {URL postUrl = new URL(POST_K3CloudURL.concat(url));HttpURLConnection connection = (HttpURLConnection) postUrl.openConnection();if (CookieVal != null) {connection.setRequestProperty("Cookie", CookieVal);}if (!connection.getDoOutput()) {connection.setDoOutput(true);}connection.setRequestMethod("POST");connection.setUseCaches(false);connection.setInstanceFollowRedirects(true);connection.setRequestProperty("Content-Type", "application/json");connection.setConnectTimeout(CONN_TIMEOUT);connection.setReadTimeout(READ_TIMEOUT);DataOutputStream out = new DataOutputStream(connection.getOutputStream());UUID uuid = UUID.randomUUID();int hashCode = uuid.toString().hashCode();JSONObject jObj = new JSONObject();jObj.put("format", 1);jObj.put("useragent", "ApiClient");jObj.put("rid", hashCode);jObj.put("parameters", chinaToUnicode(paras.toString()));jObj.put("timestamp", new Date().toString());jObj.put("v", "1.0");out.writeBytes(jObj.toString());out.flush();out.close();return connection;}/*** 把中文转成Unicode码** @param str* @return*/public String chinaToUnicode(String str) {String result = "";for (int i = 0; i < str.length(); i++) {int chr1 = (char) str.charAt(i);if (chr1 >= 19968 && chr1 <= 171941) {// 汉字范围 \u4e00-\u9fa5 (中文)result += "\\u" + Integer.toHexString(chr1);} else {result += str.charAt(i);}}return result;}
}

单元测试:

package com.k3cloud.k3cloud_demo;import com.alibaba.fastjson.JSON;
import com.k3cloud.k3cloud_demo.config.K3CloundConfig;
import com.k3cloud.k3cloud_demo.service.K3CloudService;
import com.k3cloud.k3cloud_demo.service.KingdeeService;
import com.k3cloud.k3cloud_demo.util.HttpUtil;
import com.k3cloud.k3cloud_demo.vo.ResultVo;
import org.json.JSONArray;
import org.json.JSONObject;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;import java.net.http.HttpClient;
import java.util.ArrayList;
import java.util.List;
import java.util.WeakHashMap;@RunWith(SpringRunner.class)
@SpringBootTest
class K3cloudDemoApplicationTests {@Autowiredprivate KingdeeService kingdeeService;@Autowiredprivate K3CloudService k3CloudService;@Autowiredprivate K3CloundConfig k3CloundConfig;@Testpublic void longTest() throws Exception {boolean login = kingdeeService.login();System.out.println(login);JSONArray jParas = new JSONArray();jParas.put("5805d768ab3734");jParas.put("邸斌斌");jParas.put("kaifa.258");jParas.put(2052);ResultVo login1 = k3CloudService.login(k3CloundConfig.getUrl().concat(k3CloundConfig.getLogin()), jParas.toString());System.out.println(login1);//k3CloudService.view(kingdeeService.)}/*** 客户查询* @throws Exception*/@Testpublic void consumerViewTest() throws Exception{boolean login = kingdeeService.login();System.out.println(login);String jsonData = "{\"CreateOrgId\":0,\"Number\":\"xxxxxx\",\"Id\":\"\"}";System.out.println(kingdeeService.view("BD_Customer", jsonData));System.out.println(kingdeeService.findOne("BD_Customer", jsonData));}/*** 采购订单查询* @throws Exception*/@Testpublic void puichaseOrderQeuryTest() throws Exception {boolean login = kingdeeService.login();System.out.println(login);String jsonData = "{\"CreateOrgId\":0,\"Number\":\"xxxxxxxxx6\",\"Id\":\"\"}";System.out.println(kingdeeService.view("PUR_PurchaseOrder", jsonData));}/*** 采购列表*/@Testpublic void purcharseOrderListTest() throws Exception{boolean login = kingdeeService.login();System.out.println(login);String sBegDate="2021-10-13 00:00:00";String sEndDate="2021-10-14 23:59:59";JSONObject jsonObject=new JSONObject();jsonObject.put("FormId","PUR_PurchaseOrder");jsonObject.put("FieldKeys", "FID,FSupplierId,FMaterialId,FMaterialId.FNumber,FMaterialName");jsonObject.put("FilterString", "");// OrderString  :排序字段,建议使用单据头字段排序jsonObject.put("OrderString", "");// StartRow     : 分页取数开始// TopRowCount  : 查询最大行数jsonObject.put("TopRowCount", 0);jsonObject.put("StartRow", 0);// Limit        : 每页行数jsonObject.put("Limit", 10);String jsonData = "{\"FormId\":\"PUR_PurchaseOrder\",\"FieldKeys\":\"FID,FSupplierId,FMaterialId,FMaterialId.FNumber,FMaterialName\",\"FilterString\":\"\",\"OrderString\":\"\",\"TopRowCount\":0,\"StartRow\":0,\"Limit\":10}";System.out.println(kingdeeService.findListByParam("PUR_PurchaseOrder", jsonObject.toString()));System.out.println(kingdeeService.findListByParam("PUR_PurchaseOrder", jsonData));}}

金蝶星空云OpenAPI对接相关推荐

  1. java金蝶星空云金蝶Java 对接 金蝶云星空 接口 对接 金蝶API 对接 金蝶 接口 解决 会话失效 问题 会话已失效,请重新登录

    java金蝶星空云金蝶Java 对接 金蝶云星空 接口 对接 金蝶API 对接 金蝶 接口 解决 会话失效 问题 会话已失效,请重新登录 1.准备工作 1.1 接口调用账户 1.2 下载 金蝶星空云 ...

  2. 金蝶星空云K3Cloud V7.6企业版及标准版

    网址 https://www.chuanqi.press/ 授权 wx : boyun36801 QQ: 764453295 下载:https://www.chuanqi.press/a/seojis ...

  3. 赛意SMOM和金蝶云星空单据接口对接

    赛意SMOM和金蝶云星空单据接口对接 数据源系统:金蝶云星空 金蝶K/3Cloud在总结百万家客户管理最佳实践的基础上,提供了标准的管理模式:通过标准的业务架构:多会计准则.多币别.多地点.多组织.多 ...

  4. 马帮和金蝶云星空接口打通对接实战

    马帮和金蝶云星空接口打通对接实战 数据源平台:马帮 上海马帮科技有限公司,是一家专注于提供全流程跨境电商ERP管理软件解决方案的企业.聚焦服务于各阶段.各领域的跨境电商从业者,旗下包含专业版ERP.亚 ...

  5. 管易云和金蝶云星空接口打通对接实战

    管易云和金蝶云星空接口打通对接实战 接通系统:管易云 金蝶管易云是金蝶集团旗下以电商和新零售为核心业务的子公司,公司于2008年成立,拥有从事电商及新零售业务相关专业知识工作者超过1000人.为伊利. ...

  6. 吉客云和金蝶云星空接口打通对接实战

    吉客云和金蝶云星空接口打通对接实战 对接系统吉客云 "吉客云"是一站式企业数字化解决方案系统,可实现业务.财务.办公.人事等一体化管理.相对于传统多套软件系统的集成方案," ...

  7. 聚水潭和金蝶云星空接口打通对接实战

    聚水潭和金蝶云星空接口打通对接实战 接通系统:聚水潭 聚水潭SaaSERP于2014年4月上线,目前累计超过2.5万商家注册使用,成为淘宝应用服务市场ERP类目商家数和商家月订单增速最快的ERP.20 ...

  8. 金蝶云星空和金蝶云星空单据接口对接

    金蝶云星空和金蝶云星空单据接口对接 接通系统:金蝶云星空 金蝶K/3Cloud结合当今先进管理理论和数十万家国内客户最佳应用实践,面向事业部制.多地点.多工厂等运营协同与管控型企业及集团公司,提供一个 ...

  9. 旺店通·旗舰奇门和金蝶云星空接口打通对接实战

    旺店通·旗舰奇门和金蝶云星空接口打通对接实战 来源系统:旺店通·旗舰奇门 慧策(原旺店通)是一家技术驱动型智能零售服务商,基于云计算PaaS.SaaS模式,以一体化智能零售解决方案,帮助零售企业数字化 ...

最新文章

  1. 冯诺依曼计算机程序及其执行,第4章冯.诺依曼计算机:机器级程序与其执行练习题答案解析...
  2. python解释器可以使用什么命令_python解释器用什么写的
  3. 大学计算机一级考试内容和范围,大学计算机一级考试.doc
  4. ajax添加和删除数据,ajax 添加 更新 删除数据库
  5. Lc151翻转字符串里的单词
  6. 如果软件也玩凡尔赛文学,将如何对话?
  7. Mac OS 系统工具使用
  8. 如何在百度收录平台注册账号获取Token
  9. 618|Python购书攻略
  10. Zookeeper轻松上手
  11. Android专业获取设备信息如:AndroidID、唯一设备ID、制造商、型号、版本号、版本码等
  12. mysql先过滤后分组_MySQL分组过滤
  13. JAVA生成阿里云直播推流和拉流
  14. 万能检测数据类型的方法
  15. python人脸识别解锁电脑_Python 实现在 App 端的人脸识别!手机解锁人脸识别!
  16. 【HTML基础】HTML文字效果标签+超齐全颜色表(可直接复制使用)
  17. eslint plugins与extends的区别
  18. Windows必装的3款免费效率工具,排名不分先后
  19. 汤因比的《历史研究》所感之一
  20. 华为以新ICT构筑数字平台,为城市智能化赋予力量

热门文章

  1. 国产高性能DSP音频处理芯片的工作原理以及应用领域
  2. [转]灰度共生矩阵(超简单理解)
  3. 谁有cmmi v2.0中文版本的下载地址,分享一下,谢谢
  4. 云视听极光TV版闪退解决方案
  5. 大文件切片上传、视频切片上传转m3u8播放
  6. java流水号生成规则_流水号生成规则
  7. node.js毕业设计联影医疗器械管理系统小程序(源码+程序+LW+部署)
  8. javadouble向上取整,干货满满!
  9. 三丰三坐标编程基本步骤_蔡司三坐标测量机操作技巧,有蔡司三坐标的工厂都清除清楚吗?...
  10. 三坐标程序是C语言,三坐标程序编写系统及方法