发送请求以https://securepay.tinkoff.ru/v2/Init
接收付款链接。
这样,付款成功后,Tinkoff 就会向我的服务器发送请求(我在初始化时在 notificationurl 中发送了一个链接)。
但我不明白如何检查令牌。在服务器发送给我的请求中,令牌与我生成的令牌不匹配。
private string GenerateTinkoffToken(Dictionary<string, string> dataForToken)
{
// 1. Сортируем ключи массива по алфавиту
var sortedDataKeys = dataForToken.Keys.OrderBy(k => k).ToList();
var sortedData = new Dictionary<string, string>();
foreach (var key in sortedDataKeys)
{
sortedData.Add(key, dataForToken[key]);
}
// 2. Конкатенируем только значения пар в одну строку (без разделителей)
var concatenatedString = string.Join("", sortedData.Values);
// 3. Применяем хэш-функцию SHA-256 (с поддержкой UTF-8 - по умолчанию в C#)
string calculatedToken;
using (SHA256 sha256Hash = SHA256.Create())
{
byte[] bytes = sha256Hash.ComputeHash(Encoding.UTF8.GetBytes(concatenatedString));
StringBuilder builder = new StringBuilder();
for (int i = 0; i < bytes.Length; i++)
{
builder.Append(bytes[i].ToString("x2"));
}
calculatedToken = builder.ToString();
}
return calculatedToken;
}
这里几乎没有什么建议可以提供。我只能假设,出于某种原因,您认为
Dictionary
收集值到的是一个已排序的集合,并且它将保留您添加键时的顺序。这远非总是正确的。字典不保证键的顺序。如果我正确理解了文档中的逻辑,重写该方法以使其更可靠,可以这样做:
您没有指定 .NET 版本,因此我们假设您拥有当前的 .NET 9。
但在我看来,您的问题出在所示代码之外的某个地方。