U8+和其他的公开的开放API接口有一些差异,他是需要先对接的到代理服务器,通过代理服务器进行对接,所以只要保证U8+能上网就能对接,和畅捷通T+的模式有点类似
流程:
一、开发者和企业账号
首先,开发应用需要注册一个用友开放平台的开发者账号,通过认证后,可以在管理页面创建自己的应用,填写应用的基本信息,并选择需要的接口权限后,应用就创建完成了。
然后,用户需要到授权页面向指定的企业账号发起调用申请,在这个页面里也可以看到授权状态、U8开放平台客户端的运行状态。
而作为数据源的所有者,企业也需要注册一个开放平台的账号(企业账号应该也可以直接认证成开发者),这个账号主要有三个任务:审批来自开发者的应用授权申请;为开发者的应用配置数据源(网站和服务器);通过U8服务器上的开放平台软件发布数据接口。
下图是企业账号审批、查看应用授权的界面:
二、服务器数据源配置
服务器上一共用到三个软件:
三、接入
在开始前,第一步要做的就是用创建应用时的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();
}
2023-02-20 04:21:50 | |
2024-09-25 12:42:07 | |
2023-01-21 09:36:37 | |
2022-01-12 05:43:50 | |
2022-01-31 21:00:06 | |
2024-09-10 23:57:10 | |
2024-09-16 18:04:40 | |
2021-12-11 21:54:38 | |
2024-08-11 22:13:08 | |
2021-10-09 04:53:02 | |
2023-08-19 11:24:32 | |
2024-12-21 03:54:50 | |
2024-12-13 00:36:28 | |
2024-12-24 10:25:07 | |
2024-11-06 10:57:07 | |
2024-10-23 07:17:50 | |
2024-11-21 12:38:44 | |
2024-12-19 11:28:59 | |
2025-01-05 11:27:24 | |
2025-02-11 11:26:45 | |
2023-01-26 10:05:34 | |
2023-01-26 10:05:33 | |
2023-01-26 10:05:33 | |
2023-01-26 10:05:32 | |
2023-01-26 10:05:31 |
黄宏棵 13286997615
数据集成顾问 资深系统集成顾问,专长于ERP、电商OMS、钉钉及CRM系统。他能提供高效的集成方案,优化企业运营流程,提升业务效率和决策智能化。
何海波 18175716035
数据集成顾问 轻易云的技术专家,拥有丰富的数据集成规划经验。他能够为客户提供专业、全面的数据集成规划方案,熟练掌握多种集成技术和工具,帮助企业在数据集成领域得到长远发展。
胡秀丛 15813570600
数据集成顾问 项目总监 她以卓越的数据集成专长,精通ERP、MES系统,以及数据中台的构建与优化。通过创新的一站式解决方案,她助力企业实现数据的无缝对接,提升业务流程效率,确保信息流通无障碍,为企业的数字化转型提供强有力的支持。
卢剑航 13760755942
数据集成专家 拥有十多年丰富的经验,擅长ERP、MES、数据中台、营销云中台等集成。他能够根据客户需求,为其提供一站式集成解决方案,帮助企业快速实现各类系统数据集成服务。