Adyen,无法获得正确的 SHA-256 加密
Adyen, Unable to get correct SHA-256 encryption
我正在使用签名字符串和私钥生成使用 SHA-256 加密的 public 密钥。
散列函数是标准的 C# SHA-256 散列函数:
string CalculateHMAC256(string hmacKey, string signingstring)
{
byte[] key = Encoding.UTF8.GetBytes(hmacKey);
byte[] data = Encoding.UTF8.GetBytes(signingstring);
using (HMACSHA256 hmac = new HMACSHA256(key))
{
byte[] result = hmac.ComputeHash(data);
return Convert.ToBase64String(result);
}
}
字符串签名如下所示:
allowedMethods:blockedMethods:countryCode:currencyCode:merchantAccount:merchantReference:offset:orderData:paymentAmount:sessionValidity:shipBeforeDate:shopperEmail:shopperLocale:shopperReference:skinCode:::GB:GBP:MyTest:abc:::1:2017-04-28T15:07:10+01:00:2017-04-30::en_US::neDRF4H4
我也按照建议用转义的“:”尝试过这个:
allowedMethods:blockedMethods:countryCode:currencyCode:merchantAccount:merchantReference:offset:orderData:paymentAmount:sessionValidity:shipBeforeDate:shopperEmail:shopperLocale:shopperReference:skinCode:::GB:GBP:MyTest:abc:::1:2017-04-29T13:34:48+01:00:2017-05-01::en_US::neDRF4H4
然后我的 html 表单如下所示:
<form ngNoForm name="frmsp" id="frmsp" target="_blank"
action="https://test.barclaycardsmartpay.com/hpp/pay.shtml"
method="post">
<input type="hidden" name="merchantSig" [value]="merchantSignature" />
<input type="hidden" name="currencyCode" [value]="smartPayment?.currencyCode" />
<input type="hidden" name="merchantAccount" [value]="smartPayment?.merchantAccount" />
<input type="hidden" name="merchantReference" [value]="smartPayment?.merchantReference" />
<input type="hidden" name="paymentAmount" [value]="smartPayment?.paymentAmount" />
<input type="hidden" name="sessionValidity" [value]="smartPayment?.sessionValidity" />
<input type="hidden" name="shipBeforeDate" [value]="smartPayment?.shipBeforeDate" />
<input type="hidden" name="shopperLocale" [value]="smartPayment?.shopperLocale" />
<input type="hidden" name="orderData" [value]="smartPayment?.orderData" />
<input type="hidden" name="skinCode" [value]="smartPayment?.skinCode" />
<input type="hidden" name="countryCode" [value]="smartPayment?.countryCode" />
<input type="hidden" name="shopperEmail" [value]="smartPayment?.shopperEmail" />
<input type="hidden" name="shopperReference" [value]="smartPayment?.shopperReference" />
<input type="hidden" name="allowedMethods" [value]="smartPayment?.allowedMethods" />
<input type="hidden" name="blockedMethods" [value]="smartPayment?.blockedMethods" />
<input type="hidden" name="offset" [value]="smartPayment?.offset" />
<input type="submit" value="Process Payment" (click)="buttonClicked()">
使用 angular2 计算字段值的地方 - 使用用于构建签名字符串的相同值,因此我确信数据匹配。
当我发送表格时,我收到一条错误消息,提示商户签名不正确。
签名字符串的格式可能不正确?
我正在尝试使用托管支付实现对 Barclaycard Smartpay 的调用。文档在这里:
托管支付页面集成指南
注意:巴克莱文档已过时(最后更新于 2012 年)并且对 SHA-1 的引用现在使用 SHA-256。它是使用 Adyen 支付系统构建的,我使用以下示例代码重用了字符串生成示例:https://github.com/Adyen/adyen-asp.net-sample-code
您的签名字符串有问题。您需要将所有值中的“\”替换为“\”,将“:”替换为“:”。
我还建议使用 GIT 上此示例中的代码来生成您的加密签名。
使用下面的代码,我得到了与 Adyen 提供的测试页上相同的签名。
// Computes the Base64 encoded signature using the HMAC algorithm with the HMACSHA256 hashing function.
string CalculateHMAC(string hmacKey, string signingstring)
{
byte[] key = PackH(hmacKey);
byte[] data = Encoding.UTF8.GetBytes(signingstring);
try
{
using (HMACSHA256 hmac = new HMACSHA256(key))
{
// Compute the hmac on input data bytes
byte[] rawHmac = hmac.ComputeHash(data);
// Base64-encode the hmac
return Convert.ToBase64String(rawHmac);
}
}
catch (Exception e)
{
throw new Exception("Failed to generate HMAC : " + e.Message);
}
}
byte[] PackH(string hex)
{
if ((hex.Length % 2) == 1)
{
hex += '0';
}
byte[] bytes = new byte[hex.Length / 2];
for (int i = 0; i < hex.Length; i += 2)
{
bytes[i / 2] = Convert.ToByte(hex.Substring(i, 2), 16);
}
return bytes;
}
尝试只使用有限的字段,看看是否能得到任何结果。
我使用了以下字段(也考虑了它们的顺序!)
currencyCode:merchantAccount:merchantReference:paymentAmount:sessionValidity:shipBeforeDate:shopperLocale:skinCode
我正在使用签名字符串和私钥生成使用 SHA-256 加密的 public 密钥。
散列函数是标准的 C# SHA-256 散列函数:
string CalculateHMAC256(string hmacKey, string signingstring)
{
byte[] key = Encoding.UTF8.GetBytes(hmacKey);
byte[] data = Encoding.UTF8.GetBytes(signingstring);
using (HMACSHA256 hmac = new HMACSHA256(key))
{
byte[] result = hmac.ComputeHash(data);
return Convert.ToBase64String(result);
}
}
字符串签名如下所示: allowedMethods:blockedMethods:countryCode:currencyCode:merchantAccount:merchantReference:offset:orderData:paymentAmount:sessionValidity:shipBeforeDate:shopperEmail:shopperLocale:shopperReference:skinCode:::GB:GBP:MyTest:abc:::1:2017-04-28T15:07:10+01:00:2017-04-30::en_US::neDRF4H4
我也按照建议用转义的“:”尝试过这个: allowedMethods:blockedMethods:countryCode:currencyCode:merchantAccount:merchantReference:offset:orderData:paymentAmount:sessionValidity:shipBeforeDate:shopperEmail:shopperLocale:shopperReference:skinCode:::GB:GBP:MyTest:abc:::1:2017-04-29T13:34:48+01:00:2017-05-01::en_US::neDRF4H4
然后我的 html 表单如下所示:
<form ngNoForm name="frmsp" id="frmsp" target="_blank"
action="https://test.barclaycardsmartpay.com/hpp/pay.shtml"
method="post">
<input type="hidden" name="merchantSig" [value]="merchantSignature" />
<input type="hidden" name="currencyCode" [value]="smartPayment?.currencyCode" />
<input type="hidden" name="merchantAccount" [value]="smartPayment?.merchantAccount" />
<input type="hidden" name="merchantReference" [value]="smartPayment?.merchantReference" />
<input type="hidden" name="paymentAmount" [value]="smartPayment?.paymentAmount" />
<input type="hidden" name="sessionValidity" [value]="smartPayment?.sessionValidity" />
<input type="hidden" name="shipBeforeDate" [value]="smartPayment?.shipBeforeDate" />
<input type="hidden" name="shopperLocale" [value]="smartPayment?.shopperLocale" />
<input type="hidden" name="orderData" [value]="smartPayment?.orderData" />
<input type="hidden" name="skinCode" [value]="smartPayment?.skinCode" />
<input type="hidden" name="countryCode" [value]="smartPayment?.countryCode" />
<input type="hidden" name="shopperEmail" [value]="smartPayment?.shopperEmail" />
<input type="hidden" name="shopperReference" [value]="smartPayment?.shopperReference" />
<input type="hidden" name="allowedMethods" [value]="smartPayment?.allowedMethods" />
<input type="hidden" name="blockedMethods" [value]="smartPayment?.blockedMethods" />
<input type="hidden" name="offset" [value]="smartPayment?.offset" />
<input type="submit" value="Process Payment" (click)="buttonClicked()">
使用 angular2 计算字段值的地方 - 使用用于构建签名字符串的相同值,因此我确信数据匹配。
当我发送表格时,我收到一条错误消息,提示商户签名不正确。
签名字符串的格式可能不正确? 我正在尝试使用托管支付实现对 Barclaycard Smartpay 的调用。文档在这里: 托管支付页面集成指南
注意:巴克莱文档已过时(最后更新于 2012 年)并且对 SHA-1 的引用现在使用 SHA-256。它是使用 Adyen 支付系统构建的,我使用以下示例代码重用了字符串生成示例:https://github.com/Adyen/adyen-asp.net-sample-code
您的签名字符串有问题。您需要将所有值中的“\”替换为“\”,将“:”替换为“:”。
我还建议使用 GIT 上此示例中的代码来生成您的加密签名。
使用下面的代码,我得到了与 Adyen 提供的测试页上相同的签名。
// Computes the Base64 encoded signature using the HMAC algorithm with the HMACSHA256 hashing function.
string CalculateHMAC(string hmacKey, string signingstring)
{
byte[] key = PackH(hmacKey);
byte[] data = Encoding.UTF8.GetBytes(signingstring);
try
{
using (HMACSHA256 hmac = new HMACSHA256(key))
{
// Compute the hmac on input data bytes
byte[] rawHmac = hmac.ComputeHash(data);
// Base64-encode the hmac
return Convert.ToBase64String(rawHmac);
}
}
catch (Exception e)
{
throw new Exception("Failed to generate HMAC : " + e.Message);
}
}
byte[] PackH(string hex)
{
if ((hex.Length % 2) == 1)
{
hex += '0';
}
byte[] bytes = new byte[hex.Length / 2];
for (int i = 0; i < hex.Length; i += 2)
{
bytes[i / 2] = Convert.ToByte(hex.Substring(i, 2), 16);
}
return bytes;
}
尝试只使用有限的字段,看看是否能得到任何结果。 我使用了以下字段(也考虑了它们的顺序!)
currencyCode:merchantAccount:merchantReference:paymentAmount:sessionValidity:shipBeforeDate:shopperLocale:skinCode