Antwort #13 am: 18. April 2013, 21:12:31
Hallo allerseits,
da ich leider meine email auf meinem neuen System nicht eingerichtet hatte, konnte ich eure Nachrichten nicht empfangen. Sorry an diejenigen die mir eine PN hinterlassen haben. Habe gesehen dass tatsächlich mehrere Leute dasselbe Problem haben, und werde deshalb meinen geänderten Code posten. Ihr müsst ihn sicherlich noch an eure Gegebenheiten anpassen.
Ich kann daher nicht versprechen, dass meine Lösung auch bei Euch auf Anhieb funzt.
Ich glaube mich auch zu erinnern, wo das Problem lag.
Die Parameter in der sha-signatur werden nicht in der geforderten Reihenfolge übermittelt. Jedoch verlangt Ogone einen sortierten Request.
Zunächst müssen alle Parameter, die übertragen werden sollen, nach Alphabet sortiert werden.
Dies übernimmt die Funktion _ogonePreparePayment() in der Schnittstelle von Ogone ( zu finden im module/payments Ordner in der datei ogone_cc.php)
###############################
FUNKTION _ogonePreparePayment()###############################
Das Array $params enthält die zu übertragenden Parameter mit ihren Werten.
Ich weis jetzt nicht genau ob das Array $param existierte, jedenfalls enthält dieses Array alle Keys aus dem Array $params. (kann unsortiert sein)
Folgender Parameter/Key MUSS aus beiden Arrays entfernt/auskommentiert werden!Dann wird das Array $param mittels
sort($param) sortiert.
Nun folgt der Teil, der (bei mir zumindest war es so) den Fehler erzeugt hatte:
Die falsche Verschlüsselung des zu übertragenden Querys.
Um einen korrekten Query und den richtigen SHA-Wert zu erzeugen verwende ich folgenden Code:
$pp = '';$pp1 = '';foreach($param as $p){ if(urldecode($params[$p])!=''){ $pp1 .= strtoupper($p).'='.urldecode($params[$p]).''.MODULE_PAYMENT_OGONE_CC_SHA_ADDSTRING
; $pp .= strtoupper($p).'='.$params[$p].'&'; }}$shasign = strtoupper( sha1 ( $pp1 ) );$ogoneURL = MODULE_PAYMENT_OGONE_CC_URL
.'?'.$pp.'SHASIGN='.$shasign;$this->LogOgone( "ogone_cc::_ogonePreparePayment - call URL: ".$ogoneURL );xtc_redirect
($ogoneURL); ###############################
FUNKTION _checkSHASignature()###############################
Diese Sortierung muss auch in der Funktion _checkSHASignature() erfolgen.
Die Keys im Array $shaReqParams müssen genau dieselben sein die von Ogone auch im Feedback gesendet werden. Keys die im Backend von Ogone in den zusätzlich übertragenen Parametern ausgewählt sind müssen hier mit eingetragen werden.
Ich bin mir gerade nicht sicher ob die Keys im Code die ursprünglichen sind. Das solltet ihr in jedem Fall prüfen. Dazu vergleicht ihr einfach den Query vom feedback.
/**
* Verify feedback response.
*
* @return bool
*/function _checkSHASignature
( ){ $shaReqParams = array('ORDERID','CURRENCY','AMOUNT','PM','ACCEPTANCE','STATUS','CARDNO','PAYID','NCERROR','BRAND','IP','BIN','CN','COMPLUS','ECI','ED','SUBBRAND','TRXDATE','BATCHID','VALID','NBREMAILUSAGE','NBRIPUSAGE','NBRIPUSAGE_ALLTX','NBRUSAGE','NCERRORPLUS','NCSTATUS'); foreach($_REQUEST as $k => $v){ $kk = strtoupper($k); if(in_array($kk,$shaReqParams)){ $preHash[$kk] = $v.MODULE_PAYMENT_OGONE_CC_SHA_ADDSTRING2
; $preHash_[] = $kk; } } sort($preHash_); $pre_Hash = ''; foreach($preHash_ as $p){ $pre_Hash .= $p.'='.$preHash[$p].''; } $sha_signature = $pre_Hash; if ( $_REQUEST['SHASIGN'] != strtoupper( sha1( $sha_signature ) ) ) { $this->LogOgone( "ogone_cc::_checkSHASignature: SECURE KEY INCORRECT !!! Request: ".$_REQUEST['SHASIGN']." Parameter: ".$sha_signature." Signature: ".strtoupper( sha1( $sha_signature ))); return false; } return true;} Ich hoffe ich habe nichts vergessen, da die Anpassungen nun schon eine Weile her sind, und ich auch im Moment nicht die Originaldatei von Ogone da hab.
Viel Erfolg, Alex