如何使用 SHA-512 让 Ogone 支持字段值中的特殊字符
How to get Ogone to support special characters in field values with SHA-512
我们为 Ogone 支付平台实施了 SHA-512 哈希。
这意味着我们必须散列所有 FORM 变量的所有值。
但是,只要字段包含特殊字符,Ogone 就不会接受哈希。付款页面将呈现记录的错误:error order/1/s
Ogone 有一个测试页面可用于测试字符串并获取 SHA512:
https://secure.ogone.com/ncol/test/testsha_UTF8.asp
以下是我用于单元测试的示例。
[TestMethod]
public void EncodePaiosBajos_ResultsInExpectedSha512String()
{
string name = "Paios Bajos";
string result = PaymentProviderHelper.ShaEncode(name, new SHA512Managed());
string expected = "3AC80D8A5B1AF7DF3530027269B807B097B6C770F168509ED7A8148E941AEA3369112F1B5BF1BE0965D0FE9AB83C1AB1CB7BF22DFD733E120A6A828600EFE643";
Assert.AreEqual(expected, result);
}
[TestMethod]
public void EncodePaiosBajosSpecialCharacters_ResultsInExpectedSha512String()
{
string name = "Países Bajos";
string result = PaymentProviderHelper.ShaEncode(name, new SHA512Managed());
string expected = "D4F8FFEC3FA0A3146C9611294569FF861CFF0E8C26982DA8D492DAB5D67B380558BFA0571A7D0DF49407B5075AE4DCE76253603075AF9350EA180ED32FA96026";
Assert.AreEqual(expected, result);
}
PaymentProviderHelper.ShaEncode 方法如下所示:
internal static string ShaEncode(string signature, HashAlgorithm shaEncoding)
{
shaEncoding.Initialize();
// Encode signature
byte[] buffer = Encoding.ASCII.GetBytes(signature);
shaEncoding.ComputeHash(buffer);
// Return the encoded string in hexidecimal
String returnValue = String.Empty;
foreach (byte c in shaEncoding.Hash)
{
returnValue += String.Format("{0:X2}", (int)c);
}
return returnValue;
}
问:为什么第二次单元测试失败了?
这个针对特殊字符的编码实现是否有问题?
测试在 C#.NET 4.5 中进行
ogone 的测试页面使用 UTF8 编码(基于 URL)来生成哈希值。然而在您的实现中,您使用 Encoding.ASCII
。只需将您的实现编码更改为 Encoding.UTF8
.
我们为 Ogone 支付平台实施了 SHA-512 哈希。 这意味着我们必须散列所有 FORM 变量的所有值。
但是,只要字段包含特殊字符,Ogone 就不会接受哈希。付款页面将呈现记录的错误:error order/1/s
Ogone 有一个测试页面可用于测试字符串并获取 SHA512: https://secure.ogone.com/ncol/test/testsha_UTF8.asp
以下是我用于单元测试的示例。
[TestMethod]
public void EncodePaiosBajos_ResultsInExpectedSha512String()
{
string name = "Paios Bajos";
string result = PaymentProviderHelper.ShaEncode(name, new SHA512Managed());
string expected = "3AC80D8A5B1AF7DF3530027269B807B097B6C770F168509ED7A8148E941AEA3369112F1B5BF1BE0965D0FE9AB83C1AB1CB7BF22DFD733E120A6A828600EFE643";
Assert.AreEqual(expected, result);
}
[TestMethod]
public void EncodePaiosBajosSpecialCharacters_ResultsInExpectedSha512String()
{
string name = "Países Bajos";
string result = PaymentProviderHelper.ShaEncode(name, new SHA512Managed());
string expected = "D4F8FFEC3FA0A3146C9611294569FF861CFF0E8C26982DA8D492DAB5D67B380558BFA0571A7D0DF49407B5075AE4DCE76253603075AF9350EA180ED32FA96026";
Assert.AreEqual(expected, result);
}
PaymentProviderHelper.ShaEncode 方法如下所示:
internal static string ShaEncode(string signature, HashAlgorithm shaEncoding)
{
shaEncoding.Initialize();
// Encode signature
byte[] buffer = Encoding.ASCII.GetBytes(signature);
shaEncoding.ComputeHash(buffer);
// Return the encoded string in hexidecimal
String returnValue = String.Empty;
foreach (byte c in shaEncoding.Hash)
{
returnValue += String.Format("{0:X2}", (int)c);
}
return returnValue;
}
问:为什么第二次单元测试失败了?
这个针对特殊字符的编码实现是否有问题?
测试在 C#.NET 4.5 中进行
ogone 的测试页面使用 UTF8 编码(基于 URL)来生成哈希值。然而在您的实现中,您使用 Encoding.ASCII
。只需将您的实现编码更改为 Encoding.UTF8
.