IDEAL betaling werkt alleen bevestigings mail en insert query niet
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
_____________________________________
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
<?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 );
}
?>
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();
$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!
Graag volgende keren je codes tussen de code-tags zetten (of php-tags)[/modedit]
Gewijzigd op 06/07/2014 22:33:03 door Nick Dijkstra
ik denk dat hier je probleem zit:
1. Session_start toegepast?
2. database verbinding opgezet?
Gewijzigd op 03/07/2014 14:43:52 door E vH
Elmar vH op 03/07/2014 14:43:23:
Ja je zit goed.
ik denk dat hier je probleem zit:
1. Session_start toegepast?
2. database verbinding opgezet?
ik denk dat hier je probleem zit:
1. Session_start toegepast?
2. database verbinding opgezet?
Ja beide zijn juist.
Toevoeging op 03/07/2014 15:10:01:
Erwin H op 03/07/2014 14:53:21:
Moest ip zijn, gelijk aangepast.
Zien jullie verder geen fouten? Heb de insert query zelf aangepast de vorige programmeur kwam met dit:
____________________________
Code (php)
1
2
3
4
5
2
3
4
5
<?php
$stmt = $connect->prepare("INSERT INTO reservering (ip, reserveringsnummer, aanhef, adres, postcode, woonplaats, user_id, naam, achternaam, telnummer, email, huis_id, prijs, 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['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, 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['numberDays'], $_SESSION['personen'], $_SESSION['checkin'], $_SESSION['checkout']);
$stmt -> execute();
?>
Gewijzigd op 06/07/2014 22:33:28 door Nick Dijkstra
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
Wat doet 'ssssssssssssssssss' daar? Nu komt het aantal velden met de bindparameters niet overeen. Kijk dus even naar je foutafhandeling van je query.
Volgens mij is dat een foutieve mix van mysqli (oo) en pdo. bind_param() is een method in het mysqli statement object dat als eerste parameter een string verwacht die voor elke gebonden parameter het type duidt. s staat daarin voor string. In PDO heb je die methode niet, maar bindParam die je voor elke parameter aanroept.
@Mike
Mike van den Hoek op 03/07/2014 15:08:44:
Moest ip zijn, gelijk aangepast.
Met alle respect, maar dit zijn dus wel fouten die je zelf moet kunnen vinden. Tikfouten maken we allemaal en dus ook dit soort dingen. Alleen met behulp van de fout rapportage van php zie je dat direct. Php zal direct aangeven dat $id niet bestaat en dat je die dus niet kunt gebruiken. Zorg dus altijd dat je in je test omgeving dit soort foutmeldingen op je scherm krijgt.
@Ivo
Bingo! Ik had ook al het gevoel dat er iets niet klopte, maar kon de vinger niet op de zere plek leggen, maar dat lijkt mij het probleem. De call komt van de ideal afhandelaar en dus heb je geen toegang tot de session van de gebruiker.
Ik denk niet dat dit door ideal gecalled wordt omdat je al een resultaat in je database moet hebben alvorens ideal je hook raadpleegt. Het enige wat ideal doorgeeft is de status van de betaling. Mocht het wel zo zijn dat zit zijn logica niet goed in elkaar..
Is het een Target Pay script? Ik heb namelijk nog een script liggen dat ik gemaakt heb en goed werkt. Is ook een stuk duidelijker gemaakt. Stuur even een PM als je em wil hebben
Reshad F op 03/07/2014 21:20:14:
Ik denk niet dat dit door ideal gecalled wordt
ideal roept helemaal niets aan, want dat is alleen een betaalmethode. Hoe de toko het regelt die de betaling uitvoert ligt aan hun implementatie.
Gezien dit stukje code lijkt het er wel op dat het een afhandeling van de call van de betaal toko is:
Zo ja, moet je zoals ook al eerder aangegeven door iemand anders een database verbinding tot stand brengen en via de terug geposte transactieId uit je database de benodigde gegevens ophalen. Om te testen haal ik meestal alles weg en stuur ik enkel een mailtje met daarin de transactie_ID post, zo kan je zien of het bestand uberhaubt wordt aangeroepen.
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
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-_-.
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.
Toevoeging op 07/07/2014 14:56:32:
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.
Gewijzigd op 07/07/2014 15:00:31 door Frank Nietbelangrijk
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.
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.
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.
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.
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?
Toevoeging op 07/07/2014 16:30:13:
@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?
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.
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.