Ogone – (SHA-1 IN & SHA-1 OUT)
Deze week serieus gevloekt op Ogone. Ze hebben namelijk hun concatenatie van strings aangepast om die SHA-1 IN & SHA-1 OUT hash te maken. Zonder iets van deftige communicatie aan de webdevelopers hebben ze dit op 10 mei 2010 toegepast op alle hun sindsdien nieuw geregistreerde accounts – ik wist allesinds van niets
.
De reden waarom ze dit hebben aangepast is voor een betere beveiliging van de verstuurde data. Nu allemaal goed en wel zolang je geen automatisch systeem hebt die Ogone automatisch gaat configureren voor & door klanten en dus die hashes automatisch gaat opbouwen. Laat staan dat er dan nog eens een modulair platform is waar klanten Ogone kunnen activeren waardoor je nog eens een update mag gaan schrijven voor veel websites… nu het is nu zo… genoeg gejankt. Tijd voor de oplossing! Om jullie veel zoekwerk te besparen heb ik eens kort samengevat wat er nu precies gewijzigd is en hoe je dit eenvoudigst kunt gaan oplossen.
SHA-1 IN:
Vroeger:
$sha1In = sha1($orderID.$amount.$currency.$pspid.$YourOwnSecretString);
Nu:
Je neemt alle inputfields die je gebruikt bij het formulier naar Ogone. Zoals onderstaand formulier:
Nogmaals samengevat gaan we dus alles verzamelen die we naar Ogone gaan versturen. Een lijst van parameters die je moet toevoegen aan uw hash kan je hier vinden (zoek naar hoofdstuk 15.1). Om dan definitief uw string te maken gaan we alles concateneren op basis van NAME=value+(sha-1 in passwordkey). Opgepast de name moet uppercase zijn en de parameters moeten alfabetisch toegevoegd worden en parameters met een lege value mogen niet toegevoegd worden!
Als resultaat kom je dan bijvoorbeeld zoiets uit:
ACCEPTURL=http://project/ogone/accept/payment/74MySecretPassWord!!AMOUNT=3600MySecretPassWord!!CANCELURL=http://project/ogone/cancelled/payment/74MySecretPassWord!!CN=Pieter CappelleMySecretPassWord!!CURRENCY=EURMySecretPassWord!!DECLINEURL=http://project/ogone/declined/payment/74MySecretPassWord!!EMAIL=snakehit@gmail.com.MySecretPassWord!!EXCEPTIONURL=http://project/ogone/exception/payment/74MySecretPassWord!!LANGUAGE=nl_NLMySecretPassWord!!ORDERID=74MySecretPassWord!!OWNERADDRESS=Segersstraat 16MySecretPassWord!!OWNERCTY=BelgiëMySecretPassWord!!OWNERTOWN=IzegemMySecretPassWord!!OWNERZIP=8870MySecretPassWord!!PSPID=XXXXXMySecretPassWord!!TITLE=ProjectMySecretPassWord!!TP=http://project/ogoneMySecretPassWord!!
Om dan de SHA-1 string te bekomen de PHP functie sha1() met bovenstaande string aanroepen en dit meesturen naar Ogone in het veld SHASign.
- Krijg je de foutmelding ‘unknown order/0/s‘ wilt dit zeggen dat je geen SHA-1 string hebt meegestuurd. Wat je dus wel degelijk moet doen…
- Krijg je de melding ‘unknown order/1/s‘ dan wil dit zeggen dat de SHA-1 IN hash die Ogone gemaakt heeft niet overeenkomt met de hash die jij gemaakt hebt. Er dus ergens iets foutgelopen bij het maken van uw hash.
SHA-1 OUT:
Vroeger:
$sha1In = sha1($_REQUEST['orderID'].$_REQUEST['currency'].$_REQUEST['amount'].$_REQUEST['PM'].$_REQUEST['ACCEPTANCE'].$_REQUEST['STATUS'].$_REQUEST['CARDNO'].$_REQUEST['PAYID'].$_REQUEST['NCERROR'].$_REQUEST['BRAND'].$ogoneFeedbackPassword);
Nu:
Het nieuwe systeem is gebaseerd op hetzelfde systeem als de SHA-1 IN hash. Bij de return van Ogone (dus na de betaling) ontvang je een resum parameters. Die parameters kan je opvragen in de $_REQUEST[] . (Om de parameters terug te krijgen van Ogone is het noodzakelijk dat je in hun control panel gaat gaan aanvinken dat ze na de betaling de parameters moeten terugsturen.) Als resultaat krijg je dan zoiets:
Array ( [controller] => ogone [action] => accept [payment] => 75 [orderID] => 75 [currency] => EUR [amount] => 36 [PM] => CreditCard [ACCEPTANCE] => test123 [STATUS] => 5 [CARDNO] => XXXXXXXXXXXX1111 [ED] => 0114 [CN] => Pieter Cappelle [TRXDATE] => 08/27/10 [PAYID] => 8048783 [NCERROR] => 0 [BRAND] => VISA [IPCTY] => BE [CCCTY] => US [ECI] => 7 [CVCCheck] => NO [AAVCheck] => NO [VC] => NO [IP] => 81.82.XXX.220 [SHASIGN] => 375CB7CCFAC268E049020BC1D105DC0EBC0C5687 [PHPSESSID] => 418da012a96bc9bbbcc2e289ace555cf )
Deze parameters moet je dan opnieuw alfabetisch gaan concateneren. Opgepast! Bovenstaande resultaten kunnen verschillend zijn van uw resultaten. Opnieuw ga naar de lijst van parameters die je moet toevoegen aan uw hash. Die lijst kan je hier vinden (zoek naar hoofdstuk 15.2). Deze parameters moeten allemaal toegevoegd worden aan uw hash. Als 2de opmerking – het password dat je hier gebruikt is uw SHA-1 OUT handtekening die je hebt ingegeven bij Ogone.
Als resultaat kom je dan bijvoorbeeld zoiets uit:
AAVCHECK=NOMySecretPassWord!!ACCEPTANCE=test123MySecretPassWord!!AMOUNT=36MySecretPassWord!!BRAND=VISAMySecretPassWord!!CARDNO=XXXXXXXXXXXX1111MySecretPassWord!!CCCTY=USMySecretPassWord!!CN=Pieter CappelleMySecretPassWord!!CURRENCY=EURMySecretPassWord!!CVCCHECK=NOMySecretPassWord!!ECI=7MySecretPassWord!!ED=0114MySecretPassWord!!IP=81.82.194.220MySecretPassWord!!IPCTY=BEMySecretPassWord!!NCERROR=0SecretPassWord!!ORDERID=75MySecretPassWord!!PAYID=8048783MySecretPassWord!!PM=CreditCardMySecretPassWord!!STATUS=5MySecretPassWord!!TRXDATE=08/25/10MySecretPassWord!!VC=NOMySecretPassWord!!
Om dan de SHA-1 string te bekomen de PHP functie sha1() met bovenstaande string aanroepen en dit vergelijken met de verkregen SHASIGN van Ogone. Als deze gelijk zijn is de transactie goed gelukt. Komen deze niet overeen is er een probleem!
Mocht je vragen (of opmerkingen) hebben stel ze gerust
Update (28/12/2010)
In bovenstaande blogpost ontbreekt nog het volgende: ik ben vergeten te vermelden dat de SHA-sign (dus de SHA-1 IN en SHA-1 OUT) die je genereert in hoofdletters moet worden doorgestuurd. Dus na het aanroepen van de sha1() functie moet je er nog eens strtoupper() bij doen.
Update (21/01/2011)
In de commentaren van dit artikel kan je lezen dat een veelgemaakte fout is om de SHA string niet te laten eindigen op de passwordkey. Je kan dan heel lang zitten zoeken op het probleem zonder dat je het echt ziet. Dus zeker en vast eens checken!
Update (02/09/2011)
1) Nog een vaak voorkomende fout is dat bij de SHA1-OUT enkel en alleen de ingevulde values moeten teruggestuurd worden. Het kan dus gebeuren dat je in uw REQUEST parameters ook lege values hebt. Deze moeten niet toegevoegd worden aan de string. Wel opletten met een getal zoals NUL/0. Dit is niet leeg, dus (not empty) !empty zal niet voldoende zijn voor deze controle!
2) Maak altijd gebruik van de template orderstandard_utf8.asp, dit zorgt ervoor dat alles doorgestuurd wordt in UTF-8. Indien je dit niet gaat dan dit problemen geven bij namen zoals Pierré. Test dus zeker en vast eens uw Ogone implementatie met speciale karakters.