视频点播如何通过C#实现OpenAPI构造签名

概述

本文主要介绍如何通过C#实现OpenAPI构造签名。

详细信息

通过C#实现OpenAPI构造签名的示例如下所示。

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);
        }
    }
}

适用于

  • 视频点播
  • 视频直播
  • CDN
  • DCDN
  • SCDN