Sha-out 标志在 Ogone 中不匹配
Sha-out sign not matching in Ogone
我正在尝试为我的网上商店制作一个支付插件,以实现 Ogone 理想支付。我可以付款,但是当我 return 时,我无法让 SHA 符号匹配。
我在 return 上有以下获取请求:
orderID=476&amount=90%2E82&PM=iDEAL&ACCEPTANCE=0000000000&STATUS=9&PAYID=43934127&NCERROR=0&BRAND=iDEAL&SHASIGN=5AB0A065BAA83C5D807249A66E661ACBB6709B8F
根据文档,我必须按字母顺序排列密钥,并且只对允许的密钥进行哈希处理。
这些是允许的键:
['AAVADDRESS', 'AAVCHECK', 'AAVZIP', 'ACCEPTANCE', 'ALIAS', 'AMOUNT', 'BRAND', 'CARDNO', 'CCCTY', 'CN', 'COMPLUS', 'CURRENCY', 'CVCCHECK', 'DCC_COMMPERCENTAGE', 'DCC_CONVAMOUNT', 'DCC_CONVCCY', 'DCC_EXCHRATE', 'DCC_EXCHRATESOURCE', 'DCC_EXCHRATETS', 'DCC_INDICATOR', 'DCC_MARGINPERCENTAGE', 'DCC_VALIDHOUS', 'DIGESTCARDNO', 'ECI', 'ED', 'ENCCARDNO', 'IP', 'IPCTY', 'NBREMAILUSAGE', 'NBRIPUSAGE', 'NBRIPUSAGE_ALLTX', 'NBRUSAGE', 'NCERROR', 'ORDERID', 'PAYID', 'PM', 'SCO_CATEGORY', 'SCORING', 'STATUS', 'TRXDATE', 'VC'];
我用这个方法来制作散列:
/**
* @return string
*/
protected function getShaOutSign()
{
$hash = '';
$values = \Input::all();
$values = array_change_key_case($values, CASE_UPPER);
ksort($values);
foreach ($values as $key => $value) {
if (in_array($key, $this->shaOut)) {
if(!empty($value))
{
$hash .= $key . '=' . $values[$key] . $this->settings->shaout;
}
}
}
return strtoupper(sha1($hash));
}
我 100% 确定 SHA 输出密钥是正确的。
在我做 SHA1 之前生成的字符串:
ACCEPTANCE=0000000000abcDEFghj1234560987654AMOUNT=90.82abcDEFghj1234560987654BRAND=iDEALabcDEFghj1234560987654ORDERID=476abcDEFghj1234560987654PAYID=43934127abcDEFghj1234560987654PM=iDEALabcDEFghj1234560987654STATUS=9abcDEFghj1234560987654
我得到的最终哈希是:
68E459CB933E04B582A5D564CE6F591D5819B7F1
无论我尝试什么,我都无法让它与 $_GET 请求中的匹配。
我的 sha-out 密钥:abcDEFghj1234560987654
接下来我可以尝试什么?
sha out计算错误。这是我在项目中用来计算它的代码,$sha_parms
是 Ogone 的完整回复。所以 $_POST
或 $_GET
/**
* Function to calculate the sha that is received from Ogone
*/
public function getShaOut($sha_parms, $sha_out = null) {
$sha_out = $sha_out ?: self::PASS_PHRASE_OUT;
$sha_parms = $this->ogoneSort($sha_parms);
$sha_string = '';
foreach ($sha_parms as $key => $value) {
if ($key != 'SHASIGN' && $value != '') {
$sha_string .= $key . '=' . $value . $sha_out;
}
}
//return($sha_string);
return strtoupper(sha1($sha_string));
}
/**
*
*
**/
private function ogoneSort($array) {
$arrayToSort = array();
$origArray = array();
foreach ($array as $key => $value) {
$arrayToSort[strtolower($key)] = $value;
//stores the original value in an array
$origArray[strtolower($key)] = $key;
}
ksort($arrayToSort);
$sortedArray = array();
foreach($arrayToSort as $key => $value) {
//switch the lowercase keys back to their originals
$key = strtoupper($origArray[$key]);
$sortedArray[$key] = $value;
}
return $sortedArray;
}
问题显然是那部分:
if(!empty($value))
{
$hash .= $key . '=' . $values[$key] . $this->settings->shaout;
}
您的请求包含“...&NCERROR=0...”。
所以值为0。0为空。
我遇到了同样的问题。但是我使用了 array_filter() 函数:
$parameters = array_filter($parameters);
同时 array_filter() 删除了我的 'empty' ncerror 字段。
我正在尝试为我的网上商店制作一个支付插件,以实现 Ogone 理想支付。我可以付款,但是当我 return 时,我无法让 SHA 符号匹配。
我在 return 上有以下获取请求:
orderID=476&amount=90%2E82&PM=iDEAL&ACCEPTANCE=0000000000&STATUS=9&PAYID=43934127&NCERROR=0&BRAND=iDEAL&SHASIGN=5AB0A065BAA83C5D807249A66E661ACBB6709B8F
根据文档,我必须按字母顺序排列密钥,并且只对允许的密钥进行哈希处理。
这些是允许的键:
['AAVADDRESS', 'AAVCHECK', 'AAVZIP', 'ACCEPTANCE', 'ALIAS', 'AMOUNT', 'BRAND', 'CARDNO', 'CCCTY', 'CN', 'COMPLUS', 'CURRENCY', 'CVCCHECK', 'DCC_COMMPERCENTAGE', 'DCC_CONVAMOUNT', 'DCC_CONVCCY', 'DCC_EXCHRATE', 'DCC_EXCHRATESOURCE', 'DCC_EXCHRATETS', 'DCC_INDICATOR', 'DCC_MARGINPERCENTAGE', 'DCC_VALIDHOUS', 'DIGESTCARDNO', 'ECI', 'ED', 'ENCCARDNO', 'IP', 'IPCTY', 'NBREMAILUSAGE', 'NBRIPUSAGE', 'NBRIPUSAGE_ALLTX', 'NBRUSAGE', 'NCERROR', 'ORDERID', 'PAYID', 'PM', 'SCO_CATEGORY', 'SCORING', 'STATUS', 'TRXDATE', 'VC'];
我用这个方法来制作散列:
/**
* @return string
*/
protected function getShaOutSign()
{
$hash = '';
$values = \Input::all();
$values = array_change_key_case($values, CASE_UPPER);
ksort($values);
foreach ($values as $key => $value) {
if (in_array($key, $this->shaOut)) {
if(!empty($value))
{
$hash .= $key . '=' . $values[$key] . $this->settings->shaout;
}
}
}
return strtoupper(sha1($hash));
}
我 100% 确定 SHA 输出密钥是正确的。
在我做 SHA1 之前生成的字符串:
ACCEPTANCE=0000000000abcDEFghj1234560987654AMOUNT=90.82abcDEFghj1234560987654BRAND=iDEALabcDEFghj1234560987654ORDERID=476abcDEFghj1234560987654PAYID=43934127abcDEFghj1234560987654PM=iDEALabcDEFghj1234560987654STATUS=9abcDEFghj1234560987654
我得到的最终哈希是:
68E459CB933E04B582A5D564CE6F591D5819B7F1
无论我尝试什么,我都无法让它与 $_GET 请求中的匹配。
我的 sha-out 密钥:abcDEFghj1234560987654
接下来我可以尝试什么?
sha out计算错误。这是我在项目中用来计算它的代码,$sha_parms
是 Ogone 的完整回复。所以 $_POST
或 $_GET
/**
* Function to calculate the sha that is received from Ogone
*/
public function getShaOut($sha_parms, $sha_out = null) {
$sha_out = $sha_out ?: self::PASS_PHRASE_OUT;
$sha_parms = $this->ogoneSort($sha_parms);
$sha_string = '';
foreach ($sha_parms as $key => $value) {
if ($key != 'SHASIGN' && $value != '') {
$sha_string .= $key . '=' . $value . $sha_out;
}
}
//return($sha_string);
return strtoupper(sha1($sha_string));
}
/**
*
*
**/
private function ogoneSort($array) {
$arrayToSort = array();
$origArray = array();
foreach ($array as $key => $value) {
$arrayToSort[strtolower($key)] = $value;
//stores the original value in an array
$origArray[strtolower($key)] = $key;
}
ksort($arrayToSort);
$sortedArray = array();
foreach($arrayToSort as $key => $value) {
//switch the lowercase keys back to their originals
$key = strtoupper($origArray[$key]);
$sortedArray[$key] = $value;
}
return $sortedArray;
}
问题显然是那部分:
if(!empty($value))
{
$hash .= $key . '=' . $values[$key] . $this->settings->shaout;
}
您的请求包含“...&NCERROR=0...”。
所以值为0。0为空。
我遇到了同样的问题。但是我使用了 array_filter() 函数:
$parameters = array_filter($parameters);
同时 array_filter() 删除了我的 'empty' ncerror 字段。