Unity阿里云OpenAPI 获取 Token的C#【记录】

获取Token


using UnityEngine;
using System;
using System.Text;
using System.Linq;
using Newtonsoft.Json.Linq;  
using System.Security.Cryptography;
using UnityEngine.Networking;
using System.Collections.Generic;
using System.Globalization;
using Cysharp.Threading.Tasks;

#if UNITY_EDITOR
using UnityEditor;
#endif

/// <summary>
/// 获取阿里云的 Token 的代码
/// </summary>
public class AliTTSCtrl : MonoBehaviour
{
   
   
    private readonly string accessKeyId = "********"; 
    private readonly string accessKeySecret = "********"; 

    private readonly string accessKey = "********";
    private readonly string account = "********";

    private readonly string regionId = "cn-shanghai";
    private readonly string version = "2019-02-28";
    private readonly string action = "CreateToken";
    private readonly string formatType = "JSON";
    private readonly string signatureMethod = "HMAC-SHA1";
    private readonly string signatureVersion = "1.0";

    private DateTime expirationTime = DateTime.MinValue;

    void Start()
    {
   
   
       
    }

 
    // 获取当前有效的 Token
    [ContextMenu("获取 Token")]
#if UNITY_EDITOR
    [ExecuteInEditMode]
#endif
    public async UniTask<string> GetToken()
    {
   
   
        try {
   
   

            var res = CheckTokenExpireTime();
            if (res.Item1)
            {
   
   
                return res.Item2;
            }
            else
            {
   
   
                //StartCoroutine(RefreshToken());
                var token = await PostTokenRequest();
                // 如果正在刷新 Token,可以考虑返回空字符串或者等待刷新完成
                return token;
            }
        }catch(Exception e)
        {
   
   
            Debug.LogError($"错误: {
     
     e}");
        }
       
        
        throw new NullReferenceException("Token 无法获取");
    }

    /// <summary>
    /// 检查Token是否过期或者不存在
    /// </summary>
    /// <returns></returns>
    private (bool, string) CheckTokenExpireTime()
    {
   
   
        string tokenString = PlayerPrefs.GetString(accessKeyId, "");
        if (!string.IsNullOrEmpty(tokenString))
        {
   
   
            JObject token = JObject.Parse(tokenString);
            long expireTime = token["ExpireTime"].Value<long>();
            long currentTime = DateTimeOffset.UtcNow.ToUnixTimeSeconds();
            long timeLeft = expireTime - currentTime;

            string tokenID = token["Id"].Value<string>();

            if (timeLeft < 86400) // 24小时 = 86400秒
            {
   
   
                Debug.Log("Token 将在24小时内过期  True");
                return (false, null);
            }
            else
            {
   
   
                Debug.Log("Token 还可以使用 False");
                return (true, tokenID);
            }
        }
        return (false, null);
    }

    async UniTask<string> PostTokenRequest()
    {
   
   
        // 获取当前时间戳
        string timestamp =   DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ssZ", CultureInfo.InvariantCulture);

        // 生成随机数
        string signatureNonce =  Guid.NewGuid().ToString();

        // 构建请求参数字典 
        var parameters = new Dictionary<string, string>
        {
   
   
            {
   
    "AccessKeyId", accessKeyId },
            {
   
    "Action", action },
            {
   
    "Format", formatType },
            {
   
    "RegionId", regionId },
            {
   
    "SignatureMethod", signatureMethod },
            {
   
    "SignatureNonce", signatureNonce },
            {
   
    "SignatureVersion", signatureVersion },
            {
   
    "Timestamp", timestamp},
            {
   
    "Version", version }
        };

        // 排序并构建规范化的查询字符串
        string queryString = EncodeDictionary(parameters);
        //Debug.Log("规范化的请求字符串: " + queryString);

        string stringToSign = "GET&" + EncodeText("/") + "&" + EncodeText(queryString);
        //Debug.Log("待签名的字符串: " + stringToSign);


        string signature = CalculateSignature(accessKeySecret, stringToSign);
        //Debug.Log("签名: " + signature);

        signature = EncodeText(signature);
        //Debug.Log("URL编码后的签名: " + signature);

        // 构建最终 URL
        string url = $"https://nls-meta.cn-shanghai.aliyuncs.com/?Signature={
     
     signature}&{
     
     queryString}";
        //Debug.Log("url: " + url);

      
        using (UnityWebRequest www = UnityWebRequest.Get(url))
        {
   
    
            var asyncOp = www.SendWebRequest();

            await asyncOp;
           
            var header = www.GetResponseHeaders();
            string headerStr = "";

            headerStr += www.uri.Host+"\n";
            //headerStr += www.uri. + "\n";

            foreach (var head in header)
            {
   
   
                headerStr += $"{
     
     head.Key} : {
     
     head.Value} \n";
            }

            Debug.Log($"请求 Response: {
     
     headerStr}");
            //await www.SendWebRequest();

            if (www.result != UnityWebRequest.Result.Success)
            {
   
   
                string textData = www.downloadHandler.text;
                Debug.LogError($"请求错误 Error:{
     
     www.result} +  {
     
     www.error} -> {
     
     textData}");
            }
            else
            {
   
   
                // 解析返回的 JSON 数据
                string jsonResponse = www.downloadHandler.text;
                Debug.Log($"请求成功 Response: {
     
     jsonResponse}");

                JObject json = JObject
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值