iDEAL Advanced - Pronamic
iDEAL Advanced - Pronamic
iDEAL Advanced - Pronamic
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