IDEAL betaling werkt alleen bevestigings mail en insert query niet

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Mike van den Hoek

Mike van den Hoek

03/07/2014 14:34:29
Quote Anchor link
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
_____________________________________
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?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!

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
 
PHP hulp

PHP hulp

08/11/2024 20:21:38
 
E vH

E vH

03/07/2014 14:43:23
Quote Anchor link
Ja je zit goed.

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
 
Erwin H

Erwin H

03/07/2014 14:53:21
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$stmt
->bindParam(':ip', $id);
?>

$id of moet dat $ip zijn?
 
Mike van den Hoek

Mike van den Hoek

03/07/2014 15:08:44
Quote Anchor link
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?


Ja beide zijn juist.



Toevoeging op 03/07/2014 15:10:01:

Erwin H op 03/07/2014 14:53:21:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$stmt
->bindParam(':ip', $id);
?>

$id of moet dat $ip zijn?

Moest ip zijn, gelijk aangepast.
Zien jullie verder geen fouten? Heb de insert query zelf aangepast de vorige programmeur kwam met dit:
____________________________
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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();
?>
Gewijzigd op 06/07/2014 22:33:28 door Nick Dijkstra
 
Ivo P

Ivo P

03/07/2014 15:32:39
Quote Anchor link
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
 
Gerhard l

gerhard l

03/07/2014 15:50:32
Quote Anchor link
Wat doet 'ssssssssssssssssss' daar? Nu komt het aantal velden met de bindparameters niet overeen. Kijk dus even naar je foutafhandeling van je query.
 
Erwin H

Erwin H

03/07/2014 16:23:51
Quote Anchor link
@gerhard
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.
 
Reshad F

Reshad F

03/07/2014 21:20:14
Quote Anchor link
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..
 
Donny Wie weet

Donny Wie weet

03/07/2014 21:48:19
Quote Anchor link
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
 
Erwin H

Erwin H

03/07/2014 22:16:09
Quote Anchor link
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?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" )
?>
 
Furio Scripting

Furio Scripting

04/07/2014 00:57:39
Quote Anchor link
Is dit de report url van de betaling provider?

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.
 
Mike van den Hoek

Mike van den Hoek

06/07/2014 22:17:59
Quote Anchor link
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-_-.
 
Frank Nietbelangrijk

Frank Nietbelangrijk

07/07/2014 14:51:41
Quote Anchor link
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.

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
 
Ivo P

Ivo P

07/07/2014 15:12:58
Quote Anchor link
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.
 
Frank Nietbelangrijk

Frank Nietbelangrijk

07/07/2014 15:47:41
Quote Anchor link
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
if(isset($_GET['ec']) && isset($_GET['trxid'])){
    //...
}
?>
 
Ivo P

Ivo P

07/07/2014 16:01:26
Quote Anchor link
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.
 
Ward van der Put
Moderator

Ward van der Put

07/07/2014 16:17:57
Quote Anchor link
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.
 
Frank Nietbelangrijk

Frank Nietbelangrijk

07/07/2014 16:24:24
Quote Anchor link
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?


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?
 
Ivo P

Ivo P

07/07/2014 16:35:05
Quote Anchor link
De terugmeldings pagina kun je nog beveiligen dmv filtering op ip adres

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
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.
 
Ward van der Put
Moderator

Ward van der Put

07/07/2014 16:43:55
Quote Anchor link
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.
 
Frank Nietbelangrijk

Frank Nietbelangrijk

07/07/2014 18:34:24
Quote Anchor link
Dan heb ik toch weer iets bijgeleerd vandaag :-) Dank jullie wel beiden.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.