Xamarin.forms CryptoJS到C#SHA256加密

Xamarin.forms CryptoJS到C#SHA256加密,xamarin.forms,tuya,Xamarin.forms,Tuya,我一直在寻找一个好的解决方案,从postman那里复制API中使用的代码,并尝试在Xamarin表单中使用它。问题是API中有一个生成“签名”的方法,它们在JS中就是这样做的。我尝试过各种解决方案,但它不会产生相同的信息 在JS中= (function () { var timestamp = getTime(); pm.environment.set("timestamp",timestamp); var clientId = pm.environment.get(&qu

我一直在寻找一个好的解决方案,从postman那里复制API中使用的代码,并尝试在Xamarin表单中使用它。问题是API中有一个生成“签名”的方法,它们在JS中就是这样做的。我尝试过各种解决方案,但它不会产生相同的信息

在JS中=

(function () { 
var timestamp = getTime();
pm.environment.set("timestamp",timestamp);
var clientId = pm.environment.get("client_id");
var secret = pm.environment.get("secret");
var sign = calcSign(clientId,secret,timestamp);
pm.environment.set('easy_sign', sign);
})();

function getTime(){
    var timestamp = new Date().getTime();
    return timestamp;
}

function calcSign(clientId,secret,timestamp){
    var str = clientId + timestamp;
    var hash = CryptoJS.HmacSHA256(str, secret);
    var hashInBase64 = hash.toString();
    var signUp = hashInBase64.toUpperCase();
    return signUp;
}
在C#=

public void timeStamp()
{
/*
*var str=clientId+时间戳;
var hash=CryptoJS.HmacSHA256(str,secret);
var hashInBase64=hash.toString();
var signUp=hashInBase64.toUpperCase();
返回注册;
*/
var timestamp=新的日期时间(1970,1,1,0,0,0,DateTimeKind.Utc);
var t=(DateTime.Now.ToUniversalTime()-timestamp);
时间=t.ToString();
//CalcSign
var-str=clientID+t;
var key=Convert.FromBase64String(secret);
//var key=Convert.FromBase64String(str);
控制台。写入(“键:”);
PRT字节(键);
var provider=new System.Security.Cryptography.HMACSHA256(key);
var hash=provider.ComputeHash(Encoding.UTF8.GetBytes(str));
Console.Write(“散列:”);
prtByte(散列);
var signature=Convert.ToBase64String(散列);
Console.WriteLine(“签名:”+签名);
var signUp=signature.ToUpper();
签名=注册;
}
公共静态无效字节(字节[]b)
{
对于(变量i=0;i
我得到的信息是=
“请求时间无效”。

在@Jason和@Jack Hua进行了大量故障排除和帮助后,通过使用DateTime.UtcNow,使用String.Format格式化,首先将值转换为double,然后转换为int,解决了问题,如下所示

var timestamp = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
Console.WriteLine("Timestamp = "+timestamp.ToString());
var t2 = String.Format("{0}",timestamp.TotalMilliseconds);     
var t = Double.Parse(t2);
var t3 = Convert.ToInt64(t);
time =""+ t3;

现在我只需要解决我的另一个问题“签名无效”,但那是另一个问题。干杯

您是否比较了两种环境中签名的每个元素,以确定哪些元素不匹配?this
time=t.ToString()
在C#中返回的值与JS.Hmm中对应的代码返回的值非常不同。。。我还可以如何将标题添加到请求中?(请求添加标题(“t”,“1607953974655”);它需要是一个字符串,如果问题出在这里,我该怎么办?你需要正确设置时间字符串的格式-C#提供了大量有文档记录的格式选项,我相信有许多现有的问题确切地描述了如何像JS doesDon一样设置C#date的格式。别忘了稍后标记这个答案,这将有助于更多的pe具有相同问题的ople:)。
var timestamp = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
Console.WriteLine("Timestamp = "+timestamp.ToString());
var t2 = String.Format("{0}",timestamp.TotalMilliseconds);     
var t = Double.Parse(t2);
var t3 = Convert.ToInt64(t);
time =""+ t3;