阿里云openapi签名实现代码(基于C#)

简介: 部分开发者在接触阿里云openAPi调用的时候,Signature的构造和生成一直都是一只拦路虎,本文中将基于C#,和点播的APi:getPlayAuth 实现签名的构造,仅供大家参考。

image.png

代码正文如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Web;

namespace openapiSignature
{
    class MainClass
    {
        private String Format = "JSON";
        private String Version = "2017-03-21";
        private String AccessKeyId = "yourAccessKeyID";
        private String SignatureMethod = "HMAC-SHA1";
        private String SignatureVersion = "1.0";
        private Dictionary<string, string> publicParams;

        public void setPublicParams(Dictionary<string,string>dic)
        {
            publicParams = dic;
        }
        public Dictionary<string, string> getPublicParams()
        {
            return publicParams;
        }
        public String getFormat()
        {
            return Format;
        }
        public String getVersion()
        {
            return Version;
        }
        public String getAccessKeyId()
        {
            return AccessKeyId;
        }
        public String getSignatureMethod()
        {
            return SignatureMethod;
        }
        public String getSignatureVersion()
        {
            return SignatureVersion;
        }
        public String getTimestamp()
        {
            String now = DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ssZ");
            return now;
        }
        public String getSignatureNonce()
        {
            return System.Guid.NewGuid().ToString();
        }
        public String getAccessKeySecret()
        {
            return "yourAccessKeySecret";
        }
        /**
         * URL编码
         */
        public static string UrlEncode(string temp)
        {
            Encoding encoding = System.Text.Encoding.UTF8;
            StringBuilder stringBuilder = new StringBuilder();
            for (int i = 0; i < temp.Length; i++)
            {
                string t = temp[i].ToString();
                string k = HttpUtility.UrlEncode(t, encoding);
                if (t == k)
                {
                    stringBuilder.Append(t);
                }
                else
                {
                    stringBuilder.Append(k.ToUpper());
                }
            }
            return stringBuilder.ToString();
        }
        /**
         * 对urlencode之后的字符串进行特殊字符检测和替换
         */
        public static string checkParam(string str)
        {
            
            if(str.Contains("+"))
            {
                str.Replace("+","%20");
            }else if(str.Contains("*"))
            {
                str.Replace("*", "%2A");
            }
            else if (str.Contains("%7E"))
            {
                str.Replace("%7E","~");
            }
            return str;
        }
        /**
         * 计算Hmacsha1
         */
        public static string HmacSha1Sign(string text, string key)
        {
            HMACSHA1 hmacsha1 = new HMACSHA1();
            byte[] byteData = Encoding.UTF8.GetBytes(text);
            hmacsha1.Key = Encoding.UTF8.GetBytes(key);
            byte[] dataBuffer = System.Text.Encoding.UTF8.GetBytes(text);
            byte[] hashBytes = hmacsha1.ComputeHash(dataBuffer);
            return Convert.ToBase64String(hashBytes);
        }

        /**
         * base64 编码
         */
        public static string EncodeBase64(string code_type, string code)
        {
            string encode = "";
            byte[] bytes = Encoding.GetEncoding(code_type).GetBytes(code);
            try
            {
                encode = Convert.ToBase64String(bytes);
            }
            catch
            {
                encode = code;
            }
            return encode;
        }


        public static void Main(string[] args)
        {
            MainClass ss = new MainClass();
            //添加公共参数
            Dictionary<String, String> publicParam = new Dictionary<string, string>();
            publicParam.Add("Format", ss.getFormat());
            publicParam.Add("Version", ss.getVersion());
            publicParam.Add("SignatureMethod", ss.getSignatureMethod());
            publicParam.Add("SignatureNonce", ss.getSignatureNonce());
            publicParam.Add("Timestamp", ss.getTimestamp());
            publicParam.Add("AccessKeyId", ss.getAccessKeyId());
            publicParam.Add("SignatureVersion", ss.getSignatureVersion());

            //添加API接口以及接口参数
            publicParam.Add("Action", "GetVideoPlayAuth");
            publicParam.Add("VideoId", "f6a21eade82f4cf6b45669fa34b35b76");


            //将参数名和参数值用“=”链接起来之后,按照整体字符串的字典序排序;
            Dictionary<String, String> sortedParams = publicParam.OrderBy(o => o.Key + "=" + o.Value).ToDictionary(o => o.Key, p => p.Value);
            //对连接之后的字符串进行urlencode
            Dictionary<String, String> urlEncoderParam = sortedParams.ToDictionary(k => MainClass.UrlEncode(k.Key), v => MainClass.UrlEncode(v.Value));
            //对urlencode之后的字符串进行特殊字符判断并转换
            Dictionary<String, String> parseEncoderParam = urlEncoderParam.ToDictionary(k => MainClass.checkParam(k.Key), v => MainClass.checkParam(v.Value));


            //对字符串进行拼接,获取strToSign
            string strToSign = "";
            foreach (KeyValuePair<String, String> k in parseEncoderParam)
            {
                strToSign += k.Key + "=" + k.Value + "&";
            }
            
            strToSign = "GET&%2F&" + MainClass.UrlEncode(strToSign.Substring(0, strToSign.Length - 1));
            string signature = HmacSha1Sign(strToSign, ss.getAccessKeySecret() + "&");

            if (signature.Contains("+"))
            {
                signature.Replace("+", "%2B");
            }
            publicParam.Add("Signature", signature);
            string url = "http://vod.cn-shanghai.aliyuncs.com?";
            foreach (KeyValuePair<string, string> pair in publicParam)
            {
                url += pair.Key + "=" + pair.Value + "&";
            }
            url = url.Substring(0, url.Length - 1);

            Console.WriteLine(url);
        }
    }
}
相关文章
|
5月前
|
人工智能 IDE API
10行代码,实现你的专属阿里云OpenAPI MCP Server
本文介绍如何用10行Python代码创建专属阿里云OpenAPI MCP Server。针对传统MCP Server工具固化、开发复杂等问题,提出借助alibaba-cloud-ops-mcp-server实现灵活拓展的方案。通过配置服务与API名称,运行简短代码即可生成支持SSE连接的MCP Server。用户无需深入了解阿里云OpenAPI细节,大幅降低开发门槛。未来将探索通用工具设计,实现固定工具调用任意API,进一步提升灵活性与效率。
|
11月前
|
弹性计算 网络安全
阿里云国际OpenAPI多接口快速管理ECS服务器教程
阿里云国际OpenAPI多接口快速管理ECS服务器教程
|
11月前
|
IDE API 开发工具
沉浸式集成阿里云 OpenAPI|Alibaba Cloud API Toolkit for VS Code
Alibaba Cloud API Toolkit for VSCode 是集成了 OpenAPI 开发者门户多项功能的 VSCode 插件,开发者可以通过这个插件方便地查找API文档、进行API调试、插入SDK代码,并配置基础环境设置。我们的目标是缩短开发者在门户和IDE之间的频繁切换,实现API信息和开发流程的无缝结合,让开发者的工作变得更加高效和紧密。
沉浸式集成阿里云 OpenAPI|Alibaba Cloud API Toolkit for VS Code
|
IDE API 开发工具
通过IDE插件体验阿里云OpenAPI的高效集成, 精品礼品等你来拿!
轻量级的开放API工具——Alibaba Cloud Developer Toolkit及Alibaba Cloud API Toolkit。这些插件支持快速查阅阿里云产品的开放API,提供API调试与SDK示例生成等功能,帮助开发者轻松集成阿里云服务。您可通过JetBrains Marketplace或VS Code Marketplace搜索安装,完成身份验证后即刻体验。欢迎分享您的使用反馈,有机会获得精美礼品!
|
敏捷开发 测试技术 持续交付
阿里云云效产品使用合集之OpenAPI列表可以在什么地方查看
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
《阿里云产品手册2022-2023 版》——OpenAPI Explorer
《阿里云产品手册2022-2023 版》——OpenAPI Explorer
164 0
|
域名解析 JSON 网络协议
利用阿里云 OpenAPI 以及 DNS 云解析自建 DDNS 动态域名解析服务
家里闲置着一台老款的Mac mini Server,跑OS X越来越慢,索性装上了Cent OS 7,变成了一台家庭服务器,装上了Plex媒体服务器和Transmission下载服务,同时,也装上了Nginx、Mysql、MongoDB、Redis等,可以调试代码,甚至担当一些小型项目的服务器。 不过,只在家庭内网使用,功能太有限,于是接下来面临的一个问题就是内网穿透。使用过花生壳和花生棒,服务相当不稳定,而且种种受限,每要多加一个端口就要多花钱,安全性也有问题。
5921 0
利用阿里云 OpenAPI 以及 DNS 云解析自建 DDNS 动态域名解析服务
|
JSON 数据格式 Python
阿里云openapi签名实现代码(基于Python)
部分开发者在接触阿里云openAPi调用的时候,Signature的构造和生成一直都是一只拦路虎,本文中将基于Python,和点播的APi:getPlayAuth 实现签名的构造,仅供大家参考。
1921 0
阿里云openapi签名实现代码(基于Python)
|
Java Linux Apache
阿里云Java SDK通过代理访问阿里云OpenAPI
经常有人会问,我们的服务器在内网,不想让服务器拥有外网IP前提下访问阿里云的OpenAPI可以吗?今天我们对此进行一个解答。在文章中,我们使用最新的阿里云Java SDK:`com.aliyun:aliyun-java-sdk-core:4.5.20`。 文章的示例代码中,代理假设为192.168.1.1:8888,具体代理,包括下面示例里用到的用户名、密码请在开发、测试时改为对应的正确配置。
1735 1
|
自然语言处理 JavaScript 数据可视化
阿里云 OpenAPI 开发者门户全新上线
提供 OpenAPI 的快捷搜索、文档学习、在线调试、场景化示例试用、调用出错诊断以及调用统计等全生命周期功能
阿里云 OpenAPI 开发者门户全新上线