微信电子健康卡获取Sgin签名及时间戳的方法

Common.js

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

namespace HealthCardSDKWeb
{
    public static class CommonJs
    {
        /// <summary> 
        /// 获取时间戳 
        /// </summary> 
        /// <returns></returns> 
        public static string GetTimeStamp()
        {
            TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);
            return Convert.ToInt64(ts.TotalSeconds).ToString();
        }

        #region 获取签名
        
        public static string getSign(IDictionary<String, Object> commonIn, IDictionary<String, Object> req, string secret)
        {
            SortedDictionary<String, Object> sortParamDic = new SortedDictionary<String, Object>(commonIn);
            foreach (KeyValuePair<string, Object> kv in req)
            {
                sortParamDic.Add(kv.Key, kv.Value);
            }

            string paramStr = getParamStr(sortParamDic);

            Console.WriteLine("param str:" + paramStr);

            byte[] bytes = Encoding.UTF8.GetBytes(paramStr + secret);
            byte[] hash = SHA256Managed.Create().ComputeHash(bytes);

            string sign = Convert.ToBase64String(hash);
            return sign;
        }

        private static string getParamStr(SortedDictionary<String, Object> sortParamDic)
        {
            StringBuilder stringBuilder = new StringBuilder();
            foreach (KeyValuePair<string, Object> kv in sortParamDic)
            {
                if (kv.Value == null)
                {
                    continue;
                }
                string val;
                if (isBaseType(kv.Value))
                {
                    val = kv.Value.ToString();
                }
                else
                {
                    val = JsonConvert.SerializeObject(kv.Value);
                    Console.WriteLine(val);
                }

                if (val.Trim().Equals(""))
                {
                    continue;
                }

                if (stringBuilder.Length > 0)
                {
                    stringBuilder.Append("&");
                }
                stringBuilder.Append(kv.Key);
                stringBuilder.Append("=");
                stringBuilder.Append(val);
            }

            return stringBuilder.ToString();
        }

        private static bool isBaseType(Object obj)
        {
            Type type = obj.GetType();
            return type.IsPrimitive || type.Equals(typeof(string));
        }

        #endregion
    }
}

调用代码:

  #region 签名规则
        public string getSign()
        {
            //获取签名规则
            string appId = "a1a2e0bde41574ad8ea9a4bb58022oop";
            string secret = "8c8e763f443ef983ac33aef1c7085cfb";
            string appToken = "c37439bbf711b023af8fed1ab1f06f43";

            //示例:注册健康卡接口的完整请求参数如下
            IDictionary<string, Object> commonIn = new Dictionary<string, Object>();
            commonIn.Add("hospitalId", "20007");
            commonIn.Add("appToken", appToken);
            commonIn.Add("requestId", "2a9a8ff876e7f3e1df1a2490a29b22a1");
            commonIn.Add("timestamp", "1536810104");

            IDictionary<string, Object> req = new Dictionary<string, Object>();

            /*  复杂参数
            SortedDictionary<string,Object> cardInfo = new SortedDictionary<string,Object>();
            cardInfo.Add("name","张三");
            cardInfo.Add("idCard","430203188808084321");
            cardInfo.Add("gender","男");
            cardInfo.Add("nation","汉族");
            cardInfo.Add("birthday", "1999-03-23");
            cardInfo.Add("address", "腾讯大厦"); 
            req.Add("cardInfo", cardInfo);*/

            req.Add("appId", appId);

            string sign = CommonJs.getSign(commonIn, req, secret);
            //sign 为sign签名 以下是其他参数数据
            commonIn.Add("sign", sign);

            Console.WriteLine("sign:" + sign);

            IDictionary<string, Object> paramDic = new Dictionary<string, Object>();
            paramDic.Add("commonIn", commonIn);
            paramDic.Add("req", req);

            string jsonParam = JsonConvert.SerializeObject(paramDic);

            return jsonParam;

        }


        
        #endregion

实现java 的System.currentTimeMillis() 值

 object currenttimemillis = (long)(DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalMilliseconds;

如何获取13位的时间戳:

        /// <summary>
        /// 获得13位的时间戳
        /// </summary>
        /// <returns></returns>
        public static string GetTimeStamp()
        {
            System.DateTime time = System.DateTime.Now;
            long ts = ConvertDateTimeToInt(time);
            return ts.ToString();
        }
        /// <summary>  
        /// 将c# DateTime时间格式转换为Unix时间戳格式  
        /// </summary>  
        /// <param name="time">时间</param>  
        /// <returns>long</returns>  
        private static long ConvertDateTimeToInt(System.DateTime time)
        {
            System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1, 0, 0, 0, 0));
            long t = (time.Ticks - startTime.Ticks) / 10000;   //除10000调整为13位      
            return t;
        }
发布了72 篇原创文章 · 获赞 2 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/sumjob/article/details/103546613