用友U8+ API接口使用教程

news2024/12/23 22:32:09

前言

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.coloradmin.cn/o/2257773.html

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

相关文章

xtu oj 1618 素数个数

文章目录 前言代码思路 前言 有点儿难&#xff0c;至少对我来说。去年考试我没写出来。 代码 #include<stdio.h> #include<stdbool.h> #include<stdlib.h>//加 math 那个头文件好像要加这个头文件&#xff0c;我之前编译错误过&#xff0c;血泪教训 #incl…

DAY3 构造函数

构造函数使用代码&#xff1a; #include <iostream> using namespace std; class Rec {const int length;int width; public:Rec():length(10){cout << "Rec无参构造函数" << endl;};Rec(int a,int b):length(a),width(b){cout << "Re…

分布式搜索引擎之elasticsearch基本使用2

分布式搜索引擎之elasticsearch基本使用2 在分布式搜索引擎之elasticsearch基本使用1中&#xff0c;我们已经导入了大量数据到elasticsearch中&#xff0c;实现了elasticsearch的数据存储功能。但elasticsearch最擅长的还是搜索和数据分析。 所以j接下来&#xff0c;我们研究下…

javaScript交互补充

1、元素的三大系列 1.1、offset系列 1.1.1、offset初相识 使用offset系列相关属性可以动态的得到该元素的位置&#xff08;偏移&#xff09;、大小等 ●获得元素距离带有定位祖先元素的位置 ●获得元素自身的大小&#xff08;宽度高度&#xff09; ●注意&#xff1a;返回的…

【49】AndroidStudio构建其他人开发的Android项目

(1)做Android软件开发&#xff0c;通常会看一些其他人开发的项目源码&#xff0c;当将这些项目的源码通过git clone到本地之后&#xff0c;用AndroidStudio进行打开时&#xff0c;通常会遇到一些环境配置的问题。本文即用来记录在构建他人开发项目源代码这一过程中遇到的一些常…

LLama系列模型简要概述

LLama-1&#xff08;7B, 13B, 33B, 65B参数量&#xff1b;1.4T tokens训练数据量&#xff09; 要做真正Open的AI Efficient&#xff1a;同等预算下&#xff0c;增大训练数据&#xff0c;比增大模型参数量&#xff0c;效果要更好 训练数据&#xff1a; 书、Wiki这种量少、质量高…

22. Three.js案例-创建旋转的圆环面

22. Three.js案例-创建旋转的圆环面 实现效果 知识点 WebGLRenderer (WebGL渲染器) THREE.WebGLRenderer 是Three.js中最常用的渲染器&#xff0c;用于将场景渲染到WebGL画布上。 构造器 new THREE.WebGLRenderer(parameters) 参数类型描述parametersObject可选参数对象&…

Burp(5)web网页端抓包与app渗透测试

声明&#xff01; 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&…

bsp是板级支持包

里面有很多的针对该型号的板子的函数&#xff0c;可以直接调用&#xff0c;也可以直接在里面。 也可以在vivado的sdk上&#xff0c;看到很多相关文档和寄存器偏移等等。

基于智能合约的医院凭证共享中心路径探析

一、引言 随着医疗行业的不断发展和信息技术的进步&#xff0c;基于智能合约的医疗凭证共享中心解决方案成为了可能。在当今数字化时代&#xff0c;医疗领域面临着诸多挑战&#xff0c;如医疗数据的分散存储、信息共享的不便捷以及凭证管理的复杂性等问题。而智能合约的出现&am…

实验14 RNN的记忆能力和梯度爆炸实验

一 循环神经网络的记忆能力 1.数据集构建 创建了一个DigitSumDataset 类&#xff0c;包括初始化函数init、数据生成函数 generate_data、数据加载函数 load_data、__len__ 方法、__getitem__ 方法。 init函数&#xff1a;接受的参数是data_path&#xff08; 存放数据集的目录…

一文说清flink从编码到部署上线

引言&#xff1a;目前flink的文章比较多&#xff0c;但一般都关注某一特定方面&#xff0c;很少有一个文章&#xff0c;从一个简单的例子入手&#xff0c;说清楚从编码、构建、部署全流程是怎么样的。所以编写本文&#xff0c;自己做个记录备查同时跟大家分享一下。本文以简单的…

IEEE T-RO 软体机器人手指状态估计实现两栖触觉传感

摘要&#xff1a;南方科技大学戴建生院士、林间院士、万芳老师、宋超阳老师团队近期在IEEE T-RO上发表了关于软体机器人手指在两栖环境中本体感知方法的论文。 近日&#xff0c;南方科技大学戴建生院士、林间院士、万芳老师、宋超阳老师团队在机器人顶刊IEEE T-RO上以《Propri…

java类静态初始化死锁问题

问题 前端时间帮同事分析了一个IO线程阻塞问题&#xff0c;该问题导致服务端无法处理任何请求&#xff0c;只能进行重启解决&#xff1b;事发时运维dump了下栈信息&#xff0c;堆栈信息如下图&#xff1a; 从上面可以看到io线程都阻塞于Object.wait()&#xff0c;具体是执行Cl…

厦门凯酷全科技有限公司怎么样?

随着短视频和直播带货的兴起&#xff0c;抖音电商平台迅速崛起&#xff0c;成为众多品牌和商家争夺的新战场。在这个竞争激烈的市场中&#xff0c;如何抓住机遇、实现销售增长&#xff0c;成为了每个企业面临的挑战。厦门凯酷全科技有限公司&#xff08;以下简称“凯酷全”&…

微信小程序uni-app+vue3实现局部上下拉刷新和scroll-view动态高度计算

微信小程序uni-appvue3实现局部上下拉刷新和scroll-view动态高度计算 前言 在uni-appvue3项目开发中,经常需要实现列表的局部上下拉刷新功能。由于网上相关教程较少且比较零散,本文将详细介绍如何使用scroll-view组件实现这一功能,包括动态高度计算、下拉刷新、上拉加载等完整…

在Windows和Ubuntu上安装SDKMAN

文章目录 1. SDKMAN概述2. 安装与使用SDKMAN2.1 在Windows上安装SDKMAN2.1.1 安装Git for Windows2.1.2 安装SDKMAN 2.2 利用SDKMAN管理Java2.2.1 查看所有可用的OpenJDK发行版2.2.2 安装Java2.2.3 查看Java版本2.2.4 shell指定使用某个Java版本 2.3 在Ubuntu上安装SDKMAN2.3.1…

1210 作业

思维导图 作业 使用read和write函数拷贝文件&#xff0c;一半拷进一个文件&#xff0c;另一半拷进另一个文件 #include <myhead.h> int main(int argc, const char *argv[]) {int fd1 open("./z1.txt",O_RDONLY);if(fd1-1){perror("open");return…

牛客网热门Java面试题及答案整理(2024最新版)

当今互联网行业中&#xff0c;Java 作为一种广泛应用的编程语言&#xff0c;对于求职者来说仍是一项受欢迎的技能。然而&#xff0c;随着市场上的开发人员数量越来越多&#xff0c;Java 面试的竞争也愈加激烈。 目前 Java 面试有着以下现状&#xff1a; 面试难度加大与过去相…

【SSH+X11】VsCode使用Remote-SSH在远程服务器的docker中打开Rviz

&#x1f680;今天来分享一下通过VsCode的Remote-SSH插件在远程服务器的docker中打开Rviz进行可视化的方法。 具体流程如下图所示&#xff0c;在操作开始前&#xff0c;请先重启设备&#xff0c;排除之前运行配置的影响&#xff1a; ⭐️ 我这里是使用主机连接服务器&#xff…