using System;
using System.Buffers.Text;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using YuanXuan.IM.Common.Exceptions;
using YuanXuan.IM.Common.Helpers;
using YuanXuan.IM.Infrastructure.Redis;
namespace YuanXuan.IM.Api.Helper
{
///
/// 手机跳H5用户签名帮助类
///
public static class MobileToH5UserSign
{
///
/// 获取用户跳转H5的签名,并缓存sign 1小时
///
///
///
///
public static string GetUserSign(string UserId, long? DataId)
{
//生成sign,规则为:Id + "&" + userId
var sign = $"{UserId}";
if (DataId != null)
{
sign = $"{DataId}&" + sign;
}
//aes加密sign
sign = AesEncryptHelper.EncryptToShortString(sign);
//sign进行base64
// 将字符串转换为字节数组
byte[] byteArray = Encoding.UTF8.GetBytes(sign);
// 将字节数组转换为Base64字符串
string base64String = Convert.ToBase64String(byteArray);
//存储到redis中,有效期1小时
RedisHelper.Instance.Set(base64String, $"{DataId}&{UserId}", TimeSpan.FromHours(1));
return base64String;
}
///
/// 解密用户跳转H5的签名,获取Id(有可能为null)和userId
///
///
/// 正确参数个数
///
///
public static (long? DataId, long UserId) DecryptUserSign(string sign, int parCount)
{
//判断redis中是否存在sign
var redisSign = RedisHelper.Instance.Get(sign);
if (string.IsNullOrEmpty(redisSign))
{
throw new BusinessException("链接已过期,请重新获取");
}
//sign的base64解码
byte[] decodedBytes = Convert.FromBase64String(sign);
// 转换为UTF8字符串
string decodedString = Encoding.UTF8.GetString(decodedBytes);
//解密sign
sign = AesEncryptHelper.DecryptFromShortString(decodedString);
var arr = sign.Split('&');
if (parCount!=arr.Length)
{
throw new BusinessException("参数错误");
}
if (arr.Length == 1)
{
var userId = Convert.ToInt64(arr[0]);
return (null, userId);
}
else if (true)
{
var id = Convert.ToInt64(arr[0]);
var userId = Convert.ToInt64(arr[1]);
return (id, userId);
}
else
{
throw new BusinessException("参数错误");
}
}
}
}