微信电子健康卡获取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;
}