【发布时间】:2015-10-02 20:39:52
【问题描述】:
我正在尝试为我的网上商店制作一个支付插件,用于 Ogone 理想支付。我可以付款,但是当我返回时,我无法匹配 SHA 标志。
我有以下返回请求:
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
接下来我可以尝试什么?
【问题讨论】:
-
您的计算有问题。如果我重新计算哈希值,我会得到正确的哈希值
-
嘿嘿嘿,我注意到有问题,不知道是什么问题 :(
-
this 是我用来计算它的,
$sha_parms是完整的$_POST或者在你的情况下是$_GET -
确实,你的工作正常。我会检查差异。你能回答一下,让我接受吗?谢谢!