Sha-out标志与Ogone,PHP不匹配

时间:2015-07-14 09:26:26

标签: php payment sha

我正在尝试为我的网上商店制作支付插件,以便为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'];

我制作了这个方法来制作哈希:

/**
 * @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请求中的那个匹配。

我的丢失密钥:abcDEFghj1234560987654

有人能指出我正确的方向吗?

2 个答案:

答案 0 :(得分:1)

问题显然是那部分:

if(!empty($value))
{
    $hash .= $key . '=' . $values[$key] . $this->settings->shaout;
}

您的请求包含'...& NCERROR = 0 ...'。

因此该值为0.并且0为空。

我遇到了同样的问题。但我使用了array_filter()函数:

$parameters = array_filter($parameters);

array_filter()也删除了我的'空'ncerror字段。

答案 1 :(得分:0)

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;
            }