Hallo,

Ik onderhoud een site en moet nu zorgen voor een bevestiging mail plus een insert query die alle gegevens opslaat in de database.
Bij het testen werkt de betaling wel alleen de mail en de query worden niet uitgevoerd.
Heb niet veel ervaring met ideal dus misschien zit ik bij het verkeerde eind.

De ideal code is door een andere programmeur zeer slordig geprogrammeerd en doordat er nogal haast achter zit heb ik dit nog niet geoptimaliseerd.

De code
_____________________________________
<?php
if(isset($_GET['ec']) && isset($_GET['trxid'])){
// 000000 OK betekent succesvol. We kunnen het product leveren
if(($status = CheckReturnurl( $rtlo, $_GET['trxid'] ))=="000000 OK" )
{
echo $_SESSION['voornaam']."<br>";
echo $_SESSION['achternaam']."<br>";
echo $_SESSION['tel_nummer']."<br>";
echo $_SESSION['email']."<br>";
echo $_SESSION['id']."<br>";
echo $_SESSION['prijs']."<br>";
echo $_SESSION['numberDays']."<br>";
echo $_SESSION['personen']."<br>";
echo $_SESSION['checkin']."<br>";
echo $_SESSION['checkout']."<br>";
echo $_SESSION['aanhef']."<br>";
echo $_SESSION['adres']."<br>";
echo $_SESSION['postcode']."<br>";
echo $_SESSION['woonplaats']."<br>";
echo $_SESSION['totaalprijs']."<br>";
echo $_SESSION['res_nummer']."<br>";
echo $_SESSION['reisideal']."<br>";
echo $_SESSION['annuleerideal']."<br>";


//$stmt = $connect->prepare("INSERT INTO reservering (ip, reserveringsnummer, aanhef, adres, postcode, woonplaats, user_id, naam, achternaam, telnummer, email, huis_id, prijs, reis, annuleer, dagen, personen, checkin, checkout, datum) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?, NOW())");
//$stmt->bind_param('sssssssssssssssss', $ip, $_SESSION['res_nummer'], $_SESSION['aanhef'], $_SESSION['adres'], $_SESSION['postcode'], $_SESSION['woonplaats'], $_SESSION['user_id'], $_SESSION['voornaam'], $_SESSION['achternaam'], $_SESSION['tel_nummer'], $_SESSION['email'], $_SESSION['id'], $_SESSION['totaalprijs'], $_SESSION['reisideal'], $_SESSION['annuleerideal'], $_SESSION['numberDays'], $_SESSION['personen'], $_SESSION['checkin'], $_SESSION['checkout']);
//$stmt->execute();
$stmt = $connect->prepare("INSERT INTO reservering (ip, reserveringsnummer, aanhef, adres, postcode, woonplaats, user_id, naam, achternaam, telnummer, email, huis_id, prijs, reis, annuleer, dagen, personen, checkin, checkout, datum)
VALUES (:ip, :reserveringsnummer, :aanhef, :adres, :postcode, :woonplaats, :user_id, :naam, :achternaam, :telnummer, :email, :huis_id, :prijs, :reis, :annuleer, :dagen, :personen, :checkin, :checkout, :datum)");
$stmt->bindParam(':ip', $id);
$stmt->bindParam(':reserveringsnummer', $_SESSION['res_nummer']);
$stmt->bindParam(':aanhef', $_SESSION['aanhef']);
$stmt->bindParam(':adres', $_SESSION['adres']);
$stmt->bindParam(':postcode', $_SESSION['postcode']);
$stmt->bindParam(':woonplaats', $_SESSION['woonplaats']);
$stmt->bindParam(':user_id', $_SESSION['user_id']);
$stmt->bindParam(':naam', $_SESSION['voornaam']);
$stmt->bindParam(':achternaam', $_SESSION['achternaam']);
$stmt->bindParam(':telnummer', $_SESSION['tel_nummer']);
$stmt->bindParam(':email', $_SESSION['email']);
$stmt->bindParam(':huis_id', $_SESSION['id']);
$stmt->bindParam(':prijs', $_SESSION['totaalprijs']);
$stmt->bindParam(':reis', $_SESSION['reisideal']);
$stmt->bindParam(':annuleer', $_SESSION['annuleerideal']);
$stmt->bindParam(':dagen', $_SESSION['numberDays']);
$stmt->bindParam(':personen', $_SESSION['personen']);
$stmt->bindParam(':checkin', $_SESSION['checkin']);
$stmt->bindParam(':checkout', $_SESSION['checkout']);
$stmt->bindParam(':datum', NOW());
$stmt->execute();

//mail
$to = $_SESSION['email']; // note the comma
$subject = "Bevestiging reservering HuurinTurkije";
$message = "TEST";
mail($to, $subject, $message, $headers);
$link = "www.voorbeeld.nl"
header( "Location: ". $link );
}
?>
____________________________

Zit ik bij het goede if statement en wat gaat er dan eventueel fout.

Bij voorbaat dank!

Ivo P op 03/07/2014 15:32:39

Hoe wordt dit script aangeroepen?

Is dat de bezoeker van de site, of is het een call "onderwater" vanaf "de bank"

In dat laatste geval is er geen gevulde $_SESSION.
Die gegevens zul je dan aan de hand van $_GET['trxid'] (transaxie-id) moeten opvragen

Je hebt gelijk, de session variabele wordt niet gevuld. Heb even wat lopen testen. Bedankt voor de hulp.
Hoe kan ik precies de gegevens van de klant opvragen aan de hand van $_GET['trxid']?
Ben aan het zoeken geweest maar wordt er nog niet wijzer van-_-.
Ideal bestaat uit een paar stappen.

1. de klant selecteert de naam van zijn bank uit een drop downlijst
2. je Maakt een nieuwe transactie aan bij Ideal. Hier krijg je een transactieId terug die je moet opslaan in de database met andere relevante gegevens als bedrag ordernummer en vooral ook de status van de betaling (Open). Als dit goed werkt dan wordt de gebruiker doorgesluisd naar de betaal website van de bank.

3. Nu kunnen er drie dingen gebeuren:

A. De klant komt weer terug op de 'success' return-url die is opgegeven. op jouw website dus. Bij een geslaagde transactie krijg je dan de GET variabelen mee 'ec' en 'trxid'. De waarde van de eerste bepaal je zelf bij stap 2. De tweede is dezelfde TransactieId. Dit Id is uniek dus daarmee kun je alle gegevens weer terugvinden in de database.

B. De klant komt weer terug op de 'canceled' return-url wat betekend dat ie niet betaald heeft. Je zult hem hier moeten vertellen dat er geen bestelling geplaatst is.

C. De klant komt helemaal niet terug! (computer vast gelopen of browser per ongeluk afgesloten) Nu heb je geen kans meer om te controleren of de betaling gelukt is en de order in behandeling moet worden genomen. Hiervoor zul je een cronjob moeten aanmaken die betalingen met de 'Open' status alsnog bij ideal checken of ze gelukt zijn of niet. Hier heb je geen beschikking meer over sessie variabelen en zul je dus echt op de database aangewezen zijn.

[size=xsmall]Toevoeging op 07/07/2014 14:56:32:[/size]

Mike van den Hoek op 03/07/2014 14:34:29

De ideal code is door een andere programmeur zeer slordig geprogrammeerd en doordat er nogal haast achter zit heb ik dit nog niet geoptimaliseerd.


Wil je klant het goed of wil die haastwerk. Laat hem/haar kiezen uit deze twee. Althans dat is mijn advies.
De beschrijving die Frank geeft is 1 variant.

er zijn meerdere smaken iDeal (en andere payment providers).

Een ander proces bestaat uit een "geheim" script op jouw server.
Zodra de betaling gelukt is, of een andere status bereikt heeft, roept de server van de payment provider (zeg Mollie) dat script aan.

Mollie stuurt ook inderdaad de bezoeker door met dezelfde gegevens (waaronder dat transactie-id). Maar als een klant van je het transactie id weet te vinden en snapt welke status hij moet hebben, dan is dat een potentieel lek.

De "mollie" route is eenvoudiger te implementeren dan de versie waarbij je zelf alles op jouw server afhandelt.
Ivo, er zijn uiteraard meerdere wegen naar rome en dus ook naar ideal. Ik denk dat ik over de juiste variant spreek omdat ik dit herken:
<?php
if(isset($_GET['ec']) && isset($_GET['trxid'])){
//...
}
?>
Die 2 komen ook voor in de oude mollie api.

Anyway: wat ik eigenlijk bedoelde te zeggen, was dat je bedacht moet zijn op gebruikers die zelf met de urls gaan knoeien. En dat als het kan, je beter kunt vertrouwen op verkeer rechstreeks vanaf de "bank" server.
Als het (misschien) toch over TargetPay gaat: implementeer de "push" vanaf TargetPay naar de reporturl in plaats van de "pull" vanaf de returnurl.

Wat Ivo zegt dus, maar dan met verkeer rechtstreeks vanaf het TargetPay-netwerk in plaats van een bank.

[offtopic]De overeenkomsten tussen TargetPay en Mollie zijn geen toeval.[/offtopic]
Ivo P op 07/07/2014 16:01:26

Die 2 komen ook voor in de oude mollie api.

Anyway: wat ik eigenlijk bedoelde te zeggen, was dat je bedacht moet zijn op gebruikers die zelf met de urls gaan knoeien. En dat als het kan, je beter kunt vertrouwen op verkeer rechstreeks vanaf de "bank" server.


Je bedoelt op de PUSH notificaties?


[size=xsmall]Toevoeging op 07/07/2014 16:30:13:[/size]

@Ward: jouw redenatie begrijp ik nog even niet. Bij een Pull doe je zelf een request bij je pay provider. Je hebt dan toch juist geen publieke pagina meer die $_GET variabelen accepteert? dat is dan toch veiliger?
De terugmeldings pagina kun je nog beveiligen dmv filtering op ip adres


Deny from All
Allow from 10.10.10.10  # of het echte ip van je payment provider


Bij Pull ben je zelf verantwoordelijk voor het ophalen van de status. En dan moet je inderdaad een cron hebben om regelmatig om updates te vragen.

In elk geval niet blind het feit dat de klant terugkomt op de pagina /webshop/success.php vertrouwen.

Zelf heb ik ook wel eens de betalingen terug moeten vragen bij een webshop waar ik na betaling niet meer op terug kon komen.

De push kun je inderdaad beperken tot een IP-range. Dat beperkt het dataverkeer alvast tot exclusief verkeer tussen de PSP en jouw server. SSL aan beide zijden maakt het dan af (nooit op https besparen).

Verder kun je sinds kort op de report-URL naam + woonplaats van de rekeninghouder ontvangen. Dat is dus nog een extra controle van de push die je mist bij de pull: je ziet vanaf welke Nederlandse bankrekening een iDEAL-betaling werd uitgevoerd.
Dan heb ik toch weer iets bijgeleerd vandaag :-) Dank jullie wel beiden.

Reageren