Closed somnusnrlq closed 2 years ago
{"msg_signature":"21ba01d1f90739003e944da2ab481379d7ef69d9","timeStamp":"1655859838971","nonce":"yVOHqguT","encrypt":"qCjUIDE0YwT6hNQDCo2R1qefU3ZR6IQ2/435dyYcr557SqgRJo53e84nzTDoKYL07tWYZ68ScAO4cObzDuK5Gg=="} 官方说自带代码生成得不对 我直接把 timeStamp nonce 两个原值传递过去的 保存还是报错HTTP请求结果校验返回字段值失败
问题解决了
总结来说这里我遇到两个坑
1.调用C#版的getEncryptedMap(String plaintext) demo报错 原因是里面自己生成的timeStamp没有正确转化13位的时间戳导致 2.是我的项目是netCore3.1 我在startup启动文件中做了返回对象的统一小写转化
3.工单一直回复timeStamp、nonce两个都是接收的原值传递进去(这个是不对的,只传递timeStamp)
下面将DingTalkEncryptor.cs中修改代码如下,
` /**
将和钉钉开放平台同步的消息体加密,返回加密Map */ public Dictionary<String, String> getEncryptedMap(String plaintext) {
var time = DateTime.Now;
return getEncryptedMap(plaintext, DateTimeToLongTimeStamp(time));
}
/// <summary>From:www.uzhanbao.com
/// DateTime转换为13位时间戳(单位:毫秒)
/// </summary>
/// <param name="dateTime"> DateTime</param>
/// <returns>13位时间戳(单位:毫秒)</returns>
public static long DateTimeToLongTimeStamp(DateTime dateTime)
{
DateTime timeStampStartTime = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
return (long)(dateTime.ToUniversalTime() - timeStampStartTime).TotalMilliseconds;
}`
方法二: 外层直接传递接收到的timeStamp 调用重载方法即可 denc.getEncryptedMap("success", long.Parse(timeStamp));
测试日志都能输出。。保存就是失败
补充:使用返回的getEncryptedMap数据进行测试返回的是success
补充2:既然是success那么考虑返回格式问题 测试发现 返回successMap:{"msg_signature":"8207a0ae016d1847f7f1d05a62b9b8a84b13dd43","encrypt":"BCtCbxMLXZNAlTNoMraFDhFWJ8l78y/L8/kGvAytjMqUdIiYmdz13Uk04+FviogTgo8P9rXaLl66pkj3uCziHg==","timeStamp":"749","nonce":"5418emcCHwlW5khH"} 格式是正确的 采用了不同方式返回对象 都是不行!!!