login  Naam:   Wachtwoord: 
Registreer je!
 Forum

sessies gaan ergens verloren

Offline GroundZero - 08/07/2014 13:21
Avatar van GroundZeroLid Hi,

ik heb een webwinkeltje gemaakt maar er zit een vreemde bug in.

Wanneer ik het zelf test werkt alles perfect, wanneer een klant een bestelling doet dan worden de NAW gegevens en de bestelde producten niet goed doorgevoerd.

Ik heb de code wel 100 keer nagekeken en getest maar alles werkt perfect elke keer als ik het test. In verschillende browsers en op verschillende computers.

Onderstaand het stukje code waar het over gaat.

  1. <?php
  2. if(countProducts() == 0)
  3. {
  4. echo '<p>Er is iets fout gegaan tijdens de bestelling, probeert u het nogmaals!</p>';
  5. }
  6. else
  7. {
  8. $hasToExists = array('voornaam', 'achternaam', 'straat', 'postcode', 'plaats', 'email');
  9. $err = 0;
  10. foreach($hasToExists as $value)
  11. {
  12. if(!isset($_SESSION[$value]))
  13. {
  14. echo '<p>Wij hebben niet alle benodigde gegevens ontvangen, probeert u het nogmaals!</p>';
  15. $err = 1;
  16. }
  17. }
  18.  
  19. if($err == 0)
  20. {
  21.  
  22. // set a unique orderId
  23. $orderid = mktime();
  24. $_SESSION['orderid'] = $orderid;
  25.  
  26. if($_SESSION['ophalen'] == 1)
  27. {
  28. // De klant komt het zelf ophalen, geen verzendkosten berekenen dus!
  29. $subt = str_replace(',', '', number_format($_SESSION['inclusief'], 2, ',', ''));
  30. $aSub = $_SESSION['inclusief'];
  31. $aText = 'U heeft aangegeven het product in onze showroom te willen ophalen.';
  32. }
  33. else
  34. {
  35. // De klant komt het niet zelf ophalen, verzendkosten berekenen dus!
  36. $subt = str_replace(',', '', number_format($_SESSION['subtotaal'], 2, ',', ''));
  37. $aSub = $_SESSION['subtotaal'];
  38. $aText = 'U heeft aangegeven het product per post te willen ontvangen.';
  39. }
  40.  
  41. $merchantId = '00000';
  42. $subId = '0';
  43. $amount = $subt;
  44. $orderId = $orderid;
  45. $hashKey = '00000';
  46. $paymentType = 'ideal';
  47.  
  48. $itemNumber1 = '1001';
  49. $itemDescription1 = 'Product';
  50. $itemQuantity1 = '1';
  51.  
  52. $validUntil = date('Y-m-d\TH:i:s.000\Z', time()+900);
  53.  
  54. $hashStr = "$hashKey$merchantId$subId$amount$orderId$paymentType$validUntil$itemNumber1$itemDescription1$itemQuantity1$amount";
  55. $hashStr = preg_replace(
  56. array("/[ \t\n]/", '/&amp;/i', '/&lt;/i', '/&gt;/i', '/&quot/i'),
  57. array( '', '&', '<', '>', '"'),
  58. $hashStr);
  59. $hashStr = sha1($hashStr);
  60.  
  61.  
  62. $email = '<table width="100%">
  63. <thead style="text-align:left;">
  64. <th>product id</th>
  65. <th>naam</th>
  66. <th>merk</th>
  67. <th>kleur</th>
  68. <th>type</th>
  69. <th>aantal</th>
  70. <th>prijs</th>
  71. </thead>
  72. <tbody>';
  73.  
  74. foreach($_SESSION['basket'] as $node => $content)
  75. {
  76. $query = mysql_query('SELECT * FROM site_producten
  77. WHERE
  78. product_id = "'.mysql_real_escape_string($content['product_id']).'"');
  79. $fetch = mysql_fetch_assoc($query);
  80.  
  81. $email .= '<tr>
  82. <td>'.$fetch['product_id'].'</td>
  83. <td>'.$fetch['naam'].'</td>
  84. <td>'.$fetch['merk'].'</td>
  85. <td>'.$fetch['kleuren'].'</td>
  86. <td>'.$fetch['types'].'</td>
  87. <td>'.$content['product_aantal'].'</td>
  88. <td>&euro;'.number_format($fetch['voor'], 2, ',', '').'</td>
  89. </tr>';
  90. }
  91.  
  92. $email .= '</tbody>
  93. </table>';
  94.  
  95. mysql_query('INSERT INTO site_bestellingen
  96. (datum, voornaam, achternaam, straat, postcode, plaats, email, telefoonnummer, betaalmethode, ophalen, bestelling, orderid, userId, temp)
  97. VALUES
  98. ("'.mysql_real_escape_string(date("d-m-Y", mktime())).'",
  99. "'.mysql_real_escape_string($_SESSION['voornaam']).'",
  100. "'.mysql_real_escape_string($_SESSION['achternaam']).'",
  101. "'.mysql_real_escape_string($_SESSION['straat']).'",
  102. "'.mysql_real_escape_string($_SESSION['postcode']).'",
  103. "'.mysql_real_escape_string($_SESSION['plaats']).'",
  104. "'.mysql_real_escape_string($_SESSION['email']).'",
  105. "'.mysql_real_escape_string($_SESSION['telefoonnummer']).'",
  106. "'.mysql_real_escape_string($_SESSION['betaalmethode']).'",
  107. "'.mysql_real_escape_string($_SESSION['ophalen']).'",
  108. "'.mysql_real_escape_string($email).'",
  109. "'.mysql_real_escape_string($orderId).'",
  110. "'.mysql_real_escape_string($usrdata[0]).'",
  111. "1")') or die(mysql_error());
  112. }
  113. }
  114. ?>
  115.  
  116. <form action="https://ideal.secure-ing.com/ideal/mpiPayInitIng.do" method="post" name="form1">
  117. <input type="hidden" name="merchantID" value="<?=$merchantId;?>">
  118. <input type="hidden" name="subID" value="<?=$subId;?>">
  119. <input type="hidden" name="amount" value="<?=$amount;?>">
  120. <input type="hidden" name="purchaseID" value="<?=$orderId;?>">
  121. <input type="hidden" name="language" value="nl">
  122. <input type="hidden" name="currency" value="EUR">
  123. <input type="hidden" name="description" value="Bestelling">
  124. <input type="hidden" name="hash" value="<?=$hashStr;?>">
  125. <input type="hidden" name="paymentType" value="<?=$paymentType;?>">
  126. <input type="hidden" name="validUntil" value="<?=$validUntil;?>">
  127.  
  128. <input type="hidden" name="itemNumber1" value="1001">
  129. <input type="hidden" name="itemDescription1" value="Product">
  130. <input type="hidden" name="itemQuantity1" value="1">
  131. <input type="hidden" name="itemPrice1" value="<?=$amount;?>">
  132.  
  133. <input type="hidden" name="urlSuccess" value="<?=ROOT?>success/">
  134. <input type="hidden" name="urlCancel" value="<?=ROOT?>annuleer/">
  135. <input type="hidden" name="urlError" value="<?=ROOT?>error/">
  136.  
  137. <p>Uw totaal bedrag is &euro;<?=number_format($aSub, 2, ',', '')?><br />
  138. <?=$aText?><br /><br />
  139. Via de "betalen" knop kunt u uw betaling voldoen via iDeal.</p>
  140.  
  141. <input type="submit" name="submit2" value="betalen" id="submit2" />
  142.  
  143. </form>


Wanneer de betaling gedaan is stuurt iDeal de gebruiker terug naar een pagina met de volgende code.

  1. <?php
  2. /*
  3.  
  4. Code om transactiegegevens van ING te ontvangen
  5.  
  6. */
  7.  
  8. // Gegevens uit de inputstream trekken
  9. $response = file_get_contents('php://input');
  10. // Gegevens in een bruikbaar object zetten
  11. $xml = simplexml_load_string($response);
  12. // Transactiestatus bekijken
  13. if($xml->status == "Success")
  14. {
  15. require_once('includes/class.phpmailer.php');
  16.  
  17. // Transactie verwerken
  18. // Order id is: $xml->purchaseID
  19. $query = mysql_query('SELECT * FROM site_bestellingen
  20. WHERE
  21. orderid = "'.mysql_real_escape_string($xml->purchaseID).'"');
  22. $fetch = mysql_fetch_assoc($query);
  23.  
  24. $email = '<h1>Bestelling geplaatst</h1>
  25. <p>Klant heeft gekozen voor <strong>iDeal overschrijving</strong>, deze is dus al voldaan!</p>
  26.  
  27. <p><strong>De volgende klantgegevens zijn genoteerd:</strong><br />
  28. voornaam: '.$fetch['voornaam'].'<br />
  29. achternaam: '.$fetch['achternaam'].'<br />
  30. straat: '.$fetch['straat'].'<br />
  31. postcode: '.$fetch['postcode'].'<br />
  32. plaats: '.$fetch['plaats'].'<br />
  33. e-mail: '.$fetch['email'].'<br />
  34. telefoon nummer: '.$fetch['telefoonnummer'].'<br />
  35. </p>
  36. <br />
  37.  
  38. <h2>De volgende producten zijn besteld</h2><br /><br />'.$fetch['bestelling'].'</br ><br />';
  39.  
  40. $email .= 'uw order id is: <strong>'.$xml->purchaseID.'</strong>';
  41.  
  42.  
  43. $mail = new PHPMailer();
  44. $mail->From = 'no-reply@mijnsite.nl';
  45. $mail->FromName = 'mijnsite';
  46. $mail->AddAddress('info@mijnsite.nl', 'mijnsite');
  47. $mail->AddReplyTo('no-reply@mijnsite.nl', 'mijnsite');
  48. $mail->IsHTML(true);
  49. $mail->Subject = 'Bestelling geplaatst op mijnsite '.date("d-m-Y H:i:s", mktime()).'.';
  50. $mail->Body = $email;
  51.  
  52. $mail->Send();
  53.  
  54.  
  55. /* EMAIL FOR CUSTOMER
  56.  
  57. * THIS EMAIL NOTIFIES THE CUSTOMER ABOUT
  58. THE ORDER AND THE PRODUCTS THAT HAVE
  59. * BEEN ORDERED BY THE CUSTOMER
  60.  
  61. */
  62. $email = '<h1>Bestelling geplaatst</h1>
  63. <p><strong>Wij hebben de volgende gegevens genoteerd:</strong><br />
  64. voornaam: '.$fetch['voornaam'].'<br />
  65. achternaam: '.$fetch['achternaam'].'<br />
  66. straat: '.$fetch['straat'].'<br />
  67. postcode: '.$fetch['postcode'].'<br />
  68. plaats: '.$fetch['plaats'].'<br />
  69. e-mail: '.$fetch['email'].'<br />
  70. telefoon nummer: '.$fetch['telefoonnummer'].'<br /><br />
  71.  
  72. <strong>betaalmethode:</strong> iDeal<br /><br />
  73. </p>
  74. <br />
  75.  
  76. <h2>U heeft de volgende producten besteld</h2><br /><br />'.$fetch['bestelling'].'<br /><br />';
  77.  
  78.  
  79.  
  80. $email .= 'uw order id is: <strong>'.$xml->purchaseID.'</strong><br /><br />Indien u onverhoopt een fout heeft ontdekt in uw bestelling, neemt u dan svp contact met ons op.';
  81.  
  82.  
  83. $mail = new PHPMailer();
  84.  
  85. $mail->From = 'no-reply@mijnsite.nl';
  86. $mail->FromName = 'mijnsite';
  87. $mail->AddAddress($_SESSION['email'], $_SESSION['voornaam'].' '.$_SESSION['achternaam']);
  88. $mail->AddReplyTo('no-reply@mijnsite.nl', 'mijnsite');
  89.  
  90. $mail->IsHTML(true);
  91.  
  92. $mail->Subject = 'Bestelling geplaatst op mijnsite '.date("d-m-Y H:i:s", mktime()).'.';
  93. $mail->Body = $email;
  94.  
  95. $mail->Send();
  96.  
  97.  
  98. mysql_query('UPDATE site_bestellingen
  99. SET
  100. temp = 0
  101. WHERE
  102. orderid = "'.mysql_real_escape_string($xml->purchaseID).'"');
  103.  
  104. unset($_SESSION['basket']);
  105.  
  106. echo 'Uw betaling is succesvol ontvangen, wij danken u voor uw bestelling!';
  107.  
  108. } else {
  109. // Cancelled
  110. // Meestal doe je dan niks, maar voor het geval dat maar een else toegevoegd
  111. // Je zou evt wel de order kunnen annuleren
  112.  
  113. echo 'Uw betaling is <strong>niet</strong> voldaan, u kunt nu verder winkelen!';
  114.  
  115. }
  116.  
  117. /* Eventueel zijn er nog de variablen:
  118.  
  119. $xml->createDateTimeStamp - aanmaakdatum transactie
  120. $xml->transactionID - transactie Id vanuit de bank
  121.  
  122. */
  123. ?>


Wanneer iemand betaald heeft via iDeal krijg ik netjes een email alleen staan er GEEN NAW gegevens in of wat voor andere tekst dan ook (uit de database). Dus er staan geen naam, adres, woonplaats, welke artikelen besteld zijn en zo voort.

Heeft iemand enig idee wat er fout zou kunnen zijn?

10 antwoorden

Gesponsorde links
Offline Jointjeff - 08/07/2014 13:58 (laatste wijziging 08/07/2014 13:59)
Avatar van Jointjeff HTML interesse Vermoedelijk gaat je sessie verloren als je naar de externe site gaat (van ING in dit geval).
Dus wat je dan doet:

- Sla de gegevens op in de database met de transactie id voor het betalen.
- Na het betalen roep je de gegevens op uit de database op basis van de transactie id.
Offline GroundZero - 08/07/2014 15:58
Avatar van GroundZero Lid Hi,

dit is dus precies wat ik gedaan heb. Je ziet in de query al dat ik de tabel selecteer met de bijbehorende transactie id ;)
Offline Thomas - 08/07/2014 16:28 (laatste wijziging 08/07/2014 16:32)
Avatar van Thomas Moderator
Citaat:
Wanneer ik het zelf test werkt alles perfect, wanneer een klant een bestelling doet dan worden de NAW gegevens en de bestelde producten niet goed doorgevoerd.

- is de applicatie die je test in beide gevallen hetzelfde? daarmee bedoel ik: test je in beide gevallen op dezelfde (web)server of test jij op je dev/test-omgeving en de klant ergens anders; oftewel testen jullie beiden echt hetzelfde?
- wat bedoel je met "de NAW gegevens en de bestelde gegeven worden niet goed doorgevoerd"; worden deze niet goed opgeslagen? waar gaat het precies fout? waaruit blijkt dat het fout gaat? welke foutmelding(en) krijg je? Een eerste stap die je bij dit soort problemen kunt zetten is het isoleren van het probleem - dit kun je bijvoorbeeld doen door het dumpen van data (naar output) op specifieke punten in je code, vaak kun je dan snel zien waar het mis gaat.

Citaat:
Ik heb de code wel 100 keer nagekeken en getest maar alles werkt perfect elke keer als ik het test. In verschillende browsers en op verschillende computers.

De browsers zijn dan waarschijnlijk niet het probleem (maar ik zou dit niet uitsluiten zolang je de oorzaak niet gevonden hebt).

Omdat je niet kunt aangeven waar het precies misgaat, kan ik ook niet echt de vinger op de zere plek leggen. Wel kan ik een aantal pointers geven:
- ik neem aan dat je ook ergens je sessies expliciet start met session_start()?
- let op bij het gebruik van isset. Als <waarde> in isset(<waarde>) een van de volgende waarden heeft: het cijfer 0, de lege string '', de boolean false, dan retourneert isset(<waarde>) false; misschien kun je beter controleren op array_key_exists of wat meer controles uitvoeren bij het invoeren van gegevens
- ik zie dat je short open tags gebruikt (<?= ... yadda ... ?>); wordt dit overal ondersteund? heb je de HTML-output van je formulier wel eens bekeken om te zien of alle waarden er goed in zitten?
- wordt simplexml overal ondersteund?
- heb je (voorbeeld)data van de klant waar het niet werkt? is deze "case" na te bootsen? misschien kun je eens meekijken bij de klant met behulp van remote desktop programma's zoals teamviewer
- (security) je gebruikt wel (deels) input escaping, maar geen output filtering (bij het afdrukken van data). wellicht is het verstandig om overal waar je data afdrukt gebruik te maken van htmlspecialchars(), zorg hierbij dat je de goede character set toepast (ik neem aan dat dit UTF-8 is?)
Offline Jointjeff - 08/07/2014 16:29 (laatste wijziging 08/07/2014 16:32)
Avatar van Jointjeff HTML interesse Oops, dat had ik niet gezien, goed gedaan 

Kan ik het zelf ook eens proberen (heb je een link?)
Offline GroundZero - 08/07/2014 16:33
Avatar van GroundZero Lid Ik ga dadelijk even alles na lopen, hartelijk dank voor de goede suggesties! ik laat het jullie straks (later op de avond) even weten 

Overigens test ik op de zelfde server, dus alles zou het zelfde moeten zijn. Meerdere computers, meerdere locaties en meerdere browsers gebruikt maar altijd goed, tot dat een klant (onbekende) iets besteld op de webwinkel en dan word er na een iDeal betaling geen NAW gegevens uit de database gehaald en opgeslagen. Het is net alsof iDeal het niet goed terug geeft of zo iets maar dit zou wel zo moeten zijn.

Ik loop alles nog even na en laat het weten hier ;)
Offline Thomas - 08/07/2014 16:43 (laatste wijziging 08/07/2014 16:51)
Avatar van Thomas Moderator Wordt de bestelling wel weggeschreven?
Je controleert in het tweede fragment namelijk niet of er resultaten zijn, je fetcht meteen een resultaat... wat er wellicht niet is (regel 19 t/m 22).

Daarnaast zou dit met simplexml te maken kunnen hebben. Je kunt volgens mij niet simpelweg de waardes van nodes als string gebruiken, tenzij je deze typecast dacht ik. Anyway, debug je query eens en kijk wat de waarde van $xml->purchaseID is...

EDIT: ah, als je concateneert is de typecast impliciet, makes sense.

EDIT: ik maak hier ook uit op dat error_reporting uit staat? Op een productie-omgeving is dit natuurlijk handig, maar heb je geen eigen errorhandler? Daarnaast zou je op IP-basis error_reporting aan kunnen zetten, zodat JIJ wel (potentiële) fouten ziet, maar je klanten niet.

  1. <?php
  2. if (in_array($_SERVER['REMOTE_ADDR'], $developerIPs)) {
  3. // developers
  4. ini_set('display_errors', 'stdout');
  5. } else {
  6. // default
  7. // ...
  8. }
  9. ?>

Dit dwingt je ook een beetje om net(ter) te programmeren, waarbij je niet alles onder het tapijt schuift lol.
Offline Wijnand - 09/07/2014 09:19
Avatar van Wijnand Moderator
FangorN schreef:
- let op bij het gebruik van isset. Als <waarde> in isset(<waarde>) een van de volgende waarden heeft: het cijfer 0, de lege string '', de boolean false, dan retourneert isset(<waarde>) false; misschien kun je beter controleren op array_key_exists of wat meer controles uitvoeren bij het invoeren van gegevens


? Volgens mij niet. Dat is empty.

Empty geeft bij de lege string, integer 0, string 0 en false de boolean 'false' terug.
Isset geeft bij bovenstaande true terug.

Getest met deze code:
  1. $a = '';
  2. $b = '0';
  3. $c = 0;
  4. $d = false;
  5. $e = true;
  6. $f = 'hoi';
  7.  
  8. echo 'Isset:<br />';
  9.  
  10. echo 'empty:<br />';
Offline Thomas - 09/07/2014 14:32 (laatste wijziging 09/07/2014 14:56)
Avatar van Thomas Moderator Oh, dan was het isset() met null. Ik had dit moeten testen.

Anyhoo, het was om uit te sluiten dat het om zo'n (onzinnige) reden op een of andere manier niet zou werken.

Dit euvel zou toch eenvoudig op te lossen moeten zijn met gebruikmaking van bovenstaande hints in combinatie met het inbouwen van wat momenten waarop informatie gedumpt wordt.

EDIT: En (@topicstarter) als je inderdaad vermoed dat je "sessie verloren gaat", dump je sessie-id eens of houd je sessie-cookie in de gaten en kijk of de hash daarvan verandert (dit is je sessie-id) voor en na betalen.
Offline GroundZero - 18/07/2014 10:36
Avatar van GroundZero Lid Dank jullie voor jullie goede antwoorden, toch weer het e.e.a. uit kunnen leren. Ga dit onthouden voor toekomstige dingen dankjewel!

Tot op heden nog niet opgelost (volledig) echter weet ik nu wel waar het probleem zit. Dit is op de pagina waarnaar iDeal de gebruiker terug stuurt. Onderstaand de code:

  1. <?php
  2. /*
  3.  
  4. Code om transactiegegevens van ING te ontvangen
  5.  
  6. */
  7.  
  8. // Gegevens uit de inputstream trekken
  9. $response = file_get_contents('php://input');
  10.  
  11. // Gegevens in een bruikbaar object zetten
  12. $xml = simplexml_load_string($response);
  13.  
  14. // Transactiestatus bekijken, als deze correct is database updaten en email naar beheerder
  15. // en de klant versturen zodat deze op de hoogte zijn van een succesvolle bestelling
  16. if($xml->status == "Success")
  17. {
  18. require_once('includes/class.phpmailer.php');
  19.  
  20. // Transactie verwerken
  21. // Order id is: $xml->purchaseID
  22. $query = mysql_query('SELECT * FROM site_bestellingen
  23. WHERE
  24. orderid = "'.mysql_real_escape_string($xml->purchaseID).'"');
  25. $fetch = mysql_fetch_assoc($query);
  26.  
  27. $email = '<h1>Bestelling geplaatst</h1>
  28. <p>Klant heeft gekozen voor <strong>iDeal overschrijving</strong>, deze is dus al voldaan!</p>
  29.  
  30. <p><strong>De volgende klantgegevens zijn genoteerd:</strong><br />
  31. voornaam: '.$fetch['voornaam'].'<br />
  32. achternaam: '.$fetch['achternaam'].'<br />
  33. straat: '.$fetch['straat'].'<br />
  34. postcode: '.$fetch['postcode'].'<br />
  35. plaats: '.$fetch['plaats'].'<br />
  36. e-mail: '.$fetch['email'].'<br />
  37. telefoon nummer: '.$fetch['telefoonnummer'].'<br />
  38. </p>
  39. <br />
  40.  
  41. <h2>De volgende producten zijn besteld</h2><br /><br />'.$fetch['bestelling'].'</br ><br />';
  42.  
  43. $email .= 'uw order id is: <strong>'.$xml->purchaseID.'</strong>';
  44.  
  45.  
  46. $mail = new PHPMailer();
  47. $mail->From = '';
  48. $mail->FromName = '';
  49. $mail->AddAddress('', '');
  50. $mail->AddReplyTo('', '');
  51. $mail->IsHTML(true);
  52. $mail->Subject = 'Bestelling geplaatst op '.date("d-m-Y H:i:s", mktime()).'.';
  53. $mail->Body = $email;
  54.  
  55. $mail->Send();
  56.  
  57.  
  58. /* EMAIL FOR CUSTOMER
  59.  
  60. * THIS EMAIL NOTIFIES THE CUSTOMER ABOUT
  61. THE ORDER AND THE PRODUCTS THAT HAVE
  62. * BEEN ORDERED BY THE CUSTOMER
  63.  
  64. */
  65. $email = '<h1>Bestelling geplaatst</h1>
  66. <p><strong>Wij hebben de volgende gegevens genoteerd:</strong><br />
  67. voornaam: '.$fetch['voornaam'].'<br />
  68. achternaam: '.$fetch['achternaam'].'<br />
  69. straat: '.$fetch['straat'].'<br />
  70. postcode: '.$fetch['postcode'].'<br />
  71. plaats: '.$fetch['plaats'].'<br />
  72. e-mail: '.$fetch['email'].'<br />
  73. telefoon nummer: '.$fetch['telefoonnummer'].'<br /><br />
  74.  
  75. <strong>betaalmethode:</strong> iDeal<br /><br />
  76. </p>
  77. <br />
  78.  
  79. <h2>U heeft de volgende producten besteld</h2><br /><br />'.$fetch['bestelling'].'<br /><br />';
  80.  
  81.  
  82.  
  83. $email .= 'uw order id is: <strong>'.$xml->purchaseID.'</strong><br /><br />Indien u onverhoopt een fout heeft ontdekt in uw bestelling, neemt u dan svp contact met ons op.';
  84.  
  85.  
  86. $mail = new PHPMailer();
  87.  
  88. $mail->From = '';
  89. $mail->FromName = '';
  90. $mail->AddAddress($_SESSION['email'], $_SESSION['voornaam'].' '.$_SESSION['achternaam']);
  91. $mail->AddReplyTo('', '');
  92.  
  93. $mail->IsHTML(true);
  94.  
  95. $mail->Subject = 'Bestelling geplaatst op '.date("d-m-Y H:i:s", mktime()).'.';
  96. $mail->Body = $email;
  97.  
  98. $mail->Send();
  99.  
  100.  
  101. mysql_query('UPDATE site_bestellingen
  102. SET
  103. temp = 0
  104. WHERE
  105. orderid = "'.mysql_real_escape_string($xml->purchaseID).'"');
  106.  
  107. unset($_SESSION['basket']);
  108.  
  109. echo 'Uw betaling is succesvol ontvangen, wij danken u voor uw bestelling!';
  110.  
  111. } else {
  112. // Cancelled
  113. // Meestal doe je dan niks, maar voor het geval dat maar een else toegevoegd
  114. // Je zou evt wel de order kunnen annuleren
  115.  
  116. echo 'Uw betaling is <strong>niet</strong> voldaan, u kunt nu verder winkelen!';
  117.  
  118. }
  119.  
  120. /* Eventueel zijn er nog de variablen:
  121.  
  122. $xml->createDateTimeStamp - aanmaakdatum transactie
  123. $xml->transactionID - transactie Id vanuit de bank
  124.  
  125. */
  126. ?>


Volgens mijn is de fout dat er geen of een incorrecte transactie id word terug gegeven vanuit iDeal.

Op de vorige pagina (dus voordat je de betaling doet) sla ik de order al op in de database met een tijdelijke (temp) status met de waarde 1. Dit wilt zeggen dat er een bestelling gedaan is maar nog niet betaald.

Na de iDeal betaling word de status niet geupdate naar 0 zoals in de code staat. Dus of iDeal stuurt niet door naar deze pagina (wat me sterk lijkt want het staat aangegeven, zie onderstaande code) of de transactie id klopt niet.

Iemand enig idee? weet ook niet goed hoe ik dit kan testen zonder elke keer een bestelling te doen en via iDeal te betalen wat me dus elke keer geld kost en regelwerk haha 

  1. <input type="hidden" name="urlSuccess" value="<?=ROOT?>success/">
  2. <input type="hidden" name="urlCancel" value="<?=ROOT?>annuleer/">
  3. <input type="hidden" name="urlError" value="<?=ROOT?>error/">


ROOT werkt over de gehele website, is aangegeven in een config bestand als:

  1. define('ROOT', 'http://www.mijnsite.nl/')
Offline Thomas - 18/07/2014 10:59 (laatste wijziging 20/07/2014 16:17)
Avatar van Thomas Moderator Ik denk dat je probleem de omgang met simpleXML is. Alle data waaraan je refereert in $xml zijn objecten. Als je de waarde van zo'n object afdrukt vindt een impliciete typecast plaats, waardoor je de string-waarde van het object terugkrijgt en het lijkt alsof alles klopt.

De oplossing ligt (waarschijnlijk) in het typecasten van de XML-waarden.

Dus gebruik in plaats van:
  1. if ($xml->status == "Success") {

Dit:
  1. if ((string) $xml->status == "Success") {


En zo ook je numerieke waarden naar (int) et cetera.

Simpel voorbeeld met simpleXML die het e.e.a. illustreert:

  1. <?php
  2. header('Content-Type: text/html; charset=UTF-8');
  3.  
  4. $test = '<root>
  5. <item><value>hoi</value></item>
  6. <item><value>12</value></item>
  7. </root>';
  8.  
  9. $xml = simplexml_load_string($test);
  10.  
  11. var_dump($xml);
  12.  
  13. // drukt braaf string af (impliciete typecast)
  14. echo $xml->item[0]->value;
  15.  
  16. // als je de waarde toekent aan een variabele, is dit (nog steeds) een object
  17. $value = $xml->item[0]->value;
  18. var_dump($value);
  19.  
  20. var_dump($xml->item[0]->value);
  21.  
  22. // wat je zou moeten doen is een typecast
  23. $value = (string) $xml->item[0]->value;
  24. var_dump($value);
  25.  
  26. if ((string) $xml->item[0]->value == 'hoi') {
  27. echo 'succes!';
  28. }
  29. ?>


EDIT: hmm, een vergelijking met == is best coulant, het vergelijken van een object met een string werkt haha. Maar goed, mogelijk zit hier ergens het probleem. Daarnaast kan het geen kwaad om deze waarden eens te dumpen.

Ook controleer je (nog steeds?) niet of je SELECT query resultaten heeft...

EDIT 2: verder weet ik niet of de keuze die je hebt gemaakt voor purchaseID (timestamp) een verstandige is. Dit zou toch uniek moeten identificeren voor wie de aankoop is? Wat nu als er twee of meer personen op hetzelfde moment een aankoop doen?

Daarnaast: je maakt geen gebruik van transacties, dit is misschien voor dit soort zaken het overwegen waard.

Tevens: quotes om nummers in queries ... 

Ook: je hebt geen terugkoppeling als een query fout gaat, niet eens een "or die". Je kunt dus niet goed nagaan of een query om een of andere reden fout gaat? Vooral niet als je op je productieomgeving de weergave van fouten enzo uitzet...
Gesponsorde links
Je moet ingelogd zijn om een reactie te kunnen posten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.369s