Probleem Mollie iDEAL PHP5 script met $_GET[id]

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Fynn

Fynn

29/07/2009 23:41:00
Quote Anchor link
Hoi,

Ik ben al de hele dag aan het stoeien met het php script van Mollie, maar kom er echt niet uit..

Ik had een veel uitgebreider script met verschillende database functies etc. gemaakt maar aangezien ik het gedeelte waarbij je klantgegevens in de db moet zetten niet aan de praat kreeg, heb ik het volledige script opnieuw gedownload en zeg maar gekeken waar de fout lag in het 'kale script'.

Het script werkt als volgt:
- iDEAL class, dit verwerkt alles
- prepare.php: hier stel je je Mollie ID in, de url voor report.php, return.php en het bedrag
- report.php: (Hier zit bij mij de fout) Dit script checkt voor een transaction id en vervolgens checkt wat de betaalstatus is.
- return.php, de pagina waar je op terecht komt na de betaling.

Nou was bij mij dus het probleem dat de functies $iDeal->getConsumerInfo() en $iDeal->getAmount() leeg blijven. Ik kon ze dus niet in de db zetten.

Nou heb ik het kale script lichtjes aangepast om te checken wat het probleem was, zie hier:

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
<?php
  
  // ORIGINEEL
  
  require_once('ideal.class.php');
  
  
  $partner_id  = 000000; // Uw mollie partner ID
  
  
  if (isset($_GET['transaction_id'])) {  
    $iDEAL = new iDEAL_Payment ($partner_id);
        
    $iDEAL->checkPayment($_GET['transaction_id']);
    
    if ($iDEAL->getPaidStatus() == true) {
      /*
        De betaling is betaald, deze informatie kan opgeslagen worden (bijv. in de database).
        Met behulp van $iDeal->getConsumerInfo(); kunt u de consument gegevens ophalen (de
        functie returned een array). Met behulp van $iDeal->getAmount(); kunt u het betaalde
        bedrag vergelijken met het bedrag dat afgerekend zou moeten worden.
      */

    }
    
  }

  
?>


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
<?php

// ZELF GEMAAKT
  
  require_once('ideal.class.php');
  require 'constants.php';
  require 'Mysql.php';
  
  
  $partner_id  = #######; // Uw mollie partner ID
  
  
if(isset($_GET['transaction_id'])) {  
  
        $iDEAL = new iDEAL_Payment ($partner_id);
            
        $iDEAL->checkPayment($_GET['transaction_id']);
        
        if ($iDEAL->getPaidStatus() == true) {
        
            $db = new Mysql;
            $var1 = 'getPaidStatus is true';
            $db->conn->query("INSERT INTO users VALUES (NULL, 'Test', '" . $var1 . "')");

        }
else {
        
            $db = new Mysql;
            $var1 = 'getPaidStatus is fout';
            $db->conn->query("INSERT INTO users VALUES (NULL, 'Test', '" . $var1 . "')");
        }
    
 }
else {
 
        $db = new Mysql;
        $var1 = 'Transaction ID not set..';
        $db->conn->query("INSERT INTO users VALUES (NULL, 'Test', '" . $var1 . "')");
 
 
 }

 
?>


Als ik een betaling uitvoer, en mijn database check zie ik het resultaat 'Transaction ID not set..' het script kan dus niet de transaction id pakken. Wat vreemd is, aangezien het bijna hetzelfde is als het originele downloadbare script op Mollie.

Zie ik iets heel stoms over het hoofd of is dit een fout aan de kant van Mollie?

Voor de duidelijkheid:
- Betalingen worden wel gewoon verwerkt, de bedank pagina komt gewoon tevoorschijn met de melding dat de transactie geslaagd is.
- Ik werk lokaal (geen probleem volgens mij)
- Als ik op de bedankt pagina kom, de transaction id plak en achter report.php zet krijg ik (uiteraard) wel de melding dat getpaidstatus true is in mijn db.

Ik hoop dat er wat php champs nog wakker zijn want ik kan niet slapen voor dit gefixt is :P Alvast bedankt voor de hulp/tips.

EDIT: Ik zal ook de class, prepare en return online gooien.
EDIT 2: Dat was lelijk, even post aangepast..

Ideal Class:

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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
<?php
/*-----------------------------------------------------------------------
  Start              : 24 februari 2009
  Door               : Mollie B.V. (RDF) © 2009

  Versie             : 1.02 (gebaseerd op de Mollie iDEAL class van
                       Concepto IT Solution - http://www.concepto.nl/)
  Laatste aanpassing : 21 april 2009
  Aard v. aanpassing : Functieaanroepen zonder hoofdletters verbeterd,
                       preg_match voor return- en reporturl aangepast
  Door               : RDF
  -----------------------------------------------------------------------*/


  class iDEAL_Payment {

    const     MIN_TRANS_AMOUNT = 118;

    protected $partner_id      = null;
    protected $testmode        = false;

    protected $bank_id         = null;
    protected $amount          = 0;
    protected $description     = null;
    protected $return_url      = null;
    protected $report_url      = null;

    protected $bank_url        = null;
    protected $transaction_id  = null;
    protected $paid_status     = false;
    protected $consumer_info   = array();

    public function __construct ($partner_id) {
      $this->partner_id = $partner_id;
    }


    public function getBanks () {
      $banks_xml = $this->_sendRequest('www.mollie.nl', '/xml/ideal/', 'a=banklist' . (($this->testmode) ? '&testmode=true' : ''));

      if (empty($banks_xml)) {
        return false;
      }


      $banks_object = $this->_XMLtoObject($banks_xml);

      if (!$banks_object) {
        return false;
      }


       $banks_array = array();
       foreach ($banks_object->bank as $bank) {
         $banks_array["{$bank->bank_id}"] = "{$bank->bank_name}";
       }


       return $banks_array;
    }


    public function createPayment ($bank_id, $amount, $description, $return_url, $report_url) {

      if (!$this->setBankId($bank_id) or
          !$this->setDescription($description) or
          !$this->setAmount($amount) or
          !$this->setReturnUrl($return_url) or
          !$this->setReportUrl($report_url)) {
        return false;
      }


      $create_xml = $this->_sendRequest(
                      'www.mollie.nl',
                      '/xml/ideal/',
                      'a=fetch' .
                        '&partnerid=' .   urlencode($this->getPartnerId()) .
                        '&bank_id=' .     urlencode($this->getBankId()) .
                        '&amount=' .      urlencode($this->getAmount()) .
                        '&reporturl=' .   urlencode($this->getReportURL()) .
                        '&description=' . urlencode($this->getDescription()) .
                        '&returnurl=' .   urlencode($this->getReturnURL()));

      if (empty($create_xml)) {
        return false;
      }


      $create_object = $this->_XMLtoObject($create_xml);

      if (!$create_object) {
        return false;
      }


      $this->transaction_id = $create_object->order->transaction_id;
      $this->bank_url       = $create_object->order->URL;

      return true;
    }


    public function checkPayment ($transaction_id) {
      if (!$this->setTransactionId($transaction_id)) {
        return false;
      }


      $check_xml = $this->_sendRequest(
                     'www.mollie.nl',
                     '/xml/ideal/',
                     'a=check' .
                       '&partnerid=' .      urlencode($this->getPartnerId()) .
                       '&transaction_id=' . urlencode($this->getTransactionId()) .
                       ((
$this->testmode) ? '&testmode=true' : ''));

      if (empty($check_xml)) {
        return false;
      }


      $check_object = $this->_XMLtoObject($check_xml);

      if (!$check_object) {
        return false;
      }


      $this->paid_status   = ($check_object->order->payed == 'true');
      $this->amount        = $check_object->order->amount;
      $this->consumer_info = (isset($check_object->order->consumer)) ? (array) $check_object->order->consumer : array();

      return true;
    }


/*
  PROTECTED FUNCTIONS
*/


    protected function _sendRequest ($host, $path, $data) {
      $fp = @fsockopen($host, 80);
      $buf = '';
      if ($fp) {
        @
fputs($fp, "POST $path HTTP/1.0\n");
        @
fputs($fp, "Host: $host\n");
        @
fputs($fp, "Content-type: application/x-www-form-urlencoded\n");
        @
fputs($fp, "Content-length: " . strlen($data) . "\n");
        @
fputs($fp, "Connection: close\n\n");
        @
fputs($fp, $data);

        while (!feof($fp)) {
          $buf .= fgets($fp, 128);
        }

        fclose($fp);
      }


      if (empty($buf)) {
        return false;
      }

      else {
        list($headers, $body) = preg_split("/(\r?\n){2}/", $buf, 2);

        return $body;
      }
    }


    protected function _XMLtoObject ($xml) {
      try {
        $xml_object = new SimpleXMLElement($xml);
        if ($xml_object == false) {
          return false;
        }
      }

      catch (Exception $e) {
        return false;
      }


      return $xml_object;
    }


/*
  SET AND GET FUNCTIONS
*/


    public function setPartnerId ($partner_id) {
      if (!is_numeric($partner_id)) {
        return false;
      }


      return ($this->partner_id = $partner_id);
    }


    public function getPartnerId () {
      return $this->partner_id;
    }


    public function setTestmode () {
      return ($this->testmode = true);
    }


    public function setBankId ($bank_id) {
      if (!is_numeric($bank_id)) {
        return false;
      }


      return ($this->bank_id = $bank_id);
    }


    public function getBankId () {
      return $this->bank_id;
    }


    public function setAmount ($amount) {
      if (!ereg('^[0-9]{0,}$', $amount)) {
        return false;
      }

      if (self::MIN_TRANS_AMOUNT > $amount) {
        return false;
      }


      return ($this->amount = $amount);
    }


    public function getAmount () {
      return $this->amount;
    }


    public function setDescription ($description) {
      $description = substr($description, 0, 29);

      return ($this->description = $description);
    }


    public function getDescription () {
      return $this->description;
    }


    public function setReturnURL ($return_url) {
      if (!preg_match('|(\w+)://([^/:]+)(:\d+)?(.*)|', $return_url)) {
        return false;
      }


      return ($this->return_url = $return_url);
    }


    public function getReturnURL () {
      return $this->return_url;
    }


    public function setReportURL ($report_url) {
      if (!preg_match('|(\w+)://([^/:]+)(:\d+)?(.*)|', $report_url)) {
        return false;
      }


      return ($this->report_url = $report_url);
    }


    public function getReportURL () {
      return $this->report_url;
    }


    public function setTransactionId ($transaction_id) {
      if (empty($transaction_id)) {
        return false;
      }


      return ($this->transaction_id = $transaction_id);
    }


    public function getTransactionId () {
      return $this->transaction_id;
    }


    public function getBankURL () {
      return $this->bank_url;
    }


    public function getPaidStatus () {
      return $this->paid_status;
    }


    public function getConsumerInfo () {
      return $this->consumer_info;
    }

  }


?>


Ideal prepare.php

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
<?php

  require_once('ideal.class.php');


  $partner_id  =******; // Uw mollie partner ID
  $amount      = 118;    // Het af te rekenen bedrag in centen (!!!)
  $description = 'Testbetaling'; // Beschrijving die consument op zijn/haar afschrift ziet.
  $return_url  = 'http://*******/idealtest/return.php'; // URL waarnaar de consument teruggestuurd wordt na de betaling
  $report_url  = 'http://localhost/******/idealtest/report.php'; // URL die Mollie aanvraagt (op de achtergrond) na de betaling om de status naar op te sturen


  $iDEAL = new iDEAL_Payment ($partner_id);

  if (isset($_POST['bank_id']) and !empty($_POST['bank_id'])) {
    if ($iDEAL->createPayment($_POST['bank_id'], $amount, $description, $return_url, $report_url)) {
      /*
        Hier kunt u de aangemaakte betaling opslaan in uw database, bijv. met het unieke transactie_id
        Het transactie_id kunt u aanvragen door $iDEAL->getTransactionId() te gebruiken.

        Hierna wordt de consument automatisch doorgestuurd naar de gekozen bank.
      */


      header('location: ' . $iDEAL->getBankURL());
    }

    else {
      echo 'De betaling kon niet aangemaakt worden.';
    }
  }

  else {
    /*
      Hier worden de mogelijke banken opgehaald en getoont aan de consument.
    */


    $bank_array = $iDEAL->getBanks();
?>



En return.php:

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
<?php
  
  if (isset($_GET['transaction_id'])) {
    /*
      Via report.php heeft Mollie de betaling al gemeld, en in dat script heeft bij Mollie gecontroleerd
      wat de betaalstatus is. Deze betaalstatus is in report.php ergens opgeslagen in het systeem (bijv.
      in de database).
      
      De klant komt bij dit script terug na de betaling. Hier kan dan met behulp van het 'transaction_id'
      de status van de betaling uit de database gehaald worden en de klant de relevante informatie tonen.
    */


    echo 'Bedankt voor uw betaling.';
  }

  else {
    echo 'Er is geen transaction_id meegegeven.';  
  }

  
?>
Gewijzigd op 01/01/1970 01:00:00 door Fynn
 
Er zijn nog geen reacties op dit bericht.



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.