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("参数错误"); } } } }