Mollie Api

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Donald Boers

Donald Boers

14/09/2015 17:01:06
Quote Anchor link
Hallo allemaal. Ik ondervind nogal wat problemen met het integreren vam Mollie Api in mijn website. Ik heb een checkout pagina waar de klant zijn/haar gegevens dient in te vullen en waar de door hem/haar bestelde artikelen staan inclusief totaal bedrag. Wanneer ik de Api op de volgende manier gebruik werkt in iedergeval het betalings gedeelte:
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
public function betalenAction()
{
require_once (APP_PATH.'/Mollie/API/Autoloader.php');
$mollie = new Mollie_API_Client;
$mollie->setApiKey('test_4Hb6uayeYE8NzRbLH8xFtGwm3idBH9');
$order_id       = time();
$cart_items     = $this->artikelen->get_cart_items($this->client);
$total_price    = 0;

foreach ($cart_items as $value)
{
    $price  = str_replace(',','.', $value['product_prijs']);
    $total_price    += $price;
}

try
{
    $payment = $mollie->payments->create(
        array(
            'amount'      => $total_price,
        'method'      => Mollie_API_Object_Method::IDEAL,
             'description' => 'My first API payment',
             'redirectUrl' => 'http://www.testfolder.nl/artikelen/bestelling_status',
             'metadata'    => array(
                 'order_id' => $order_id
         )
     )
    );
    header("Location: " . $payment->getPaymentUrl());
    exit;
}
catch (Mollie_API_Exception $e)
{
    echo "API call failed: " . htmlspecialchars($e->getMessage()) . " on field " + htmlspecialchars($e->getField());
}
}


Ik heb ook de webhookUrl juist aangemaakt:
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
try
{
    require_once (APP_PATH.'/Mollie/API/Autoloader.php');
    $mollie = new Mollie_API_Client;
    $mollie->setApiKey('test_4Hb6uayeYE8NzRbLH8xFtGwm3idBH9');
            
    $payment  = $mollie->payments->get($_POST["id"]);
    $order_id = $payment->metadata->order_id;
            
    $this->artikelen->set_bestel_status($order_id, $payment->status);
            
    if ($payment->isPaid() == TRUE)
    {
            
    }
            
    elseif ($payment->isOpen() == FALSE)
    {

    }
}

catch (Mollie_API_Exception $e)
{
    echo "API call failed: " . htmlspecialchars($e->getMessage());
}

Want als ik terug op de pagina kom en de database controleer staan inderdaad de juiste order_id en order_status in de database.

Maar zoals ik al aangaf wil ik graag de koper informatie in de database opslaan voor later gebruik. Waneer ik echer het volgende voor de redirect in betalenAction voor de redirect naar mollie plaats blijft de pagina steken en kom ik niet bij Mollie terecht.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
$order_id       = time();
$client_id      = $this->client;
$naam           = filter_input(INPUT_POST, 'naam', FILTER_SANITIZE_STRING);
$adres          = filter_input(INPUT_POST, 'adres', FILTER_SANITIZE_STRING);
$postcode       = filter_input(INPUT_POST, 'postcode', FILTER_SANITIZE_STRING);
$woonplaats     = filter_input(INPUT_POST, 'woonplaats', FILTER_SANITIZE_STRING);
$email          = filter_input(INPUT_POST, 'email', FILTER_SANITIZE_STRING);
$telefoon       = filter_input(INPUT_POST, 'telefoon', FILTER_SANITIZE_STRING);
$bijzonderheden = filter_input(INPUT_POST, 'bijzonderheden', FILTER_SANITIZE_STRING);
            
$toevoegen  = $this->artikelen->bestelling_toevoegen($order_id,$client_id,$naam,$adres,$postcode,$woonplaats,$email,$telefoon,$bijzonderheden);


Ziet iemand wat ik hier fout doe?

Bij voorbaat dank
 
PHP hulp

PHP hulp

18/04/2024 22:07:25
 
Johan de wit

johan de wit

14/09/2015 17:40:20
Quote Anchor link
Is je website op maat gemaakt?
 
Donald Boers

Donald Boers

15/09/2015 07:18:59
Quote Anchor link
Hallo Johan. Ja die is op maat gemaakt, het is geen bestaand Framwerk
 
Ivo P

Ivo P

15/09/2015 09:21:46
Quote Anchor link
$order_id = time();

Lijkt me dat order_id een uniek ding moet zijn?

time() levert je het aantal seconden sinds 1970. In 1 seconde zitten 1000 miliseconden. Elke paar ms kan een webserver wel een request verwerken. De kans is dus zeker aanwezig dat er een keer 2 orders in dezelfde seconde geplaatst worden. Hoeft niet vaak te gebeuren. Een keer is genoeg om een probleem te veroorzaken.

Ik zou de tabel met orders voorzien van een kolom order_id met een auto-increment waarde.
En als jij order_id = 134 niet spannend genoeg vindt, dan kun je dat altijd nog als 2015090134 presenteren.

Verder zou ik je opsla-probleem debuggen door te kijken wat bestelling_toevoegen() precies uitspookt.

Ik zou eens kijken of die functie fouten in de query uitvoering opvangt.
Daarna kan die functie true/false terug geven, waarna je bij de aanroep op basis van de geretourneerde waarde kan besluiten om wel of niet (met melding) naar mollie door te gaan.
 
Ward van der Put
Moderator

Ward van der Put

15/09/2015 09:22:24
Quote Anchor link
Dit is niet logisch:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$toevoegen  = $this->artikelen->bestelling_toevoegen($order_id,$client_id,$naam,$adres,$postcode,$woonplaats,$email,$telefoon,$bijzonderheden);

Die $this is een object dat een container artikelen bevat. Die artikelen hebben een methode bestelling_toevoegen() waarmee je klantgegevens opslaat. Dat zijn echter drie verschillende dingen, die je zou moeten scheiden: artikelen, bestelling en klant. De structuur deugt niet óf je gebruikt een bestaande structuur verkeerd.

Waar komt die $this vandaan?
 
Donald Boers

Donald Boers

15/09/2015 12:16:53
Quote Anchor link
@Ivo Ik heb je advies/idee opgevolgd en van order_id inderdaad een auto-increment waarde gegeven en dat werkt perfect. Voor wat betreft de insert, dat werkt inmiddels ook. Was een typo

@ Ward. Je hebt helemaal gelijk. Ik heb de order_id inmiddels uit de tafel verwijderd. Voor wat betreft de $this. Die komt uit de main controller:

protected $artikelen;

$this->artikelen = new Model_Artikelen($pdo);
 



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.