You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

121 lines
3.5 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
namespace POSV.OtherMember.Utils
{
class MemberApiUtils
{
static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();
private static object _lock = new object();
public static string URL = "https://openapi.qimai.shop/api/v2";
public static string OPEN_KEY = "HrXrZCwlQ3rKVvfiNoVMPNsUHiqTnZUeY7EGpMQQyqK3m7zEwt";
private static MemberApiUtils _instance = null;
public static MemberApiUtils Instance
{
get
{
if (_instance == null)
{
lock (_lock)
{
_instance = new MemberApiUtils();
}
}
return _instance;
}
}
public string Sign(SortedList<string, string> parameters)
{
return Sign(parameters, null);
}
public string Sign(SortedList<string, string> parameters, List<string> ignoreParameters)
{
IList<string> keys = parameters.Keys;
var paramNames = new List<string>(keys.Count);
paramNames.AddRange(keys);
if (ignoreParameters != null && ignoreParameters.Count > 0)
{
foreach (string ignore in ignoreParameters)
{
paramNames.Remove(ignore);
}
}
StringBuilder sb = new StringBuilder();
foreach (string key in paramNames)
{
sb.Append(key +"="+ parameters[key]+"&");
}
string input = sb.ToString();
Console.WriteLine("签名字符串:" + input.Substring(0, input.Length - 1));
var encoding = Encoding.UTF8;
HMACSHA1 hmac = new HMACSHA1(encoding.GetBytes(OPEN_KEY));
hmac.Initialize();
byte[] buffer = encoding.GetBytes(input.Substring(0,input.Length - 1));
byte[] hash = hmac.ComputeHash(buffer);
Console.WriteLine("Open Key:" + OPEN_KEY);
Console.WriteLine("签名后的Token:" + Convert.ToBase64String(hash));
return Convert.ToBase64String(hash);
}
/// <summary>
/// 获取当前时间戳兼容Java服务端
/// </summary>
/// <returns></returns>
public string GetTimestamp()
{
TimeSpan ts = new TimeSpan(DateTime.UtcNow.Ticks - new DateTime(1970, 1, 1, 0, 0, 0).Ticks);
return Convert.ToString((long)ts.TotalMilliseconds);
}
public string GetNonce()
{
Random random = new Random();
return Convert.ToString(random.Next(10000, 99999));
}
public SortedList<string, string> NewParameters()
{
SortedList<string, string> parameters = new SortedList<string, string>();
#if DEBUG
parameters.Add("OpenId", "9275b5818f8659c30442fcb7b21da30a");
parameters.Add("GrantCode", "bcf53b6bec");
parameters.Add("Timestamp", GetTimestamp());
parameters.Add("Nonce", GetNonce());
#else
parameters.Add("OpenId", "9275b5818f8659c30442fcb7b21da30a");
parameters.Add("GrantCode", "bcf53b6bec");
parameters.Add("Timestamp", GetTimestamp());
parameters.Add("Nonce", GetNonce());
#endif
return parameters;
}
}
}