net8获取泛微token以及访问api示例

工作中涉及到调用泛微的场景,官方的示例又臭又长,抽空用NET8简化了写法,为了简化http访问,用了Flurl.Http这个库。在座各位大佬,我们直接就看代码了

复制代码
using System.Security.Cryptography;
using System.Text.Json;
using Flurl.Http;

//请按照官方内容做好初始化工作 https://e-cloudstore.com/doc.html?appId=af09c25938714c26b9736f535ca20fc9
//后端接口清单 https://e-cloudstore.com/ec/api/applist/index.html#/

// 可以改写为扩展函数方便使用
var RSAEncrypt = (string spk, string payload) =>
{
    using var rsa = RSA.Create();
    rsa.ImportSubjectPublicKeyInfo(Convert.FromBase64String(spk), out _);
    var PlainTextBArray  = System.Text.Encoding.UTF8.GetBytes(payload);
    var CypherTextBArray = rsa.Encrypt(PlainTextBArray, RSAEncryptionPadding.Pkcs1);
    var Result = Convert.ToBase64String(CypherTextBArray);
    return Result;
};

var appid = "42520974-83D6-41F6-8773-0780A6EAB3D6";

// 1、注册仅需要进行一次
using var LocalRSA = RSA.Create();
var publicPem = LocalRSA.ExportRSAPublicKeyPem();
var privatePem = LocalRSA.ExportRSAPrivateKeyPem();
var registerDto = await "http://127.0.0.1/api/ec/dev/auth/regist"
    .WithHeader("appid", appid)
    .WithHeader("cpk", publicPem)
    .PostAsync()
    .ReceiveJson<JsonDocument>();
System.Console.WriteLine(registerDto.RootElement.GetRawText());
System.Console.WriteLine();

// 2、获取secrit,spk,执行第1步后保存在ECOLOGY_BIZ_EC表中,分别对应字段SECRIT,server_public_key
var secrit = registerDto.RootElement.GetProperty("secrit").GetString();
var spk = registerDto.RootElement.GetProperty("spk").GetString();
System.Console.WriteLine(secrit);
System.Console.WriteLine(spk);
System.Console.WriteLine();

// 3、获取access_token
var encryptSecret = RSAEncrypt(spk, secrit);
var applytokenDto = await "http://127.0.0.1/api/ec/dev/auth/applytoken"
    .WithHeader("appid", appid)
    .WithHeader("secret", encryptSecret)
    .PostAsync()
    .ReceiveJson<JsonDocument>();

var token = applytokenDto.RootElement.GetProperty("token").GetString();
System.Console.WriteLine(token);
System.Console.WriteLine();


// 4、获取流程
var userId = "1";
var encryptUserId = RSAEncrypt(spk, userId);
var getAllWorkflowRequestListDto = await "http://127.0.0.1/api/workflow/paService/getAllWorkflowRequestList"
    .WithHeader("appid", appid)
    .WithHeader("token", token)
    .WithHeader("userId", encryptUserId)
    .PostAsync()
    .ReceiveJson<JsonDocument>();
System.Console.WriteLine(getAllWorkflowRequestListDto.RootElement.GetRawText());
System.Console.WriteLine();