当前位置: 首页 > news >正文

对接金蝶获取接口授权代码

接口服务信息

using RestSharp;
using System.Configuration;
using System.Threading.Tasks;

public class KingdeeAccessTokenService
{
    private readonly RestClient _client;
    private readonly KingdeeApiConfig _config;

    public KingdeeAccessTokenService()
    {
        _client = new RestClient();
        _config = LoadConfiguration();
    }

    /// <summary>
    /// 获取配置文件
    /// </summary>
    /// <returns></returns>
    private KingdeeApiConfig LoadConfiguration()
    {
        return new KingdeeApiConfig
        {
            AppId = ConfigurationManager.AppSettings["KingDee:AppId"] + "",
            AppSecuret = ConfigurationManager.AppSettings["KingDee:AppSecuret"] + "",
            TenantId = ConfigurationManager.AppSettings["KingDee:TenantId"] + "",
            AccountId = ConfigurationManager.AppSettings["KingDee:AccountId"] + "",
            Language = ConfigurationManager.AppSettings["KingDee:Language"] + "",
            AppTokenUrl = ConfigurationManager.AppSettings["KingDee:AppTokenUrl"] + "",
            LoginUrl = ConfigurationManager.AppSettings["KingDee:LoginUrl"] + "",
            User = ConfigurationManager.AppSettings["KingDee:User"] + ""
        };
    }

    /// <summary>
    /// 获取授权key
    /// </summary>
    /// <returns></returns>
    /// <exception cref="AppInfoException"></exception>
    public async Task<string> GetKingdeeAccTokenKey()
    {
        if (!_config.IsValid())
        {
            throw new Exception("GetKingdeeAccTokenKey", "配置参数不完整");
        }

        // 1. 获取AppToken
        var appToken = await GetAppTokenAsync();
        if (string.IsNullOrEmpty(appToken))
            return string.Empty;

        // 2. 获取AccessToken
        return await GetAccessTokenAsync(appToken);
    }

    /// <summary>
    /// 获取AppKey
    /// </summary>
    /// <returns></returns>
    /// <exception cref="AppInfoException"></exception>
    private async Task<string> GetAppTokenAsync()
    {
        var appTokenParams = new AppTokenRequestParams
        {
            appId = _config.AppId,
            appSecuret = _config.AppSecuret,
            tenantid = _config.TenantId,
            accountId = _config.AccountId,
            language = _config.Language
        };

        var result = await CallApiAsync<ResponseResult<TokenData>>(_config.AppTokenUrl, appTokenParams);
        if (result?.data.error_code != "0")
        {
            throw new Exception("GetAppTokenAsync", result?.data.error_desc);
        }
        return result.data.app_token;
    }

    /// <summary>
    /// 获取授权返回结果
    /// </summary>
    /// <param name="appToken"></param>
    /// <returns></returns>
    private async Task<string> GetAccessTokenAsync(string appToken)
    {
        var loginRequest = new LoginRequestParams
        {
            user = _config.User,
            apptoken = appToken,
            tenantid = _config.TenantId,
            accountId = _config.AccountId,
            language = _config.Language
        };

        var result = await CallApiAsync<ResponseResult<TokenData>>(_config.LoginUrl, loginRequest);
        if (result?.data.error_code != "0")
        {
            throw new AppInfoException("GetAccessTokenAsync", result?.data.error_desc);
        }
        return result.data.access_token;
    }

    /// <summary>
    /// WebApi 请求
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="endpoint"></param>
    /// <param name="requestBody"></param>
    /// <returns></returns>
    public async Task<T> CallApiAsync<T>(string endpoint, object requestBody)
    {
        var request = new RestRequest(endpoint, Method.Post);
        request.AddHeader("Content-Type", "application/json");
        request.AddHeader("Accept", "*/*");
        request.AddJsonBody(requestBody);

        var response = await _client.ExecuteAsync<T>(request);
        
        if (!response.IsSuccessful)
        {
            throw new Exception("CallApiAsync",response.Content);
        }

        return response.Data;
    }
}

token 实体1

 public class AppTokenRequestParams
 {
     /// <summary>
     /// appId
     /// </summary>
     public string appId { get; set; }
     /// <summary>
     /// appKey
     /// </summary>
     public string appSecuret { get; set; }
     /// <summary>
     /// 
     /// </summary>
     public string tenantid { get; set; }
     /// <summary>
     /// 账户id
     /// </summary>
     public string accountId { get; set; }
     /// <summary>
     /// 语言
     /// </summary>
     public string language { get; set; }
 }

//异常实体

 public class ErrorViewModel
 {
     /// <summary>
     /// 
     /// </summary>
     public string? RequestId { get; set; }

     /// <summary>
     /// 
     /// </summary>
     public bool ShowRequestId => !string.IsNullOrEmpty(RequestId);
 }

//配置参数

public class KingdeeApiConfig
{
    public string AppId { get; set; }
    public string AppSecuret { get; set; }
    public string TenantId { get; set; }
    public string AccountId { get; set; }
    public string Language { get; set; }
    public string AppTokenUrl { get; set; }
    public string LoginUrl { get; set; }
    public string User { get; set; }

    public bool IsValid()
    {
        return !string.IsNullOrEmpty(AppId) &&
               !string.IsNullOrEmpty(AppSecuret) &&
               !string.IsNullOrEmpty(TenantId) &&
               !string.IsNullOrEmpty(AccountId) &&
               !string.IsNullOrEmpty(Language) &&
               !string.IsNullOrEmpty(AppTokenUrl) &&
               !string.IsNullOrEmpty(LoginUrl) &&
               !string.IsNullOrEmpty(User);
    }
}

//登录参数


    /// <summary>
    /// 
    /// </summary>
    public class LoginRequestParams
    {
        /// <summary>
        /// 
        /// </summary>
        public string user { get; set; }

        /// <summary>
        /// 
        /// </summary>
        public string apptoken { get; set; }

        /// <summary>
        /// 
        /// </summary>
        public string tenantid { get; set; }

        /// <summary>
        /// 
        /// </summary>
        public string accountId { get; set; }

        /// <summary>
        /// 
        /// </summary>
        public string usertype { get; set; }

        /// <summary>
        /// 
        /// </summary>
        public string language { get; set; }
    }

  //返回接口

 public class ResponseResult<T>
 {
     /// <summary>
     /// 
     /// </summary>
     public  T data { get; set; }

     /// <summary>
     /// 
     /// </summary>
     public  string state { get; set; }

     /// <summary>
     /// 
     /// </summary>
     public bool status { get; set; }
 }

//token信息

public class TokenData
{
    /// <summary>
    /// 
    /// </summary>
    public string app_token { get; set; }
    /// <summary>
    /// 
    /// </summary>
    public string access_token { get; set; }
    /// <summary>
    /// 
    /// </summary>
    public bool success { get; set; }

    /// <summary>
    /// 
    /// </summary>
    public string error_desc { get; set; }

    /// <summary>
    /// 
    /// </summary>
    public long expire_time { get; set; }

    /// <summary>
    /// 
    /// </summary>
    public string error_code { get; set; }
}

http://www.xdnf.cn/news/132373.html

相关文章:

  • 第3讲、大模型如何理解和表示单词:词嵌入向量原理详解
  • Blender好用的插件推荐汇总
  • 电脑温度怎么看 查看CPU温度的方法
  • Golang | 位运算
  • DELPHI实现dbTreeView的节点拖动并更新
  • 为什么说美颜SDK动态贴纸才是直播、短视频平台的下一个爆点?看完你就懂了!
  • 连续帧点云目标检测结果展示,python实现
  • 这个免费的AI插件,居然让我5分钟看完2小时的YouTube视频!
  • 大麦项目pro版本来袭!扫平面试中的一切疑难杂症!
  • 视频丨Google 最新 AI 眼镜原型曝光:轻量 XR+情境感知 AI 打造下一代计算平台
  • 【C语言练习】002. 理解C语言的基本语法结构
  • 存储新势力:助力DeepSeek一体机
  • GIT下载步骤
  • Base64编码原理:二进制数据与文本的转换技术
  • 因泰立H13激光雷达赋能垃圾发电厂,炉渣体积测量与装车智能化
  • 跨Linux发行版CPU指令集兼容性深度解析与实践指南
  • 一文读懂Nginx应用之 CentOS安装部署Nginx服务
  • 当智驾成标配,车企暗战升级|2025上海车展
  • 告别 “幻觉” 回答:RAG 中知识库与生成模型的 7 种对齐策略
  • CUDA编程之Grid、Block、Thread线程模型
  • 用 ESP32 模拟 Wiegand 刷卡器:开发门禁系统必备的小工具
  • 【CODEMATE】进制转换(transform) 粤港澳青少年信息学创新大赛 C/C++/Python 解题思路
  • WebUI可视化:第2章:技术基础准备
  • 日语学习-日语知识点小记-构建基础-JLPT-N4阶段(11): てあります。
  • 《拆掉思维里的墙》 古典-摘抄
  • k8s(9) — zookeeper集群部署(亲和性、污点与容忍测试)
  • Xmind快捷键大全
  • 【Dify系列教程重置精品版】第1课 相关概念介绍
  • android jatpack Compose 多数据源依赖处理:从状态管理到精准更新的架构设计
  • const(C++)