用友U8+ API接口使用教程

前言

U8+和其他的公开的开放API接口有一些差异,他是需要先对接的到代理服务器,通过代理服务器进行对接,所以只要保证U8+能上网就能对接,和畅捷通T+的模式有点类似
流程:

  1. 注册成为开发者(用于创建用友U8 API应用);
  2. 注册企业账号(用于提供数据);
  3. U8服务器上配置用友服务器数据接口,并安装和运行“用友开放平台客户端”;
  4. 开发者账号创建应用,并向企业账号申请授权;
  5. 企业账号审批通过应用授权申请,并在网站后台为应用配置数据源;
  6. 开发接入。

一、开发者和企业账号
首先,开发应用需要注册一个用友开放平台的开发者账号,通过认证后,可以在管理页面创建自己的应用,填写应用的基本信息,并选择需要的接口权限后,应用就创建完成了。
 


然后,用户需要到授权页面向指定的企业账号发起调用申请,在这个页面里也可以看到授权状态、U8开放平台客户端的运行状态。
 


而作为数据源的所有者,企业也需要注册一个开放平台的账号(企业账号应该也可以直接认证成开发者),这个账号主要有三个任务:审批来自开发者的应用授权申请;为开发者的应用配置数据源(网站和服务器);通过U8服务器上的开放平台软件发布数据接口。
下图是企业账号审批、查看应用授权的界面:


二、服务器数据源配置
服务器上一共用到三个软件:

  1. EAI接口设置:身份验证和数据源配置
  2. EAI环境检测与修复工具(平时没什么用,用来检测运行环境)
  3. 用友开放平台客户端(数据代理程序,必须打开才能提供外部数据访问)


三、接入

  1. 开发者:创建应用、申请权限;
  2. 企业账号:审批应用、配置网页数据参数、配置服务器EAI数据源、运行开放平台客户端。
    完成上述工作后,就可以正式接入API并开始开发工作了。
    需要注意的是,应用程序只需要具备Internet访问能力即可,不需要直接访问U8服务器,所有数据请求会从U8开放平台代理到U8服务器上。
    用友开放平台API参考手册:用友U8开放平台 - API中心

在开始前,第一步要做的就是用创建应用时的appkey和appsecret拿到Token,有了Token就可以按业务需求进行数据交互了。
除了token参数,几乎所有接口都有一个from_account参数和to_account参数,就像字面上所说,前者from_account指开发者账号,后者to_account是指数据提供方的企业账号。
Response

/// <summary>
/// 非列表类型的数据接口Response
/// </summary>
public class U8ResponseBase
{
[JsonPropertyName(“errcode”)]
public string ErrorCode { get; set; } = string.Empty;

[JsonPropertyName("errmsg")]
public string ErrorMessage { get; set; } = string.Empty;public bool Succ => ErrorCode == "0";

}
/// <summary>
/// 列表类型的数据接口Response
/// </summary>
public class U8ResponseList : U8ResponseBase
{
[JsonPropertyName(“page_index”)]
public string PageIndex { get; set; } = “0”;

[JsonPropertyName("page_count")]
public string PageCount { get; set; } = "0";[JsonPropertyName("row_count")]
public string RowCount { get; set; } = "0";

}

Token

public class U8ResponseToken : U8ResponseBase
{
[JsonPropertyName(“token”)]
public U8Token? Token { get; set; }
}
public class U8Token
{
[JsonPropertyName(“appKey”)]
public string AppKey { get; set; } = "";
[JsonPropertyName(“expiresIn”)]
public int ExpiresIn { get; set; }
[JsonPropertyName(“id”)]
public string Id { get; set; } = "";
/// <summary>
/// Token过期时间,取真实有效期的90%
/// </summary>
public DateTime Exp { get; set; }
}

GetToken(非列表类型的数据接口)
/// <summary>
/// 获取U8 Api Token
/// </summary>
/// <param name=“source”>调用方,仅用于记录</param>
/// <param name=“force”>不判断当前Token有效性,强制重新请求一个Token</param>
/// <returns></returns>
public static void GetToken(bool force = false)
{
//有效期剩余>10%,并且未要求强制刷新,并且上一次获取Token成功
if (Token.Exp < DateTime.Now && !force && Token.Success)
{
Console.WriteLine(“GetToken: Skip”);
return;
}
using WebClient client = new();

Token.Success = false;
try
{string resp = client.DownloadString($"https://api.yonyouup.com/system/token?" +$"from_account={STRINGS.FROM_ACCOUNT}&app_key={U8Credentials[0].AppKey}&app_secret={U8Credentials[0].AppSecret}");var respObj = JsonSerializer.Deserialize<U8ResponseToken>(resp);if (respObj?.Token is null){Console.WriteLine("GetToken: FAILED");return;}Token = respObj.Token;Token.Success = true;Token.Exp = DateTime.Now.AddSeconds(Token.ExpiresIn * 0.9);Console.WriteLine(JsonSerializer.Serialize(Token));
}
catch (Exception ex)
{Console.WriteLine($"GetToken: Exception {ex.Message}");
}//失败了就等下一次

}

批量获取采购订单(列表类型的数据接口)
public static void GetPurchaseOrders(DateTime start, DateTime end)
{
if (start.Year < 2000) start = DateTime.Now.AddDays(-7);
if (end.Year < 2000) end = DateTime.Now;
if (start > end) (start, end) = (end, start);

string date_begin = start.ToString("yyyy-MM-dd");
string date_end = end.ToString("yyyy-MM-dd");
//https://api.yonyouup.com/api/purchaseorderlist/batch_get
using WebClient client = new();
int pagecount = 1;
int page = 1;
List<U8PurchaseOrderSimple> simples = new();
while (page == 1 || page <= pagecount)
{string resp = client.DownloadString($"https://api.yonyouup.com/api/purchaseorderlist/batch_get?from_account={STRINGS.FROM_ACCOUNT}&to_account={STRINGS.TO_ACCOUNT}&" +$"app_key={U8Credentials[0].AppKey}&token={Token.Id}&rows_per_page=100&page_index={page++}&date_begin={date_begin}&date_end={date_end}");var batch = JsonSerializer.Deserialize<U8ResponsePurchaseOrderList>(resp) ?? new();simples = simples.Concat(batch.Orders).ToList();pagecount = Convert.ToInt32(batch.PageCount);Console.WriteLine($"{batch.PageIndex} of {pagecount}, {simples.Count} of {batch.RowCount}\r\n{resp}");
}

}

public class U8ResponsePurchaseOrderList : U8ResponseList
{
[JsonPropertyName(“purchaseorderlist”)]
public List<U8PurchaseOrderSimple> Orders { get; set; } = new();
}

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

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

相关文章

检查读取数据寄存器输出的多扇出

为使第二寄存器被 RAM 原语吸收&#xff0c;来自存储器阵列的数据输出位的扇出必须为 1 。这在下图中进行了说明。 检查地址 / 读取数据寄存器上的复位信号 不应复位存储器阵列。只有 RAM 的输出可以容许复位。复位必须是同步的&#xff0c;以便将输出寄存器推断到 RAM 基元…

MongoDB-ObjectID 生成器

前言 MongoDB中一个非常关键的概念就是 ObjectID&#xff0c;它是 MongoDB 中每个文档的默认唯一标识符。了解 ObjectID 的生成机制不仅有助于开发人员优化数据库性能&#xff0c;还能帮助更好地理解 MongoDB 的设计理念。 什么是 MongoDB ObjectID&#xff1f; 在 MongoDB …

渗透测试工具 -- SQLmap安装教程及使用

随着网络安全问题日益严峻&#xff0c;渗透测试成为了保护信息安全的重要手段。而在渗透测试的众多工具中&#xff0c;SQLmap凭借其强大的自动化SQL注入检测和利用能力&#xff0c;成为了网络安全专家必备的利器。那么&#xff0c;你知道如何高效地使用SQLmap进行漏洞扫描吗&am…

SpringBoot 整合 RabbitMQ 实现流量消峰

RabbitMQ 即一个消息队列&#xff0c;主要是用来实现应用程序的异步和解耦&#xff0c;同时也能起到消息缓冲&#xff0c;消息分发的作用。 消息中间件在互联网公司的使用中越来越多&#xff0c;刚才还看到新闻阿里将 RocketMQ 捐献给了 Apache&#xff0c;当然了今天的主角还…

Git-分支(branch)常用命令

分支 我们在做项目开发的时候&#xff0c;无论是软件项目还是其他机械工程项目&#xff0c;我们为了提高效率以及合理的节省时间等等原因&#xff0c;现在都不再是线性进行&#xff0c;而是将一个项目抽离出诸进行线&#xff0c;每一条线在git中我们就叫做分支&#xff0c;bran…

springboot425滑雪场管理系统(论文+源码)_kaic

摘要 近年来&#xff0c;信息化管理行业的不断兴起&#xff0c;使得人们的日常生活越来越离不开计算机和互联网技术。首先&#xff0c;根据收集到的用户需求分析&#xff0c;对设计系统有一个初步的认识与了解&#xff0c;确定滑雪场管理系统的总体功能模块。然后&#xff0c;详…

好玩的汇编编译器NASM:一款基于x86架构的汇编与反汇编软件

好玩的汇编编译器NASM This is the project webpage for the Netwide Assembler (NASM), an asssembler for the x86 CPU architecture portable to nearly every modern platform, and with code generation for many platforms old and new. Netwide Assembler&#xff08;…

【AI知识】有监督学习分类任务之支持向量机

1.支持向量机概念 支持向量机&#xff08;Support Vector Machine, SVM&#xff09; 是一种有监督学习算法&#xff0c;主要用于分类任务&#xff08;也可用于回归任务&#xff0c;即支持向量回归&#xff0c;SVR&#xff09;。SVM的核心思想是找到一个最优的超平面&#xff0…

杭州乘云联合信通院发布《云计算智能化可观测性能力成熟度模型》

原文地址&#xff1a;杭州乘云联合中国信通院等单位正式发布《云计算智能化可观测性能力成熟度模型》标准 2024年12月3日&#xff0c;由全球数字经济大会组委会主办、中国信通院承办的 2024全球数字经济大会 云AI计算创新发展大会&#xff08;2024 Cloud AI Compute Ignite&…

【经典】制造供应链四类策略(MTS、MTO、ATO、ETO)细说

关注作者 制造供应链的牛鞭问题与复杂问题主要是从两个方面解决&#xff0c;一是同步化供应链消减从需求到供应的放大效应&#xff0c;二是供应链细分&#xff0c;针对不同的客户、不同的需求供应的匹配策略来应对复杂性&#xff0c;更好的满足客户并以最低的总成本来实现。 对…

实时日志与发展:Elasticsearch 推出全新专用的 logsdb 索引模式

作者&#xff1a;来自 Elastic Mark Settle, George Kobar 及 Amena Siddiqi Elastic 最新发布的 logsdb 索引模式是专为日志管理优化的功能&#xff0c;旨在提升日志数据的存储效率、查询性能以及整体可用性。这个模式专注于满足现代日志处理需求&#xff0c;提供更高效的日志…

React Image Crop——在React应用中轻松实现图片裁剪功能

React Image Crop是一个用于在React应用程序中裁剪和调整图像的库。它提供了一个简单而强大的界面&#xff0c;允许用户选择和调整裁剪区域&#xff0c;并生成裁剪后的图像。 什么是React Image Crop&#xff1f; React Image Crop是一个开源的React组件&#xff0c;用于在浏览…

【HarmonyOS】鸿蒙应用实现手机摇一摇功能

【HarmonyOS】鸿蒙应用实现手机摇一摇功能 一、前言 手机摇一摇功能&#xff0c;是通过获取手机设备&#xff0c;加速度传感器接口&#xff0c;获取其中的数值&#xff0c;进行逻辑判断实现的功能。 在鸿蒙中手机设备传感器ohos.sensor (传感器)的系统API监听有以下&#xf…

微积分复习笔记 Calculus Volume 2 - 3.7 Improper Integrals

3.7 Improper Integrals - Calculus Volume 2 | OpenStax

ViewModel

ViewMode是MVVM架构模式中VM层对应的类&#xff0c;它的作用是存储界面数据&#xff0c;并和界面发生数据交互。ViewModel能感知生命周期&#xff0c;并且在界面由于配置问题发生重建时候&#xff0c;可以保持当前的数据不变。生命周期如下&#xff1a; ViewMode由ViewModePr…

智慧城市道路分割数据集labelme格式2648张1类别

数据集格式&#xff1a;labelme格式(不包含mask文件&#xff0c;仅仅包含jpg图片和对应的json文件) 图片数量(jpg文件个数)&#xff1a;2648 标注数量(json文件个数)&#xff1a;2648 标注类别数&#xff1a;1 标注类别名称:["road"] 每个类别标注的框数&#x…

leetcode-73.矩阵置零-day5

class Solution {public void setZeroes(int[][] mat) {int m mat.length, n mat[0].length;// 1. 扫描「首行」和「首列」记录「首行」和「首列」是否该被置零boolean r0 false, c0 false;for (int i 0; i < m; i) {if (mat[i][0] 0) {r0 true;break;}}for (int j …

uni-app H5端使用注意事项 【跨端开发系列】

&#x1f517; uniapp 跨端开发系列文章&#xff1a;&#x1f380;&#x1f380;&#x1f380; uni-app 组成和跨端原理 【跨端开发系列】 uni-app 各端差异注意事项 【跨端开发系列】uni-app 离线本地存储方案 【跨端开发系列】uni-app UI库、框架、组件选型指南 【跨端开…

DCDC降压模块

一、项目介绍 在B站看到工科男孙老师发的DCDC模块视频&#xff0c;后面有提到这款芯片&#xff0c;于是就使用这款芯片自己设计了这款降压模块。 芯片的封装为TSOT23-8&#xff0c;对空间利用率高。 输入电压的范围为3-18V。 输出电压的范围为0-8V。 输出电流最…

康耐视智能相机(Insight)通过ModbusTCP发送字符串到倍福(BECKHOFF)PLC中

文章目录 1.背景2.分析3.实现3.1.PLC的ModbusTCP_Server3.1.1.安装TF6250-Modbus-TCP3.1.2.PLC设置 3.2.智能相机的ModbusTCP_Client3.2.1.了解ModbusTCP的协议3.2.2.根据协议写代码3.2.2.1.纯函数代码3.2.2.2.脚本代码 3.2.3.非脚本处理时的代码逻辑图3.2.4.关于代码的问题及解…