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

namespace Test
{
    public class Program
    {
        static void Main(string[] args)
        {
            string secret = "{{secret}}"; //用户秘钥
            string uid = "{{uid}}"; //用户OpenUid
            string method = "{{method}}"; //API方法名
            string timestamp = ((long)(DateTime.Now.ToUniversalTime() - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalSeconds).ToString(); //时间戳
            //业务参数 {{p8}}
            Dictionary<string, string> dict = new Dictionary<string, string>();
            dict.Add("uid", uid);
            dict.Add("method", method);
            dict.Add("timestamp", timestamp);
            //业务参数 {{p9}}
            StringBuilder sb = new StringBuilder(secret); //拼接签名原串
            StringBuilder sb2 = new StringBuilder(); //拼接POST内容
            foreach (string key in dict.Keys.OrderBy(key => key))
            {
                sb.Append(key + dict[key]);
                sb2.Append(key + "=" + HttpUtility.UrlEncode(dict[key], Encoding.UTF8) + "&");
            }
            sb.Append(secret);
            string sign = CalculateMd5(sb.ToString()); //签名计算
            sb2.Append("sign=" + sign); //添加签名参数
            string result = CallApi(sb2.ToString()); //请求API
            Console.WriteLine(result);
        }

        private static string CalculateMd5(string content)
        {
            var md5 = new MD5CryptoServiceProvider();
            byte[] bytes = Encoding.UTF8.GetBytes(content);
            byte[] bytes2 = md5.ComputeHash(bytes);
            return BitConverter.ToString(bytes2).Replace("-", "").ToLower();
        }

        private static string CallApi(string formData)
        {
            try
            {
                WebClient webClient = new WebClient();
                webClient.Headers.Add("Content-Type", "application/x-www-form-urlencoded");
                webClient.Headers.Add("Accept", "application/json");
                webClient.Encoding = Encoding.UTF8;
                string result = webClient.UploadString("{{url}}", "POST", formData);
                return result;
            }
            catch (Exception e)
            {
            }
            return null;
        }
    }
}
