Ogone – (SHA-1 IN & SHA-1 OUT)

08.30.2010 | 7:25 am | Code

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.

25 Comments »

  1. [...] This post was mentioned on Twitter by Pieter, Bart Hermans. Bart Hermans said: RT @Snakehit: Blogpost: Ogone – (SHA-1 IN & SHA-1 OUT) – http://tinyurl.com/33kbcy4 [...]

    Pingback by Tweets that mention Pieter blogt » Ogone – (SHA-1 IN & SHA-1 OUT) -- Topsy.com | 08.30.2010 | 8:45 am

  2. Nog een toevoeging aan de rant:
    De originele documentatie vlak na het omschakelen van SHA-calculatie was volledig gebrekkig: bij het voorbeeld van de SHA-out berekening werd de amount (in overeenstemming met amount bij SHA-in) ook * 100 gedaan. Bleek dit echter niet te kloppen (ik hoop dat de documentatie ondertussen is aangepast). Verder werkte het in eerste instantie ook niet eens wanneer alles correct werd uitgevoerd, maar heel toevallig werkte alles ineens wel wanneer we de support van Ogone hiervan op de hoogte brachten (een foutieve implementatie van hun kant dus).
    Wat is het toch een waar plezier om mee te werken! * kuch *

    Comment by mlitn | 08.30.2010 | 1:42 pm

  3. @mlitn: Die fout in hun documentatie zat/zit er nog steeds in. In de Nederlandstalige versie deden ze ook nog de amount in SHA-1 OUT x 100. In de Engelstalige was het gewoon het bedrag. Ik heb deze ook telefonisch gerapporteerd! Ze gingen het ook bekijken.

    Communicatie is er dus eigenlijk totaal niet geweest…

    Comment by Snakehit | 08.30.2010 | 1:49 pm

  4. Veelgemaakte fout, door mij althans, is om de SHA string niet te laten eindigen op de passwordkey. Dan kan je heel lang naar je string kijken, maar je ziet het niet.

    Comment by Rex | 09.15.2010 | 12:26 pm

  5. Ja inderdaad de documentatie van Ogone is slecht, het is veel en er staat onwijs veel nutteloze informatie in.

    Het toevoegen van die return URLs kan best lastig zijn, aangezien je er wel voor moet zorgen dat de URLs waar je de signature mee maakt, 100% overeen komen met de URLs die je in het form zet.

    Het is best een gedoe om die SHA sign strings goed te krijgen en te houden!

    Comment by Ron | 12.21.2010 | 5:40 pm

  6. Ron, inderdaad. Hun documentatie is inderdaad niet bij de beste, maar hun support team is wel goed. In plaats van te zoeken in de docs neem je beter vlug eventjes de telefoon en bel je naar hen. Je zal veel sneller geholpen zijn dan te beginnen zoeken in hun docs…

    Comment by Snakehit | 12.22.2010 | 4:36 pm

  7. Ook ik ben er in getrapt wat Rex aangeeft:”Veelgemaakte fout, door mij althans, is om de SHA string niet te laten eindigen op de passwordkey. Dan kan je heel lang naar je string kijken, maar je ziet het niet.”

    Ik had de string laten samenvoegen m.b.v. de PHP functie ‘implode’ en na lang zoeken ( want het werkte maar niet ) kwam ik hier terecht en zag ik dat de SHA string moet eindigen op de passwordkey.

    Rex, bedankt! En OGone: waarom staat dit niet in de documentatie?!

    Voor mijzelf heb ik de volgende SHA-1 string conditions maar even in de code gezet, zodat ik ze niet vergeet, misschien handig voor iemand anders:

    1. ALL PARAMETER NAMES IN CAPS
    2. ALPHABETIC ORDER OF PARAMETERS IN STRING
    3. FINAL SHA STRING MUST BE CAPITALIZE
    4. SWITCH CHARACTER ENCODING ( AT OGONE SIDE ) TO UTF-8
    5. parameters that do not have a value should NOT be included in the string to hash
    6. END YOUR COMBINE STRING WITH THE SHA KEY

    Comment by Mark | 01.21.2011 | 11:29 am

  8. Ook al bijna 2 dagen bezig met alleen het hash gedeelte. Wat een gedoe…

    Na alles 824 keer te hebben gecontroleerd (als ‘t niet meer is) heb ik maar eens geprobeerd m’n URLS te fixen.

    Er stonden namelijk &’s in mn URLs. Ik heb bij elke URL het gedeelte ‘amp;’ weggehaald en het hele rampje opnieuw getest..

    Eindelijk werkt ‘t!!

    Goed zo Ogone!!! (k*t asp).

    M’n ervaring met Ogone so far; zeer slecht.
    niet gebruiksvriendelijk, log, onduidelijk, langdradig, saai.

    Ik heb ook zitten schelden op iDeal Easy van ABN; Het is way-to-simple en niet helemaal duidelijk.
    Vergeleken met Ogone had ik dat in ieder geval binnen enkele uren up-and-running.

    Comment by Kozie | 01.21.2011 | 1:13 pm

  9. Persoonlijk vind ik de documentatie van Ogone ook niet goed, maar hun support team is wel goed. Als ik te lang moet zoeken in hun documentatie neem ik de telefoon en bel ik hen op, zij kunnen onmiddellijk zien wat het probleem is. Ze zouden eigenlijk gewoon een keer een héél eenvoudige start-up tutorial moeten maken met de best practices.

    Ik heb alvast in de blogpost ook nog eens duidelijk vermeld dat je op het einde van de SHA string ook nog de passkey moet toevoegen.

    Comment by Snakehit | 01.21.2011 | 4:47 pm

  10. Bedankt voor de post… zonder deze zat ik nog uren te priegelen aan die domme hash…

    Comment by eentje | 03.3.2011 | 11:37 am

  11. @eentje Geen probleem. We hebben er allemaal al uren op gezocht :-)

    Comment by Snakehit | 03.6.2011 | 2:24 pm

  12. Iets waar we gisteren achter gekomen zijn en waar je toch wel eventjes op kan vloeken (alweer :) )

    Als je alles doorstuurt in UTF-8 moet je niet posten naar de default url https://secure.ogone.com/ncol/test/orderstandard.asp maar naar https://secure.ogone.com/ncol/test/orderstandard_utf8.asp

    98% van de bestellingen zullen op de standaard url ook wel werken, maar van zodra er iemand bestelt met een accent in zijn naam of adres, loopt je bestelling vast. Ogone zal zijn SHA-IN anders interpreteren, waardoor je order niet gevalideerd wordt en ogone je de bekende ‘unknown order/1/s‘ geeft. René uit liège zal dus niks kunnen bestellen :-)

    Kwam toevallig bij het zoeken naar een oplossing hier uit dus ik dacht: ik geef het meteen eventjes mee :-)

    Comment by philicious | 03.24.2011 | 9:34 am

  13. Goed om te weten: alle(!) velden die je als hidden fields meegeeft moeten ook worden meegenomen in de hash (dus ook de language!). In mijn geval voor de ABN-Amro dus:

    <input type="hidden" name="SHASIGN" value="”>

    Comment by Wietse | 03.31.2011 | 11:00 am

  14. Mmm, blijf niet veel van mn post over… poging 2 (bedenk de html-tags er zelf even bij):

    – start php
    $sha1 = strtoupper(sha1(‘AMOUNT=MYAMOUNTMYSHA1INCURRENCY=EURMYSHA1INLANGUAGE=nl_NLMYSHA1INORDERID=MYORDERIDMYSHA1INPSPID=MYPSPIDMYSHA1IN’));
    – end php

    – start form
    form action=”https://internetkassa.abnamro.nl/ncol/test/orderstandard_utf8.asp” method=”post”>
    input type=”hidden” name=”PSPID” value=”MYPSPID”>
    input type=”hidden” name=”ORDERID” value=”MYORDERID”>
    input type=”hidden” name=”AMOUNT” value=”MYAMOUNT”>
    input type=”hidden” name=”CURRENCY” value=”EUR”>
    input type=”hidden” name=”LANGUAGE” value=”nl_NL”>
    input type=”hidden” name=”SHASIGN” value=”">
    input type=”submit” class=”input_button” value=”Start iDeal”>
    /form>
    – end form

    Comment by Wietse | 03.31.2011 | 11:02 am

  15. Ik ben nog niet lang met PHP bezig, en ben m’n eerste stappen aan het zetten met Ogone betalingen…
    Kan je me even duidelijk laten weten welke code ik dien te gebruiken om in php de volledige hash te genereren aan de hand van volgende variabelen die uit m’n originele invulformulier komen:

    $_POST["name"];
    $_POST["orderid"];
    $_POST["email"];
    $_POST["tel"];

    en eventuele anderen die ik zelf nog vergeten ben…?
    Heel erg bedankt!

    Comment by bram | 08.30.2011 | 11:32 am

  16. Nog vergeten, uiteraard nodig! :
    $_POST["amount"];

    :p

    Comment by bram | 08.30.2011 | 11:33 am

  17. Hey Bram,

    Met die code kan ik niet zo heel veel doen. Heb je geen specifiek geval? Desnoods mail me eens op info@minion.be met uw vraag dan kan ik deze beantwoorden.

    Pieter

    Comment by Snakehit | 08.30.2011 | 8:31 pm

  18. Hi,

    We (Marlon) hebben vandaag een open source Ogone PHP library gereleased op Github: https://github.com/marlon-be/marlon-ogone

    Hopelijk kan dit bovenstaande problemen met de soms onduidelijke Ogone documentatie vlot oplossen.

    Alle feedback is welkom.

    Groeten,
    Dieter

    Comment by Dieter | 09.2.2011 | 1:38 pm

  19. Heb het intussen uitgevist, en het werkt…

    Heb er uiteindelijk hetvolgende voor gedaan om de SHAsign te genereren:

    $sha_string = (‘AMOUNT=’.$amount.$shain.’CURRENCY=’.$currency.$shain.’LANGUAGE=’.$language.$shain.’ORDERID=’.$orderid.$shain.’PAYID=’.$payid.$shain.’PSPID=’.$pspid.$shain);

    $sha_signature = strtoupper (sha1 ($sha_string));

    Hierin is de $shain het SHA-IN key die je in de Ogone configuratie hebt ingevuld op je account pagina bij hen.

    Daar zat dan nog ergens een foutje in bij m’n eerste poging… had een paar variabelen door elkaar gekieperd… maar nu werkt het wel.

    Hopelijk helpt het bovenstaande nog andere mensen die met hetzelfde probleem worstelen?

    Toch bedankt voor alle hulp en info!

    Comment by bram | 09.2.2011 | 2:56 pm

  20. @Dieter: Ziet er heel goed uit! Misschien ergens nog iets maken dat je het onmiddellijk kan downloaden en unzippen en paar parameters invullen en alles werkt? Desnoods een test-betaling systeem opzetten.

    Anders mooi werk!

    Comment by Snakehit | 09.2.2011 | 3:58 pm

  21. @Pieter: Alle code downloaden kan je makkelijk doen vanaf Github (https://github.com/marlon-be/marlon-ogone/archives/master)

    We raden je echter aan de library aan je project te koppelen via GIT of SVN. Dit laat op termijn toe om veel makkelijker een nieuwe versie (een nieuwe tag) van de library te gebruiken in je project.

    Qua parameters zit alles in de API van de library verwerkt, dus daar kan je alles vlot in configureren.

    We plannen nog een specifieke post op onze blog met volledig uitgewerkte voorbeelden.

    Comment by Dieter | 09.2.2011 | 8:25 pm

  22. Hallo,

    Het documentatie is ondertussen verbeterd en up-to-date. Er komt met ons volgend release (nov 2011) nog een extra waarschuwing in verband met de SHA passphrase op het einde van de string to hash, blijkbaar een veelgemaakte fout.

    Indien jullie verder nog opmerkingen/vragen hebben ivm het documentatie mogen jullie altijd mailen naar: documentation@ogone.com

    Mvg,
    Hubert Vandermeersch
    Documentation Coordinator, Ogone.

    Comment by Hubert | 10.6.2011 | 2:17 pm

  23. ‘ons volgend release’, bedoel je daarmee: Ogone betalingsmanier release of puur de documentatie ervan?
    Kwestie van voorbereid te zijn, mochten er dingen veranderen in de versleuteling van gegevens en verificatie ervan…

    Comment by bram | 10.6.2011 | 2:19 pm

  24. documentatie alleen.

    op het betalingsplatform veranderd er niets in verband met SHA.

    Comment by Hubert | 10.6.2011 | 2:20 pm

  25. @Hubert: Bedankt voor je reactie! Blij te horen dat er toch opvolging komt van de mensen van Ogone.

    In plaats van de documentatie aan te passen moet je de foutmeldingen aanpassen in de testomgeving. Alle problemen staan hierboven beschreven, je kan deze perfect allemaal reproduceren en matchen. Is het niet beter om de foutmeldingen dan te gaan uitbreiden in de testomgeving met extra informatie, dan de documentatie te gaan herschrijven. Het is tenslotte toch maar een test-omgeving. Een error zoals ‘unknown order/0/s’ zegt niemand iets…

    Add-on: maak eens een goed werkend eenvoudig PHP voorbeeld van een Ogone implementatie. Met alle noodzakelijke features want dat is echt wel iets wat momenteel ontbreekt of onduidelijk is. Zet dat duidelijk in de docs dat je daar een voorbeeld kan downloaden, werk een systeem uit zoals PayPalX waar je stap voor stap je script kan configureren.

    Bijkomende vraag: wanneer krijgt het Ogone Controlpanel eens een update want dat is echt niet meer van deze tijd :-) .

    Comment by Snakehit | 10.6.2011 | 2:28 pm

 

Leave a comment