10.09.2013 Views

iDEAL Advanced - Pronamic

iDEAL Advanced - Pronamic

iDEAL Advanced - Pronamic

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

<strong>iDEAL</strong> <strong>Advanced</strong><br />

ING Wholesale Banking<br />

Integratiehandleiding PHP voor <strong>iDEAL</strong><br />

<strong>Advanced</strong><br />

Versie 2.3, april 2010<br />

Inhoud


<strong>iDEAL</strong> <strong>Advanced</strong> – Integratiehandleiding PHP<br />

Inhoud ........................................................................................................................................................ 1<br />

1 Introductie ........................................................................................................................................... 4<br />

1.1 Overzicht ................................................................................................................................. 4<br />

1.2 Verplichtingen.......................................................................................................................... 4<br />

1.3 Aanvullende vragen?............................................................................................................... 5<br />

1.4 Begrippen ................................................................................................................................ 5<br />

2 Veiligheid ............................................................................................................................................. 6<br />

3 Vereisten.............................................................................................................................................. 8<br />

3.1 Vereiste software..................................................................................................................... 8<br />

3.2 Vereiste instellingen ................................................................................................................ 9<br />

3.3 Algemene configuratie........................................................................................................... 10<br />

3.4 Certificaat van de acquirer .................................................................................................... 11<br />

3.5 Certificaat en sleutelpaar van de acceptant .......................................................................... 12<br />

4 Develo pment ..................................................................................................................................... 14<br />

4.1 Directory-verzoek (GetIssuerList) ......................................................................................... 14<br />

4.2 Transactieverzoek (RequestTransaction) ............................................................................. 16<br />

4.3 Statusverzoek (RequestTransactionStatus).......................................................................... 18<br />

4.4 Foutafhandeling..................................................................................................................... 21<br />

4.5 Proxy-servers ........................................................................................................................ 23<br />

5 Testen ................................................................................................................................................ 24<br />

5.1 Verplichte testen.................................................................................................................... 24<br />

6 Deployment ....................................................................................................................................... 25<br />

6.1 Hosting in eigen beheer ........................................................................................................ 25<br />

Copyright © ING. Versie 2.3, april 2010 Pag 2 van 26


<strong>iDEAL</strong> <strong>Advanced</strong> – Integratiehandleiding PHP<br />

6.2 Hosting bij een externe provider............................................................................................ 25<br />

APPENDIX A: Data catalogus ................................................................................................................ 26<br />

Copyright © ING. Versie 2.3, april 2010 Pag 3 van 26


<strong>iDEAL</strong> <strong>Advanced</strong> – Integratiehandleiding PHP<br />

1 Introductie<br />

Dit document is bestemd voor ontwikkelaars die verantwoordelijk zijn voor het integreren van<br />

<strong>iDEAL</strong> <strong>Advanced</strong> in een webwinkel via het ontwikkelplatform PHP.<br />

1.1 Overzicht<br />

Dit document beschrijft de volgende noodzakelijke stappen van het integratieproces:<br />

• Hoofdstuk 2, Veiligheid, gaat nader in op de veiligheidsaspecten van uw webshop.<br />

• Hoofdstuk 3, Vereisten, beschrijft de randvoorwaarden en noodzakelijke stappen vooraf<br />

(zoals het genereren van een eigen sleutelpaar voor de eigenaar van de webshop).<br />

• Hoofdstuk 4, Development, beschrijft de functionaliteit van <strong>iDEAL</strong> <strong>Advanced</strong> PHP, en hoe<br />

deze te integreren in de webshop.<br />

• Hoofdstuk 5, Testen, beschrijft de verplichte testen die moeten worden uitgevoerd<br />

voorafgaand aan in-productie-name van de webshop.<br />

• Hoofdstuk 6, Deployment, beschrijft enkele facetten rondom het in productie nemen van de<br />

webshop.<br />

Nota bene: Voor algemene informatie over <strong>iDEAL</strong> <strong>Advanced</strong> wordt verwezen naar het<br />

document ‘<strong>iDEAL</strong> Algemeen’. Voor integratie via een ander ontwikkelplatform voor <strong>iDEAL</strong><br />

<strong>Advanced</strong> wordt verwezen naar de integratiehandleiding voor .NET of de integratiehandleiding<br />

voor Java.<br />

1.2 Verplichtingen<br />

Het wordt ten zeerste aangeraden dit gehele document, alsmede het inleidende document ‘<strong>iDEAL</strong><br />

Algemeen’, te lezen voorafgaand aan de integratie van <strong>iDEAL</strong> <strong>Advanced</strong> in een webwinkel.<br />

Daarbij vragen wij speciale aandacht voor de volgende verantwoordelijkheden van de<br />

acceptant:<br />

- Beveiliging: Iedere <strong>iDEAL</strong> Acceptant is zelf verantwoordelijk voor de veilige opbouw van de<br />

eigen webshop. De door ING geleverde software, inclusief de <strong>iDEAL</strong> <strong>Advanced</strong> PHP<br />

Connector, is gebouwd op basis van alle gangbare security best practices. Onjuiste integratie<br />

kan echter desondanks leiden tot een onveilige webwinkel. Deze integratiehandleiding bevat<br />

een apart hoofdstuk (hoofdstuk 2) over veiligheidsaspecten. In de andere hoofdstukken zijn<br />

aanvullend praktische aanwijzingen opgenomen ten aanzien van de veiligheidsaspecten van<br />

uw webshop. Deze passages zijn in de regel herkenbaar aan het hangslotsymbool ().<br />

Copyright © ING. Versie 2.3, april 2010 Pag 4 van 26


<strong>iDEAL</strong> <strong>Advanced</strong> – Integratiehandleiding PHP<br />

- Haalplicht: Iedere <strong>iDEAL</strong> Acceptant dient te voldoen aan de zogenaamde ‘haalplicht’. Deze<br />

haalplicht houdt in dat u zelf verantwoordelijk bent voor het ophalen van de status van een<br />

transactie, voordat u overgaat tot leveren. Meer over de ‘haalplicht’ leest u in sectie 4.3.1.<br />

- Presentatie: Hulpmiddelen bij de presentatie van <strong>iDEAL</strong> op uw website kunt u vinden op het<br />

acceptantendeel van http://www.ideal.nl, zoals <strong>iDEAL</strong> logo’s en banners.<br />

- Testen: Na het voltooien van de integratie van <strong>iDEAL</strong> in uw webwinkel, bent u verplicht om<br />

een aantal testen uit te voeren. Deze worden beschreven in hoofdstuk 5 van dit document.<br />

- Voorbeeldcodes: In een aantal hoofdstukken van dit document worden ten behoeve van de<br />

integratie van <strong>iDEAL</strong> <strong>Advanced</strong> in uw systeem voorbeeldcodes gegeven. Deze codes dienen<br />

enkel en alleen ter illustratie. De inhoud van de daadwerkelijk door de <strong>iDEAL</strong> Acceptant te<br />

gebruiken codes dient door de <strong>iDEAL</strong> Acceptant zelf te worden vastgesteld. ING Bank N.V. is<br />

niet aansprakelijk voor schade, van welke aard dan ook, die de <strong>iDEAL</strong> Acceptant mocht lijden<br />

in verband met of ten gevolge van het gebruik van de voorbeeldcodes. De <strong>iDEAL</strong> Acceptant<br />

dient ING Bank N.V. te vrijwaren tegen mogelijke vorderingen van derden tot vergoeding van<br />

schade in verband met of als gevolg van het gebruik van de voorbeeldcodes door de <strong>iDEAL</strong><br />

Acceptant.<br />

1.3 Aanvullende vragen?<br />

- Vragen: Voor vragen of opmerkingen kunt u contact opnemen met de <strong>iDEAL</strong> service desk.<br />

Onze service desk is te bereiken tussen 09:00 en 17:00u via ideal@ing.nl of 09006522500 (€<br />

0,10 p.m.). U kunt ook een service ticket indienen via het <strong>iDEAL</strong> Dashboard. Het <strong>iDEAL</strong><br />

Dashboard bevat tevens een FAQ.<br />

- Illustratiecode: De download voor <strong>iDEAL</strong> <strong>Advanced</strong> PHP (beschikbaar via het <strong>iDEAL</strong><br />

Dashboard: https://ideal.secure-ing.com) bevat ook illustratiecode. Daarmee kunnen alle<br />

functies van de <strong>iDEAL</strong> <strong>Advanced</strong> PHP Connector in kale vorm worden gesimuleerd. Deze<br />

illustratiecode is uitdrukkelijk niet bedoeld als basis voor een complete webshop, maar dient<br />

louter als illustratie.<br />

1.4 Begrippen<br />

Het <strong>iDEAL</strong>-systeem is gebaseerd op bilaterale relaties binnen het zogenaamde ‘4-partijen’ model.<br />

De 4 betrokken partijen in dit model zijn:<br />

- De acceptant: de eigenaar van de webwinkel<br />

- De acquirer: de bankrelatie van de acceptant (ING)<br />

- De consument: de klant die een product wil kopen in de webwinkel van de acceptant<br />

- De issuer: de bankrelatie van de consument<br />

Copyright © ING. Versie 2.3, april 2010 Pag 5 van 26


<strong>iDEAL</strong> <strong>Advanced</strong> – Integratiehandleiding PHP<br />

2 Veiligheid<br />

Dit hoofdstuk gaat nader in op de veiligheidsaspecten van uw webshop. In de overige<br />

hoofdstukken van deze integratiehandleiding zijn verscheidene praktische veiligheidsaanwijzingen<br />

opgenomen, herkenbaar aan het symbool van een hangslotje ().<br />

Dit document pretendeert overigens geenszins volledig te zijn ten aanzien van de veiligheid van<br />

uw webwinkel. Dat is, gezien de omvang en complexiteit van het onderwerp, onmogelijk. Het doel<br />

van dit hoofdstuk en van de elders opgenomen aanwijzingen is met name om u bewust te maken<br />

van het onderwerp.<br />

In boekvorm en op het internet is in ruime mate documentatie voorhanden over de bedreigingen<br />

waaraan web applicaties bloot (kunnen) staan, en de te nemen preventieve en detectieve<br />

maatregelen om de eigen webshop daarvan te vrijwaren. Wij raden u met klem aan kennis te<br />

nemen van deze documentatie. Het succes van uw webshop is daarvan in hoge mate afhankelijk.<br />

De door ING geleverde software voor <strong>iDEAL</strong> <strong>Advanced</strong> PHP is gebouwd op basis van alle<br />

gangbare security best practices. Onjuiste integratie van deze software in uw webshop, en/of een<br />

onveilige opbouw van overige onderdelen van uw webshop, kunnen desondanks leiden tot een<br />

onveilige webwinkel.<br />

Veiligheid als procesonderdeel<br />

De eerste stap om dit te voorkomen, is het besef dat veiligheid alle stadia van het ontwikkelproces<br />

van uw webshop raakt:<br />

• Analyse & ontwerp: Reeds tijdens het ontwerpen van uw webshop dient u inzicht te verwerven<br />

in de voor uw webshop relevante bedreigingen, en daarop maatregelen te formuleren.<br />

• Development: Sommige code is per definitie onveilig. Veel van de beschikbare security<br />

documentatie bevat expliciete voorbeelden van onveilige code, alsmede de aangeraden<br />

vervanging ervan. Houd hier bij het bouwen van uw webshop rekening mee.<br />

• Testen: Onderkende bedreigingen, en de bijbehorende tegenmaatregelen, dienen uiteraard<br />

ook getest te worden. Hiervoor bestaande vele verschillende technieken en tools, variërend<br />

per ontwikkelplatform.<br />

• Deployment: Zorg er bij het deployen van uw webshop voor dat cruciale bestanden niet voor<br />

onbevoegden toegankelijk zijn. Denk hierbij bijvoorbeeld aan de configuratie van uw<br />

webshop, uw prive-sleutel, en uw database. Besteed hier extra aandacht aan als uw webshop<br />

niet door uzelf wordt gehost.<br />

OWASP<br />

De tweede stap op weg naar een veilige(re) webshop, is kennis te nemen van de eerder<br />

genoemde documentatie over de veiligheidsaspecten van web applicaties. Een goed startpunt<br />

hierbij is de website van het Open Web Application Security Project (OWASP), te vinden op<br />

www.owasp.org. De OWASP-site biedt uitgebreid inzicht in de kwetsbaarheden (vulnerabilities)<br />

van software, en de te nemen maatregelen (countermeasures).<br />

Copyright © ING. Versie 2.3, april 2010 Pag 6 van 26


<strong>iDEAL</strong> <strong>Advanced</strong> – Integratiehandleiding PHP<br />

Volgens OWASP zijn er meer dan 300 security issues die de veiligheid van web applicaties<br />

(kunnen) raken. Periodiek stelt OWASP hieruit een top 10 samen met de meest voorkomende<br />

kwetsbaarheden van web-applicaties. De nieuwste versie hiervan is de top 10 van 2007 1 .<br />

Ook stelt OWASP regelmatig nieuwe versies beschikbaar van een aantal belangwekkende<br />

documenten. De belangrijkste hiervan zijn:<br />

• De OWASP Guide: Beschrijft gedetailleerd hoe web applicaties en web services veiliger<br />

gemaakt kunnen worden. Dit wordt geïllustreerd met voorbeelden in J2EE, ASP.NET en PHP.<br />

2<br />

• De OWASP Testing Guide: Geeft een gedetailleerde beschrijving van een op security gericht<br />

testprogramma. 3<br />

• De OWASP AppSec FAQ: Een lijst met veelgestelde vragen over kwetsbaarheden en<br />

maatregelen. 4<br />

De OWASP-site kent verder specifieke pagina’s voor verscheidene ontwikkelplatforms, waaronder<br />

PHP 5 . Deze pagina’s gaan nader in op platform-specifieke security issues, inclusief onveilige<br />

code en beveiligingsmaatregelen.<br />

Nota bene: Denk in het kader van OWASP onder andere aan het volgende:<br />

• Controleer ALLE input, ongeacht de bron (acquirer, consument).<br />

• Controleer bij voorkeur op toegestane waarden (white listing) en niet op verboden waarden<br />

(black listing).<br />

• Bescherm uw database, onder andere door de database connection niet onnodig open te laten<br />

staan.<br />

• Bescherm uw privé-gegevens (zoals sleutels) door deze niet te bewaren op voor onbevoegden<br />

toegankelijke plaatsen<br />

• Verstuur nooit onversleutelde usernamen en passwords.<br />

1 Te vinden op http://www.owasp.org/index.php/Top_10_2007.<br />

2 Zie http://www.owasp.org/index.php/Category:OWASP_Guide_Project.<br />

3 Zie http://www.owasp.org/index.php/Category:OWASP_Testing_Project.<br />

4 Zie http://www.owasp.org/index.php/OWASP_AppSec_FAQ.<br />

5 Zie http://www.owasp.org/index.php/Category: PHP.<br />

Copyright © ING. Versie 2.3, april 2010 Pag 7 van 26


<strong>iDEAL</strong> <strong>Advanced</strong> – Integratiehandleiding PHP<br />

3 Vereisten<br />

Dit hoofdstuk beschrijft welke software, instellingen en configuratie vereist zijn voor een<br />

succesvolle integratie van <strong>iDEAL</strong> <strong>Advanced</strong> in het systeem van de acceptant, bij gebruikmaking<br />

van PHP als ontwikkelplatform.<br />

3.1 Vereiste software<br />

Een succesvolle integratie van <strong>iDEAL</strong> <strong>Advanced</strong> PHP in een webshop volgens de in dit document<br />

beschreven werkwijze vereist de volgende software:<br />

Voor ontwikkel- en configuratiedoeleinden:<br />

- Een ontwikkelomgeving voor PHP, bijvoorbeeld Eclipse voor PHP. Andere mogelijkheden zijn<br />

Adobe Dreamweaver of Zend Studio. De keuze hang af van de voorkeuren van de<br />

gebruiker/ontwikkelaar.<br />

- PHP vanaf versie 5.<br />

- Voor het genereren van het eigen certificaat/sleutelpaar:<br />

o OpenSSL implementatie voor Windows, te vinden op<br />

http://www.slproweb.com/products/Win32OpenSSL.html. Voor OpenSSL in het<br />

algemeen zie ook www.openssl.org. Paragraaf 3.5 van dit document beschrijft de<br />

stappen voor het maken van een eigen certificaat/sleutelpaar.<br />

o OpenSSL implementatie voor Linux, te vinden op<br />

http://www.devside.net/guides/linux/openssl met informatie over het installeren<br />

van OpenSSL onder Linux. Paragraaf 3.5 van dit document beschrijft de stappen<br />

voor het maken van een eigen certificaat/sleutelpaar.<br />

- De <strong>iDEAL</strong> <strong>Advanced</strong> PHP Connector, te verkrijgen via het <strong>iDEAL</strong> Dashboard, als onderdeel<br />

van het <strong>iDEAL</strong> <strong>Advanced</strong> Integration PHP package, te vinden onder de menu-optie<br />

Documentatie.<br />

In een Microsoft Windows test- en productie-omgeving:<br />

- Apache met SSL, zie voor meer informatie over Apache en PHP onder windows bijvoorbeeld<br />

http://www.html-site.nl/apache_php_mysql.php<br />

- of IIS met PHP ondersteuning, zie bijvoorbeeld http://nl3.php.net/install.windows<br />

- Het eigen PKCS#12-certificaat (inclusief het eigen private/public key pair) van de acceptant.<br />

Paragraaf 3.5 van dit document beschrijft de noodzakelijke stappen voor het genereren<br />

hiervan.<br />

- Het certificaat van het <strong>iDEAL</strong> Acquiring platform (<strong>iDEAL</strong>.cer). Te verkrijgen via het <strong>iDEAL</strong><br />

Dashboard. Zie paragraaf 0 voor details.<br />

- De <strong>iDEAL</strong> <strong>Advanced</strong> PHP Connector. Te verkrijgen via het <strong>iDEAL</strong> Dashboard, als onderdeel<br />

van het <strong>iDEAL</strong> <strong>Advanced</strong> Integration PHP package, te vinden onder de menu-optie<br />

Documentatie.<br />

Copyright © ING. Versie 2.3, april 2010 Pag 8 van 26


<strong>iDEAL</strong> <strong>Advanced</strong> – Integratiehandleiding PHP<br />

In een Linux test- en productie-omgeving:<br />

- Apache met SSL, zie voor meer informatie over Apache en PHP onder linux bijvoorbeeld<br />

http://dan.drydog.com/apache2php.html<br />

- Het eigen PKCS#12-certificaat (inclusief het eigen private/public key pair) van de acceptant.<br />

Paragraaf 3.5 van dit document beschrijft de noodzakelijke stappen voor het genereren<br />

hiervan.<br />

- Het certificaat van het <strong>iDEAL</strong> Acquiring platform (<strong>iDEAL</strong>.cer). Te verkrijgen via het <strong>iDEAL</strong><br />

Dashboard. Zie paragraaf 0 voor details.<br />

- De <strong>iDEAL</strong> <strong>Advanced</strong> PHP Connector. Te verkrijgen via het <strong>iDEAL</strong> Dashboard, als onderdeel<br />

van het <strong>iDEAL</strong> <strong>Advanced</strong> Integration PHP package, te vinden onder de menu-optie<br />

Documentatie.<br />

3.2 Vereiste instellingen<br />

- Internet-verkeer over poort 443 (SSL): Het moet mogelijk zijn om vanaf de webserver (waar<br />

de webshop op staat) een SSL-verbinding te maken naar de <strong>iDEAL</strong>-server van de acquirer.<br />

Deze verbindingen verlopen over poort 443.<br />

- Toegang tot een directory met specifieke lees- en schrijfrechten tijdens het installeren van de<br />

certificaten op de webserver.<br />

- Beveiligingsmaatregelen: PHP dient als volgt op de juiste wijze geconfigureerd te worden:<br />

o REGISTER_GLOBALS: Het wordt met klem aangeraden deze optie UIT te zetten.<br />

Indien deze optie aan staat, is het mogelijk dat gebruikers de applicatie beïnvloeden.<br />

Als REGISTER_GLOBALS aan staat kunnen variabelen direct vanuit de adresbalk<br />

van de browser gevuld worden. Hierdoor wordt het voor kwaadwillenden makkelijker<br />

om misbruik van het systeem te maken. Zie ook<br />

http://www.php.net/manual/nl/security.globals.php.<br />

o OPEN_BASEDIR: Hiermee kun je op folder-niveau aangeven waar PHP toegang tot<br />

heeft. Gebruik deze instelling om minimaal de folders met uw configuratie en uw<br />

sleutels af te schermen. Zie ook http://nl2.php.net/manual/en/features.safemode.php#ini.open-basedir<br />

o SAFE_MODE: Als deze optie aan staat wordt er gekeken of de permissies voor het<br />

bestandssysteem overeenkomen met de gebruiker die het bestandssysteem probeert<br />

te wijzigen/openen. Als SAFE_MODE aan staat dan houdt dat dus in dat PHP alleen<br />

bestanden kan bewerken/openen waar het ook daadwerkelijk toestemming voor heeft<br />

gekregen. Het wordt sterk aangeraden om deze optie AAN te zetten, ook als dat<br />

betekent dat u bepaalde functionaliteit van uw webshop anders dient te<br />

implementeren. Zie ook http://nl2.php.net/manual/en/features.safe-mode.php<br />

o DISPLAY_ERRORS: Deze optie bepaald of er foutmeldingen weergegeven mogen<br />

worden. Als de optie UIT staat wordt er bij het optreden van een fout alleen een witte<br />

pagina weergegeven. Het wordt sterk aangeraden om deze optie UIT te zetten, ook<br />

als dat betekent dat u bepaalde functionaliteit van uw webshop anders dient te<br />

implementeren, zodat er geen waardevolle informatie prijs gegeven wordt. Zie ook<br />

http://nl2.php.net/errorfunc<br />

Copyright © ING. Versie 2.3, april 2010 Pag 9 van 26


<strong>iDEAL</strong> <strong>Advanced</strong> – Integratiehandleiding PHP<br />

o ERROR_REPORTING: Deze optie bepaalt of en hoeveel waarschuwingen worden<br />

weergegeven op het moment dat er een fout optreed. Het wordt sterk aangeraden om<br />

deze optie UIT te zetten, ook als dat betekent dat u bepaalde functionaliteit van uw<br />

webshop anders dient te implementeren, zodat er geen waardevolle informatie prijs<br />

gegeven wordt. Zie ook http://nl2.php.net/errorfunc<br />

o EXPOSE_PHP: Deze optie bepaald of PHP mag aangeven dat het geïnstalleerd is op<br />

een webserver. Op het moment dat deze aan staat wordt bijvoorbeeld de signature<br />

van PHP toegevoegd aan de http-header van de webserver. Het wordt met klem<br />

aangeraden om deze optie in die de productie-omgeving UIT te zetten. Zie ook<br />

http://nl3.php.net/ini.core<br />

3.3 Algemene configuratie<br />

De volgende parameters dienen geconfigureerd te worden in het bestand config.conf:<br />

- MerchantID: het ID van de webshop, door de acceptant ontvangen tijdens het<br />

aanmeldproces<br />

- SubID: subID van de webshop, defaultwaarde = 0 (nul); alleen te wijzigen na overleg met de<br />

acquirer<br />

- MerchantReturnURL: URL van de pagina in de webshop waarnaar de consument wordt<br />

teruggeleid (‘redirect’) na een <strong>iDEAL</strong>-transactie. Deze waarde kan in de webshopimplementatie<br />

waar nodig worden overruled (zie paragraaf 4.2.2).<br />

- AcquirerURL: URL van de acquirer van de acceptant; voor ING gelden de volgende<br />

voorgeschreven waarden:<br />

• Testomgeving: https://idealtest.secure-ing.com/ideal/iDeal<br />

• Productie-omgeving: https://ideal.secure-ing.com/ideal/iDeal<br />

- AcquirerTimeout: aantal seconden (default = 10) dat er gewacht wordt op respons van de<br />

<strong>iDEAL</strong> services. Indien binnen die tijd geen respons komt, wordt een exception gegeven.<br />

- Privatecert: Organisatienaam van de acceptant zoals opgegeven tijdens de creatie van<br />

het eigen certificaat. Zie paragraaf 3.5 voor meer informatie over het certificaat van de<br />

acceptant.<br />

De instellingen in het config.conf bestand kunnen er bijvoorbeeld als volgt uitzien:<br />

Privatekey=priv.pem<br />

PrivatekeyPass=passwd<br />

Privatecert=cert.cer<br />

Certificate0=webserver.crt<br />

AcquirerURL=ssl://ideal.secure-ing.com:443/ideal/iDeal<br />

AcquirerTimeout=10<br />

MerchantID=005012345<br />

SubID=0<br />

Copyright © ING. Versie 2.3, april 2010 Pag 10 van 26


<strong>iDEAL</strong> <strong>Advanced</strong> – Integratiehandleiding PHP<br />

MerchantReturnURL=http://[yourwebpage]/StatReq.php<br />

ExpirationPeriod=PT10M<br />

LogFile=/Connector.log<br />

TraceLevel = DEBUG,ERROR<br />

In het bestand <strong>iDEAL</strong>Connector_config.inc.php dient het volgende aangepast te worden:<br />

- define( "SECURE_PATH", "%PATH%" );<br />

Hier dient op de plek van %PATH% het volledige pad naar de map te staan waarin het<br />

config.conf bestand en de private keys en certificates gevonden kunnen worden.<br />

Nota bene: Zet het configuratiebestand, encryptiesleutels en andere gevoelige informatie nooit<br />

in de document root van de webserver (www of www-root). Op die locatie zijn uw gegevens<br />

namelijk zeer makkelijk toegankelijk voor ongewenste bezoekers.<br />

Nota bene: Zet in de productie-omgeving NOOIT tracing aan. Dit kan zowel performance- als<br />

security-problemen opleveren!<br />

3.4 Certificaat van de acquirer<br />

<strong>iDEAL</strong> <strong>Advanced</strong> wordt geleverd met een certificaat van het <strong>iDEAL</strong> Acquiring systeem:<br />

ideal.cer. Dit certificaat bevat de public key van het <strong>iDEAL</strong> Acquiring platform, waarmee het<br />

mogelijk wordt om te controleren dat alle berichten daadwerkelijk door het <strong>iDEAL</strong> Acquiring<br />

platform van ING worden verstuurd.<br />

De volgende stappen dienen te worden doorlopen om het certificaat van het <strong>iDEAL</strong> Acquiring<br />

platform te installeren op het systeem van de acceptant:<br />

1. Kopieer het certificaat-bestand naar een afgebakende folder buiten de webroot.<br />

2. Geef uitsluitend het gebruikersaccount van de webserver rechten op dit certificaat; dit<br />

account heeft uitsluitend leesrechten nodig<br />

Nota bene: Plaats uw certificaat NIET in de webroot. De webroot is namelijk ook voor<br />

onbevoegden makkelijk te benaderen<br />

Nota bene: Dit certificaat dient uitsluitend als medium voor de publieke sleutel. Het maakt<br />

derhalve niet uit als de status volgens de certificaat-details Ongeldig is.<br />

Copyright © ING. Versie 2.3, april 2010 Pag 11 van 26


<strong>iDEAL</strong> <strong>Advanced</strong> – Integratiehandleiding PHP<br />

3.5 Certificaat en sleutelpaar van de acceptant<br />

De volgende stappen dienen te worden doorlopen om een eigen certificaat en sleutelpaar te<br />

genereren en activeren:<br />

1. Genereer een ‘RSA private key’ met het volgende commando (gebruik een zelfgekozen<br />

wachtwoord voor het veld eigenWachtwoord ):<br />

openssl genrsa –des3 –out priv.pem –passout pass:eigenWachtwoord 1024<br />

Het resultaat hiervan is de file priv.pem. PEM-files zijn bedoeld voor het opslaan van de<br />

private key en de public key. Het bestand wordt default opgeslagen in de bin directory onder<br />

de OpenSSL directory.<br />

Nota bene: Houd er rekening mee, dat het hier opgegeven wachtwoord ook benodigd is bij<br />

het installeren van het certificaat in de uiteindelijke hosting omgeving. Dit is mogelijk niet de<br />

eigen omgeving van de acceptant, maar die van een externe hosting provider. Maak daarom<br />

geen gebruik van een wachtwoord dat de acceptant gebruikt voor andere zakelijke of privédoeleinden.<br />

Nota bene: Gebruik in alle gevallen een sterk wachtwoord, want met dit certificaat kan een<br />

kwaadwillende zich voordoen als u ten opzichte van het acquiring-platform.<br />

2. Genereer een certificaat op basis van de ‘RSA private key’ (gebruik hetzelfde wachtwoord<br />

voor het veld eigenWachtwoord als in stap 2):<br />

openssl req –x509 –new –key priv.pem –passin pass:eigenWachtwoord<br />

–days 3650 –out cert.cer<br />

Dit commando leidt tot een reeks vragen over de aanvrager. Voer de juiste waarden in. Dit<br />

betreft onder andere de organisatienaam (“Organization Name”). Deze organisatienaam heeft<br />

u in enkele vervolgstappen nodig.<br />

Het resultaat is de file cert.cer. CER-files bevatten het certificaat en de public key. Het<br />

bestand wordt default opgeslagen in de bin directory onder de OpenSSL directory.<br />

3. Kopieer de private key en het certificaat naar dezelfde afgebakende folder als het configuratie<br />

bestand (zie paragraaf 3.3).<br />

4. Configureer de volgende parameters in het bestand config.conf; vervang daarbij de<br />

waarde voor PrivatekeyPass in het eigenWachtwoord dat u ook in stap 2 heeft gebruikt:<br />

Privatekey=priv.pem<br />

PrivatekeyPass=<br />

Privatecert=cert.cer<br />

5. Upload cert.cer op de testomgeving van het <strong>iDEAL</strong> Acquiring platform (via het <strong>iDEAL</strong><br />

Dashboard).<br />

Copyright © ING. Versie 2.3, april 2010 Pag 12 van 26


<strong>iDEAL</strong> <strong>Advanced</strong> – Integratiehandleiding PHP<br />

6. Na positieve verificatie door de <strong>iDEAL</strong> Service Desk (zie het hoofdstuk ‘Aanmeldproces’ van<br />

het document ‘<strong>iDEAL</strong> Algemeen’): Upload cert.cer op de productie-omgeving van het<br />

<strong>iDEAL</strong> Acquiring platform (via het <strong>iDEAL</strong> Dashboard).<br />

Nota bene: De aangemaakte bestanden priv.pem, cert.cer en config.conf bevatten geheime<br />

informatie (de private key en configuratiegegevens). Zorg ervoor dat deze bestanden niet voor<br />

anderen toegankelijk zijn en dus ook niet in de webroot van de webserver staan ( de www-root of<br />

www folder ).<br />

Aanbeveling: Om voor uzelf duidelijk onderscheid te kunnen maken tussen de productie- en de<br />

testomgeving van <strong>iDEAL</strong> is het aan te raden voor beide omgevingen een apart *.cer en *.p12<br />

bestand aan te maken.<br />

Copyright © ING. Versie 2.3, april 2010 Pag 13 van 26


<strong>iDEAL</strong> <strong>Advanced</strong> – Integratiehandleiding PHP<br />

4 Development<br />

Dit hoofdstuk beschrijft in detail hoe de <strong>iDEAL</strong>-protocollen geïntegreerd kunnen worden in een<br />

webshop. Binnen <strong>iDEAL</strong> wordt gebruik gemaakt van de volgende protocollen:<br />

- Directory-protocol: ophalen van de lijst van bij <strong>iDEAL</strong> aangesloten issuers. Hieruit kiest de<br />

consument (klant van de webshop) diens eigen bank. De <strong>iDEAL</strong> <strong>Advanced</strong> PHP Connector<br />

ondersteunt dit protocol via de functie GetIssuerList.<br />

- Betaalprotocol: starten en uitvoeren van een transactie, waarbij geld wordt overgemaakt van<br />

de door de consument gekozen issuer naar de acquirer van de acceptant. De <strong>iDEAL</strong><br />

<strong>Advanced</strong> PHP Connector ondersteunt dit protocol via de functie RequestTransaction.<br />

- Navraagprotocol: opvragen van de status van een transactie. Zie hiervoor o.a. de paragraaf<br />

over de Haalplicht (4.3.1). De <strong>iDEAL</strong> <strong>Advanced</strong> PHP Connector ondersteunt dit protocol via<br />

de functie RequestTransactionStatus.<br />

- Foutenprotocol: richtlijnen voor het verwerken van foutsituaties (zie hiervoor ook paragraaf<br />

2.5 van de <strong>iDEAL</strong> Referentiegids). De <strong>iDEAL</strong> <strong>Advanced</strong> PHP Connector ondersteunt dit<br />

protocol impliciet: elke foutsituatie wordt afgehandeld via een exception; in het geval van<br />

<strong>iDEAL</strong>-fouten is dat een IDealException. Elke IDealException omvat o.a. alle <strong>iDEAL</strong><br />

ErrorRes informatie, inclusief de consumerMessage.<br />

Nota bene: Indien tussen de webshop en de acquirer een proxy server aanwezig is, dienen<br />

speciale maatregelen genomen te worden. Zie hiervoor paragraaf 4.5.<br />

4.1 Directory-verzoek (GetIssuerList)<br />

Het Directory-verzoek, in de <strong>iDEAL</strong> <strong>Advanced</strong> Connector geïmplementeerd via GetIssuerList,<br />

zorgt ervoor dat de meest recente lijst van aangesloten Issuers (banken van consumenten) wordt<br />

opgehaald. Op basis van deze lijst dient in de webshop de keuzelijst met banken gevuld te<br />

worden. Hieruit kiest de consument vervolgens diens bank.<br />

Input<br />

Een aanroep van GetIssuerList vereist geen parameters.<br />

Resultaat<br />

Een aanroep van GetIssuerList kan twee resultaten opleveren:<br />

• Indien er geen fout optreedt, wordt een DirectoryResponse object teruggegeven dat de<br />

volgende elementen bevat:<br />

o IssuerShortList: De short list met de issuers met het grootste marktaandeel.<br />

o IssuerLongList: De long list met de overige issuers.<br />

Copyright © ING. Versie 2.3, april 2010 Pag 14 van 26


<strong>iDEAL</strong> <strong>Advanced</strong> – Integratiehandleiding PHP<br />

Paragraaf 4.3.1 van de Referentiegids beschrijft in detail hoe de issuers aan de consument<br />

gepresenteerd dienen te worden.<br />

• Indien er wel een fout optreedt wordt er een ander bericht teruggegeven. Zie meer hierover in<br />

paragraaf 4.4<br />

De voorbeeldcode voor de aanroep van GetIssuerList kan bijvoorbeeld als volgt zijn:<br />

$response = $<strong>iDEAL</strong>Connector>GetIssuerList();<br />

if ( ! $response ) {<br />

} else {<br />

}<br />

Periodiek aanroepen<br />

$errorCode = $response->getErrorCode();<br />

$errorMsg = $response->getErrorMessage();<br />

$consumerMessage = $response->getConsumerMessage();<br />

$IssuerList =& $response->getIssuerFullList();<br />

In de praktijk wijzigt de lijst van issuers slechts zelden. Het is daarom niet noodzakelijk bij elke<br />

transactie de functie GetIssuerList opnieuw aan te roepen. In plaats daarvan kan het resultaat<br />

periodiek worden opgehaald, en tussentijds gecached of opgeslagen. Aangeraden wordt de lijst in<br />

elk geval dagelijks op geldigheid te controleren en indien nodig te verversen. Daarbij kan het<br />

attribuut DateTimeStamp gebruikt worden om te controleren of de lijst is aangepast.<br />

De voorbeeldcode hiervoor kan er bijvoorbeeld als volgt uitzien, indien de issuerlijst tussentijds in<br />

de eigen webshop-database wordt vastgehouden:<br />

DateTime dirDateTime; // datetime stempel van GetIssuerList<br />

DateTime dbDateTime; // datetime stempel in eigen database<br />

// Voeg toe: aanroep GetIssuerList(), zie vorige voorbeeld<br />

$dirDateTime = $IssuerList->getDirectoryDateTimeStamp();<br />

$dbDateTime = // aanroep eigen functie voor opvragen dbDateTime<br />

if ( $dirDateTime > $dbDateTime )<br />

{<br />

}<br />

// Voeg toe: functionaliteit om de nieuwe lijst<br />

// op te slaan in de eigen database<br />

Copyright © ING. Versie 2.3, april 2010 Pag 15 van 26


<strong>iDEAL</strong> <strong>Advanced</strong> – Integratiehandleiding PHP<br />

Indien de issuer-lijst bij de acquirer wijzigt, is het raadzaam de lijst in de webshop daarop zo snel<br />

mogelijk aan te passen. Daarom is het aan te raden in de webshop functionaliteit in te bouwen<br />

waarmee de acceptant dit op elk gewenst moment kan doen.<br />

M.b.t. het aantal Directory-verzoeken geldt:<br />

• Maximaal 1 maal per 24 uur;<br />

• Geen Directory-verzoek voorafgaand aan iedere transactie.<br />

Nota bene: Paragraaf 2.2.1 van de Referentiegids geeft een overzicht van mogelijke fouten die<br />

kunnen optreden als de issuer-list binnen de webshop niet meer overeenstemt met de<br />

daadwerkelijke lijst.<br />

4.2 Transactieverzoek (RequestTransaction)<br />

Met het Transactieverzoek, geïmplementeerd via RequestTransaction, initieert u een <strong>iDEAL</strong>transactie.<br />

Alle hiervoor benodigde gegevens worden enerzijds afgeleid uit de door u aangeboden<br />

parameters, anderzijds impliciet door de connector uit de configuratiegegevens gehaald.<br />

Input<br />

Een aanroep van RequestTransaction vereist minstens 5 parameters:<br />

• IssuerId: het id van de issuer die de consument heeft gekozen uit de selectielijst<br />

• PurchaseId: het aankoopnummer volgens het systeem van de webwinkel<br />

• Amount: het bedrag in hele centen (geen decimalen; 1 euro = 100)<br />

• Description: de omschrijving van het produkt<br />

• EntranceCode: een door de webwinkel bepaalde code waarmee bij terugkeer in de<br />

webwinkel de aankoop geauthenticeerd kan worden (zie paragraaf 4.2.2 voor details).<br />

• (optioneel) ExpirationPeriod: indien anders dan de geconfigureerde waarde.<br />

• (optioneel) MerchantReturnURL: indien anders dan de geconfigureerde waarde.<br />

Nota bene: In de <strong>iDEAL</strong>-testomgeving wordt het resultaat van transacties bepaald door de<br />

waarde van het aangeboden amount. Gebruik bijvoorbeeld amount=100 om een succesvolle<br />

transactie te simuleren. Zie paragraaf 5.1 voor details.<br />

Nota bene: De appendix "Tekenset bij Interbancaire Uitwisseling" van de Referentiegids bevat<br />

een tabel met toegestane tekens. Overige tekens, zoals diakritische tekens, worden niet<br />

toegestaan. Bij gebruik van een teken buiten de afgesproken tekenset in properties van het<br />

Transaction-object (zoals Description, EntranceCode en PurchaseId) worden de tekens<br />

geconverteerd naar een equivalent dat wel in de tekenset voorkomt.<br />

Copyright © ING. Versie 2.3, april 2010 Pag 16 van 26


<strong>iDEAL</strong> <strong>Advanced</strong> – Integratiehandleiding PHP<br />

Resultaat<br />

Een aanroep van RequestTransaction kan in essentie twee resultaten opleveren:<br />

• Indien er geen fout optreedt, wordt een AcquirerTransactionResponse object<br />

teruggegeven dat de volgende elementen bevat:<br />

o AcquirerId: het ID van de acquirer.<br />

o TransactionId: unieke identificatie van de transactie zoals uitgegeven door de<br />

acquirer. Aangeraden wordt dit nummer ter ondersteuning voor de eigen administratie<br />

te koppelen aan het eigen aankoopnummer (PurchaseId).<br />

o IssuerAuthenticationURL: de volledige URL van de issuer (de bank van de<br />

consument). De webshop dient de consument automatisch naar deze URL te<br />

redirecten.<br />

• Indien er wel een fout optreedt wordt er een ander bericht teruggegeven. Zie meer hierover in<br />

paragraaf 4.4<br />

4.2.1 Redirect naar de issuer<br />

Nadat het Transactieverzoek succesvol is geïnitieerd, wordt de consument via een redirect<br />

doorgestuurd naar zijn eigen internetbankier-omgeving. De URL waarop de issuer de consument<br />

verwacht wordt meegestuurd in het antwoord op het Transactieverzoek. Met behulp van de<br />

volgende voorbeeldcode wordt de consument doorgestuurd naar de issuer:<br />

Nota bene: De Referentiegids bepaalt dat de acceptant voorafgaand aan de redirect de URL<br />

dient te valideren, waarbij o.a. gecontroleerd moet worden dat deze geen scripting bevat. De<br />

<strong>iDEAL</strong> <strong>Advanced</strong> Connector voert deze URL-controle automatisch uit.<br />

$connector = new <strong>iDEAL</strong>Connector();<br />

// voeg parameters toe<br />

$response = $connector->RequestTransaction( . . . );<br />

// voeg fout controle toe<br />

$url = $response->getIssuerAuthenticationURL();<br />

header("Location: " . $url );<br />

Nota bene: De <strong>iDEAL</strong> Referentiegids stelt als regel, dat de redirect naar de issuer binnen het<br />

browserwindow moet plaatsvinden waarin de consument op de Betaalknop heeft gedrukt. Daarbij<br />

moet de volledige pagina van de acceptant vervangen worden door de volledige pagina van de<br />

gekozen issuer. Het gebruik van een tweede browserwindow (pop-ups) of frames is dus niet<br />

toegestaan.<br />

Copyright © ING. Versie 2.3, april 2010 Pag 17 van 26


<strong>iDEAL</strong> <strong>Advanced</strong> – Integratiehandleiding PHP<br />

4.2.2 Redirect naar de webshop<br />

Na de betaling (succesvol of niet) via internetbankieren wordt de consument automatisch terug<br />

geleid naar de webshop van de acceptant, via de URL die als waarde van merchantReturnURL<br />

is geconfigureerd. 6<br />

Validatie<br />

De return-URL bevat automatisch de entranceCode en het transactionId van de transactie.<br />

De entranceCode is initieel door de acceptant meegegeven als parameter van het<br />

Betaalprotocol, en kan nu (in combinatie met het transactie id) gebruikt worden om de consument<br />

te ‘authenticeren’ als degene voor wie de transactie ook is gestart.<br />

Nota bene: Het wordt aangeraden om deze validatie altijd uit te voeren. Houd daarbij rekening<br />

met de vereiste minimale variatie van de entranceCode, zoals bepaald in 3.3.1 van de<br />

Referentiegids.<br />

Vervolgens zal de webshop de status van de transactie opvragen. Gebruik hiervoor de functie<br />

RequestTransactionStatus (zie volgende paragraaf).<br />

4.3 Statusverzoek (RequestTransactionStatus)<br />

Na het uitvoeren van een betaalopdracht, dient de webshop in alle gevallen zelf de status van de<br />

transactie op te vragen via het zogenaamde Navraagprotocol van <strong>iDEAL</strong>. Dit protocol is in de<br />

<strong>iDEAL</strong> <strong>Advanced</strong> connector geïmplementeerd via de functie RequestTransactionStatus.<br />

Input<br />

Een aanroep van RequestTransactionStatus vereist als parameter uitsluitend het<br />

TransactionId van de te controleren transactie.<br />

Resultaat<br />

Een aanroep van RequestTransactionStatus kan in essentie twee resultaten opleveren:<br />

• Indien er geen fout optreedt, wordt een AcquirerStatusResponse object teruggegeven<br />

dat de volgende elementen bevat:<br />

o AcquirerId: het ID van de acquirer.<br />

o TransactionId: het ID van de transactie.<br />

6 Indien voor speciale gevallen een andere URL gewenst is, kan de in configuratie opgegeven URL worden overruled door<br />

de merchantReturnURL property van de Connector (tijdelijk) aan te passen.<br />

Copyright © ING. Versie 2.3, april 2010 Pag 18 van 26


<strong>iDEAL</strong> <strong>Advanced</strong> – Integratiehandleiding PHP<br />

o Status: de status van de transactie.<br />

o Indien de transactie is geslaagd (status=Success), worden ook de gegevens van de<br />

consument verstrekt, te weten diens ConsumerAccountNumber, ConsumerName,<br />

en ConsumerCity.<br />

• Indien er wel een fout optreedt wordt er een ander bericht teruggegeven. Zie meer hierover in<br />

paragraaf 4.4<br />

De voorbeeldcode voor de aanroep van RequestTransactionStatus kan bijvoorbeeld als<br />

volgt zijn:<br />

$response = $connector->RequestTransactionStatus( $transactionId );<br />

if ( ! $response ) {<br />

$errorCode = $response->getErrorCode();<br />

$errorMsg = $response->getErrorMessage();<br />

$consumerMessage = $response->getConsumerMessage();<br />

// Voeg toe: tonen van de consumerMessage<br />

} else {<br />

$status =& $response->getStatus();<br />

if ( $status === IDEAL_TX_STATUS_SUCCESS ) {<br />

$consumerName = $response->getConsumerName();<br />

$consumerAccNumber = $response->getConsumerAccountNumber();<br />

}<br />

}<br />

Transactie gelukt<br />

$consumerCity = $response->getConsumerCity();<br />

Paragraaf 2.3.1 van de Referentiegids beschrijft de mogelijke statussen die kunnen worden<br />

geretourneerd door RequestTransactionStatus. Uitsluitend de status Success betekent dat<br />

de transactie is geslaagd, en dat tot levering moet worden overgegaan.<br />

Nota bene: Indien de acceptant gebruik maakt van <strong>iDEAL</strong>-reconciliatie, dan toont het <strong>iDEAL</strong><br />

Dashboard naast de status 003 (Succes) ook de vervolgstatussen 007 (gereconcilieerd) en 009<br />

(uitbetaald). Ook die statussen duiden op een succesvolle transactie. Via<br />

RequestTransactionStatus zult u in alle gevallen de status Success terugkrijgen; 003, 007<br />

en 009 kunt u niet langs programmatische weg van elkaar onderscheiden. Meer informatie over<br />

reconciliatie is te vinden op het <strong>iDEAL</strong> Dashboard.<br />

Status niet bekend<br />

Houd er bij de implementatie rekening mee dat een consument ervoor kan kiezen de browser<br />

tijdens, of direct na het uitvoeren van de betaling te sluiten.<br />

Copyright © ING. Versie 2.3, april 2010 Pag 19 van 26


<strong>iDEAL</strong> <strong>Advanced</strong> – Integratiehandleiding PHP<br />

In zo’n geval wordt niet automatisch teruggekeerd naar de webshop, en wordt dus ook niet<br />

automatisch de status van de transactie opgevraagd. Indien de webshop niet op deze situatie is<br />

ingericht, kan het voorkomen dat een consument een betaling verricht maar geen produkt<br />

ontvangt omdat de transactiestatus voor de acceptant op ‘open’ blijft staan.<br />

Dit is niet alleen onwenselijk, maar staat ook haaks op de ‘haalplicht’ van de acceptant. De<br />

volgende paragraaf gaat nader in op deze ‘haalplicht’ en mogelijke oplossingen van de geschetste<br />

problematiek.<br />

M.b.t. het aantal Statusverzoeken per transactie geldt:<br />

• Maximaal vijf maal per transactie;<br />

• Maximaal twee maal binnen de expirationPeriod;<br />

• Buiten de expirationPeriod niet vaker dan eens per 60 minuten;<br />

• Geen Statusverzoek nadat een eindstatus is ontvangen voor een transactie;<br />

• Geen Statusverzoek voor transacties ouder dan 7 dagen.<br />

Voorbeelden van mogelijke momenten waarop een Statusverzoek kan worden uitgevoerd:<br />

• 30 seconden na het verzenden van een Transactieverzoek;<br />

• Halverwege een expirationPeriod;<br />

• Net na een expirationPeriod;<br />

• Na een bepaalde tijd (max. 1 uur) na afloop van de expirationPeriod.<br />

Normaal gesproken zou vrij kort na het verstrijken van de expiration period één van de<br />

eindstatussen teruggegeven moeten worden. Als het teruggegeven resultaat “Open” enige tijd na<br />

de expiration period nog steeds wordt teruggegeven is er sprake van een storing. Als deze storing<br />

niet binnen 1 dag is opgelost raadpleeg dan de <strong>iDEAL</strong> Dashboard en neem eventueel contact op<br />

met de <strong>iDEAL</strong> service desk in plaats van StatusRequests te blijven versturen.<br />

4.3.1 Haalplicht<br />

De acceptant heeft een zogenaamde haalplicht ten aanzien van het status van een transactie. Dit<br />

betekent dat een acceptant zelf verantwoordelijk is voor het ophalen van een definitieve status<br />

van een transactie, ook als de consument niet wordt teruggeleid naar de webwinkel na het (al dan<br />

niet) betalen van de transactie. Dit laatste kan gebeuren doordat de klant voortijdig het browser<br />

venster afsluit.<br />

Copyright © ING. Versie 2.3, april 2010 Pag 20 van 26


<strong>iDEAL</strong> <strong>Advanced</strong> – Integratiehandleiding PHP<br />

Als de status van een transactie niet bekend is, of gelijk is aan Open, staan de volgende<br />

mogelijkheden tot uw beschikking om de status alsnog op te halen:<br />

- ‘Handmatig’ een statusverzoek uitvoeren voor een bepaald transactionID. Dit vereist het<br />

implementeren van functionaliteit in de webshop waarmee de acceptant in staat is als een<br />

losstaande handeling een statusverzoek te starten voor een op te geven transactionId.<br />

Nota bene: Functionaliteit die uitsluitend bedoeld is voor de eigenaar van de webshop,<br />

en niet voor consumenten, dient zodanig te worden geïmplementeerd dat onbevoegden<br />

deze functionaliteit noch rechtstreeks, noch indirect kunnen starten. Hiertoe dient een<br />

adequaat autorisatiemechanisme te worden geïmplementeerd.<br />

- Geautomatiseerd periodiek statusverzoeken uitvoeren voor alle nog niet afgehandelde<br />

transacties. Hierbij gelden dezelfde richtlijnen als voor het ‘handmatig’ ophalen van één<br />

transactiestatus.<br />

- Automatisch een statusverzoek uitvoeren nadat de expirationPeriod is verlopen. Zie<br />

hiervoor ook de laatste pagina van paragraaf 3.3.1 van de Referentiegids.<br />

- Inloggen in het <strong>iDEAL</strong> Dashboard, de betaling opzoeken en de status opvragen middels de<br />

‘Status request-knop’.<br />

Voorbeeld<br />

Een webwinkel die vliegtickets verkoopt, reserveert een ticket bij iedere potentiële aankoop voor<br />

een periode van 15 minuten. Binnen deze periode dient een consument een vliegticket aan te<br />

schaffen. Zo niet, dan wordt het ticket weer vrijgegeven voor verkoop aan andere consumenten.<br />

Indien de consument binnen 5 minuten via IDEAL een vliegticket koopt, maar het browser-venster<br />

na de betaling bij zijn internetbankier afsluit, dan wordt hij niet teruggeleid naar de webwinkel. De<br />

webwinkel krijgt nu geen signaal dat de betaling voldaan is en zal na 15 minuten het vliegticket<br />

vrijgeven, terwijl de consument wel degelijk heeft betaald!<br />

Om dit te voorkomen, dienen in de webwinkel maatregelen te worden genomen, bijvoorbeeld door<br />

het implementeren van een aan een timer gekoppelde navraagfunctie. De webwinkel zou dan (in<br />

dit specifieke voorbeeld) gebruik kunnen maken van een expirationPeriod van bijvoorbeeld<br />

10 minuten (hetgeen betekent dat een consument maximaal 10 minuten over een <strong>iDEAL</strong>transactie<br />

mag doen; daarna krijgt de transactie automatisch de status expired; verlopen). Als<br />

een consument dan na de gedefinieerde vervalperiode van 10 minuten nog niet is teruggekeerd<br />

naar de webshop, dan zal de zelfgebouwde navraagfunctie automatisch een statusverzoek doen,<br />

om zodoende ruim voor de reserveringsperiode van 15 minuten te kunnen beschikken over een<br />

definitieve status.<br />

4.4 Foutafhandeling<br />

Indien een fout optreedt in het berichtenverkeer tussen acceptant, acquirer en/of issuer wordt door<br />

de <strong>iDEAL</strong> <strong>Advanced</strong> Connector een ander bericht teruggegeven. Om te kijken of er een fout is<br />

opgetreden dient u na het ophalen van een response te controleren of er een fout is opgetreden<br />

door het aanroepen van de volgende functie:<br />

Copyright © ING. Versie 2.3, april 2010 Pag 21 van 26


<strong>iDEAL</strong> <strong>Advanced</strong> – Integratiehandleiding PHP<br />

if (response->IsErrorMessage())<br />

{<br />

}<br />

...<br />

Als er een fout is opgetreden zal ‘true’ teruggegeven worden door de functie IsErrorMessage() en<br />

in het navolgende codeblok kan de fout afgehandeld worden met de volgende constructie:<br />

if ($response->IsErrorMessage())<br />

{<br />

}<br />

$errorCode = $response->getErrorCode();<br />

$errorMsg = $response->getErrorMessage();<br />

$consumerMessage = $response->getConsumerMessage();<br />

In deze variabelen zullen dan achtereenvolgens de foutcode, het foutbericht van <strong>iDEAL</strong> en het<br />

foutbericht voor de gebruiker getoond worden.<br />

Paragraaf 2.5.2 van de Referentiegids verplicht de acceptant ertoe aan de consument uitsluitend<br />

de consumerMessage uit dit object te tonen. Ter ondersteuning hiervan zorgt de <strong>iDEAL</strong><br />

<strong>Advanced</strong> Connector ervoor dat het veld consumerMessage altijd is gevuld (hetzij met de door<br />

de acquirer doorgegeven waarde, hetzij met de verplichte teksten uit tabel 16 van de<br />

Referentiegids).<br />

De voorbeeldcode voor het tonen van de juiste foutboodschap aan de consument kan er daardoor<br />

bijvoorbeeld als volgt uitzien:<br />

}<br />

$response = $connector->xxxx();<br />

if ($response->IsErrorMessage())<br />

{<br />

$errorCode = $response->getErrorCode();<br />

$errorMsg = $response->getErrorMessage();<br />

$consumerMessage = $response->getConsumerMessage();<br />

// voeg toe: Tonen van $consumerMessage op scherm<br />

waarbij “xxxx” een willekeurige functie voorstelt.<br />

Copyright © ING. Versie 2.3, april 2010 Pag 22 van 26


<strong>iDEAL</strong> <strong>Advanced</strong> – Integratiehandleiding PHP<br />

4.5 Proxy-servers<br />

Indien tussen de webshop en de site van de acquirer een proxy server aanwezig is, dan kan dat<br />

betekenen dat als onderdeel van de communicatie moet worden ingelogd op de proxy server.<br />

Daartoe dient in de webshop functionaliteit te worden geïmplementeerd die een gebruikersnaam<br />

en wachtwoord meegeeft.<br />

Nota bene: Opslaan van de gebruikersnaam en het wachtwoord voor de proxy server dient op<br />

een veilige manier te gebeuren. Indien deze gegevens in een configuratiebestand worden<br />

opgeslagen moet dit bestand opgeslagen worden in een beveiligde folder, die alleen toegankelijk<br />

is voor PHP<br />

Copyright © ING. Versie 2.3, april 2010 Pag 23 van 26


<strong>iDEAL</strong> <strong>Advanced</strong> – Integratiehandleiding PHP<br />

5 Testen<br />

Dit hoofdstuk beschrijft alle verplichte testen die moeten worden uitgevoerd voordat een webshop<br />

met <strong>iDEAL</strong> <strong>Advanced</strong> integratie in productie genomen kan worden. Aanvullend dient uiteraard ook<br />

de overige functionaliteit van uw webshop getest te worden. Dat valt echter buiten de scope van<br />

dit document.<br />

5.1 Verplichte testen<br />

De verplichte testen zijn functioneel beschreven in het hoofdstuk Aanmeldproces van de<br />

algemene documentatie van <strong>iDEAL</strong> <strong>Advanced</strong>. Het betreft zeven testen, allen uit te voeren op de<br />

testomgeving van <strong>iDEAL</strong> (https://idealtest.secure-ing.com).<br />

Voorafgaand aan het testen dient het volgende gecontroleerd te worden:<br />

• In het config.conf bestand dient privateCert gedefinieerd te zijn, met als waarde de<br />

organisatienaam die is opgegeven bij het creëren van het eigen certificaat van de acceptant<br />

(via de stappen in paragraaf 3.5 van dit document).<br />

• Het eigen certificaat (cert.cer) dient geupload te zijn naar de <strong>iDEAL</strong> testomgeving.<br />

Het uitvoeren van de testen gaat daarna als volgt:<br />

1. De acceptant logt in op de testomgeving van <strong>iDEAL</strong>, onder gebruikmaking van de tijdens het<br />

aanmeldproces verkregen gebruikersnaam en wachtwoord.<br />

2. De acceptant verzendt 7 testopdrachten naar de URL van de <strong>iDEAL</strong> testomgeving<br />

(https://idealtest.secure-ing.com/ideal/iDeal). De testomgeving geeft daarbij de volgende<br />

voorgeprogrammeerde resultaten terug:<br />

Opdracht Verwacht resultaat in geval van juiste integratie<br />

Transactie met amount = 100: Success<br />

Transactie met amount = 200: Cancelled<br />

Transactie met amount = 300: Expired<br />

Transactie met amount = 400: Open<br />

Transactie met amount = 500: Failure<br />

Transactie met amount = 700: SO1000 Failure in system<br />

Directory Request (GetIssuerList) Issuer Simulator<br />

3. De acceptant controleert de verkregen resultaten.<br />

Nota bene: Testresultaten worden ter verificatie enkele malen per dag automatisch verstuurd<br />

naar <strong>iDEAL</strong>. Positieve verificatie van de testresultaten is noodzakelijk voor het activeren van<br />

<strong>iDEAL</strong> in de productie-omgeving. Activatie dient te worden uitgevoerd door de acceptant, via het<br />

<strong>iDEAL</strong> Dashboard. Dat is mogelijk vanaf de eerstvolgende dag.<br />

Copyright © ING. Versie 2.3, april 2010 Pag 24 van 26


<strong>iDEAL</strong> <strong>Advanced</strong> – Integratiehandleiding PHP<br />

6 Deployment<br />

Dit hoofdstuk beschrijft enkele aspecten van het deployen van een webshop met <strong>iDEAL</strong> <strong>Advanced</strong><br />

integratie. Een volledige beschrijving van alle mogelijke deployment-scenario’s valt buiten de<br />

scope van dit document.<br />

6.1 Hosting in eigen beheer<br />

Controleer vooraf dat uw eigen omgeving voldoet aan alle voor <strong>iDEAL</strong> <strong>Advanced</strong> gestelde<br />

voorwaarden (zoals beschreven in hoofdstuk 3).<br />

Controleer na deployment nadrukkelijk dat alle onderdelen van uw site afdoende zijn afgeschermd<br />

voor onbevoegden. Denk bijvoorbeeld aan de configuratie, uw database, en eventuele pagina’s<br />

die uitsluitend voor u bestemd zijn.<br />

6.2 Hosting bij een externe provider<br />

Indien hosting geschiedt bij een externe provider dient nadrukkelijk rekening gehouden te worden<br />

met de privacy-aspecten van uw webshop. Denk daarbij met name aan uw private key (zie<br />

paragraaf 3.5).<br />

Controleer vooraf ook dat de hosting provider voldoet aan alle voor <strong>iDEAL</strong> <strong>Advanced</strong> gestelde<br />

voorwaarden (zoals beschreven in hoofdstuk 3).<br />

Controleer na deployment nadrukkelijk dat alle onderdelen van uw site afdoende zijn afgeschermd<br />

voor onbevoegden. Denk bijvoorbeeld aan de configuratie, uw database, en eventuele pagina’s<br />

die uitsluitend voor u bestemd zijn.<br />

Copyright © ING. Versie 2.3, april 2010 Pag 25 van 26


<strong>iDEAL</strong> <strong>Advanced</strong> – Integratiehandleiding PHP<br />

APPENDIX A: Data catalogus<br />

Parameter Formaat Omschrijving<br />

issuerID PN..4 ID van de bank van de consument<br />

merchantID PN..9 Uw merchantID wordt verstrekt tijdens het aanmeldproces.<br />

subID N..max6 Default waarde = 0 (nul)<br />

authenticationType AN..max40 Vaste waarde = SHA1_RSA<br />

merchantReturnURL AN..max512 URL op het systeem van de acceptant waar de klant naar toe geleid wordt<br />

(‘redirect’) na de betaling in de internetbankier-omgeving.<br />

N.B. Deze pagina dient het Statusverzoek uit te voeren.<br />

purchaseID AN..max16 Uniek ordernummer van de webwinkel (bepaald door acceptant)<br />

amount N..max12 Totaal transactiebedrag in hele eurocenten<br />

N.B. Merk op dat op de testomgeving het resultaat van een transactie wordt<br />

beïnvloed door het transactiebedrag. Zie sectie 5.1 voor details.<br />

currency AN3 Vaste waarde = EUR (op dit moment wordt alleen de Euro ondersteund)<br />

expirationPeriod RDT Periode waarbinnen de <strong>iDEAL</strong>-transactie plaats mag vinden. Notatie PT1H<br />

voor 1 uur, PT10M voor 10 minuten. Maximale waarde: 1 uur. Minimale<br />

waarde: 1 minuut. Voorgestelde waarde: 10 minuten.<br />

language CL..2 Vaste waarde = nl (op dit moment wordt alleen Nederlands ondersteund)<br />

description AN..max32 Omschrijving van de order (bepaald door acceptant)<br />

entranceCode ANS..max40 Code bepaald door acceptant. Deze code maakt het mogelijk de consument<br />

te relateren aan een bepaalde transactie bij het terugkeren van de<br />

consument naar de webwinkel na de betaling. De entranceCode wordt<br />

middels HTTP(S) GET verstuurd naar de merchantReturnURL.<br />

acquirerURL n/a URL waar de <strong>iDEAL</strong>-verzoeken naar verzonden dienen te worden.<br />

Test omgeving: https://idealtest.secure-ing.com/ideal/iDeal<br />

Productie omgeving: https://ideal.secure-ing.com/ideal/iDeal<br />

Formaat Omschrijving<br />

AN Alfanumeriek, vrije tekst<br />

ANS Alfanumeriek strikt (alleen letters en cijfers)<br />

N Numeriek<br />

PN Numeriek (padded), inhoud wordt aangevuld tot maximale lengte met voorloopnullen<br />

..23 Maximum aantal posities voor alfanumerieke en numerieke waarden<br />

CL Code lijst<br />

RDT Relatieve datum-tijd veld: PnYnMnDTnHnMnS<br />

Parameters gerelateerd aan het certificaat:<br />

Parameter Omschrijving<br />

privateCert Organisatienaam die is opgegeven bij het genereren van het eigen<br />

certificaat. Zie sectie 3.5 voor details.<br />

Copyright © ING. Versie 2.3, april 2010 Pag 26 van 26

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!