我正试图为我的Ogone理想的付款网上商店付款插件。我可以付款,但当我返回我不能得到SHA-标志匹配。
我在返回时有以下get请求:
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'];
我用这个方法来生成hash:
/**
* @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
最后得到的hash是:
68E459CB933E04B582A5D564CE6F591D5819B7F1
无论我怎么尝试,我就是不能让它与$_GET请求中的匹配。
我的sha-out键:abcDEFghj1234560987654
接下来我可以尝试什么?
3条答案
按热度按时间ryevplcw1#
sha out计算是错误的。这是我在项目中使用的代码来计算它,
$sha_parms
是Ogone的完整响应。因此$_POST
或$_GET
66bbxpm52#
问题显然出在这一部分:
您的请求包含'...&NCERROR=0...'。
所以值是0。0是空的。
我也遇到了同样的问题。但是我使用了array_filter()函数:
array_filter()也删除了我的'empty' ncerror字段。
roejwanj3#
现在还有人在用旧的Ogone/Ingenico/Wordline吗?)
@DarkBee的解决方案是正确的,但可以简化:
首先,你需要对字段数组进行排序,保持当前键的大小写不变。然后将这些键转换为大写。只有在这之后,才能将结果数组连接起来计算哈希。