Hulp met PHP en API

Overzicht

Sponsored by: Vacatures door Monsterboard

Martin Peter

Martin Peter

19/03/2024 09:33:45
Anchor link
Goedemorgen,
Ik heb een vraag betreft een script/api waar ik maar niet uitkom.
Het gaat om een API script die contact maakt met de kassa en WooCommerce.
Die script moet kijken met behulp van de API wat de voorraad, prijs en actieprijs is, dit moet dan synchoom lopen met WooCommerce.
Mocht iemand kunnen helpen graag, Echter heb ik al een voorbeeld script, mocht het nodig zijn.

Mocht je willen helpen hoor ik graag van je en super bedankt.
 
PHP hulp

PHP hulp

05/11/2024 15:40:19
 
- Ariën  -
Beheerder

- Ariën -

19/03/2024 10:07:09
Anchor link
Waar loop je precies op vast, en wat heb je momenteel geprobeerd?

Heb je hier al kunnen vinden wat je zocht?
https://woocommerce.github.io/woocommerce-rest-api-docs/#introduction
 
Martin Peter

Martin Peter

19/03/2024 11:59:16
Anchor link
Beste Ariën,
Dit is wat ik heb, echter loop hij niet het hele lijstje van de sku's ik heb 8000 producten maar hij checkt er misschien 8/1200. Ik heb er een cronjob van gemaakt. Zie hieronder de script die ik geschreven heb, echter heb ik ook de timeout tijd verlengd ipv 3600 heb ik maar 7200 gedaan, want ik dacht misschien is dat het. Dit scriptje gaat naar de kassa kijken wat de data is van de producten, prijs, actieprijs en voorraad de script haalt de gegevens op en slaat ze op in het database van WooCommerce.

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
<?php
// Database setup
$db_host = 'localhost';
$db_user = '';
$db_pass = '';
$db_name = '';

// Connect to the database
$mysqli = new mysqli($db_host, $db_user, $db_pass, $db_name);

// Check the connection
if ($mysqli->connect_error) {
    die('Connection failed: ' . $mysqli->connect_error);
}


// ASPOS OAuth2 client credentials
$clientID = '';
$clientSecret = '';
$tokenURL = 'https://webservicesmijnspeelgoed.aspos.nl/connect/token';

// Create the payload for the ASPOS token request
$data = [
    'grant_type' => 'client_credentials',
    'client_id' => $clientID,
    'client_secret' => $clientSecret,
];


// Initialize cURL for the ASPOS token request
$ch = curl_init($tokenURL);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));

// Execute the ASPOS token request
$response = curl_exec($ch);

if (curl_errno($ch)) {
    echo 'cURL error: ' . curl_error($ch);
    exit;
}


curl_close($ch);

// Parse the ASPOS response to get the Bearer Token
$tokenData = json_decode($response, true);

if (isset($tokenData['access_token'])) {
    $bearerToken = $tokenData['access_token'];
}
else {
    echo 'Failed to obtain the Bearer Token.';
    exit;
}


// ASPOS API setup
$asposBaseUrl = 'https://webservicesmijnspeelgoed.aspos.nl';

// SQL query
$sql = "SELECT * FROM tt_postmeta WHERE meta_key = '_sku'";

// Execute the query
$result = $mysqli->query($sql);

// Check if the query was successful
if ($result) {
    // Fetch and display the results
    while ($row = $result->fetch_assoc()) {

        $productID = $row['post_id'];
        $sku_value = $row['meta_value'];

        // Get product data from ASPOS using SKU
        $aspos_endpoint = "/api/products/scancode/$sku_value?expand=StockInfo,DefaultScanCode,ScanCodes,Discount";
        $aspos_url = $asposBaseUrl . $aspos_endpoint;

        // Initialize cURL for ASPOS product data request
        $ch = curl_init($aspos_url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_HTTPHEADER, [
            'Authorization: Bearer ' . $bearerToken,
        ]);


        // Execute the ASPOS product data request
        $aspos_response = curl_exec($ch);

        if (curl_errno($ch)) {
            echo 'cURL error: ' . curl_error($ch);
            exit;
        }


        curl_close($ch);

        // Parse ASPOS response
        $aspos_data = json_decode($aspos_response, true);

        // Check if product is found
        if (isset($aspos_data['errors']) && $aspos_data['errors'][0]['errorCode'] === 'product_not_found') {
            // Product not found with the original SKU, try with leading zero
            $sku_value_with_zero = '0' . $sku_value;
            $aspos_endpoint = "/api/products/scancode/$sku_value_with_zero?expand=StockInfo,DefaultScanCode,ScanCodes,Discount";
            $aspos_url = $asposBaseUrl . $aspos_endpoint;

            // Reinitialize cURL for ASPOS product data request
            $ch = curl_init($aspos_url);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($ch, CURLOPT_HTTPHEADER, [
                'Authorization: Bearer ' . $bearerToken,
            ]);


            // Execute the ASPOS product data request
            $aspos_response = curl_exec($ch);

            if (curl_errno($ch)) {
                echo 'cURL error: ' . curl_error($ch);
                exit;
            }


            curl_close($ch);

            // Parse ASPOS response again
            $aspos_data = json_decode($aspos_response, true);
        }


        // Now you can proceed with processing the ASPOS data as before

        // Check if product is found and proceed accordingly

        if (isset($aspos_data['errors']) && $aspos_data['errors'][0]['errorCode'] === 'product_not_found') {
            // Product not found in ASPOS as well
            // Handle the case where the product is not found

            echo "Product not found for SKU: $sku_value";
        }
else {
            // Product found, proceed with further processing
            $regular_price = $aspos_data['priceInclTax'];
            $sale_price = $aspos_data['discount']['priceInclTax'];
            $manage_stock = 'true';
            $stock_quantity = $aspos_data['stockInfo'][0]['availableQuantity'];

            // Continue with your existing logic for updating WooCommerce product data
        }
    }


    // Free the result set
    $result->free();
}
else {
    echo 'Error executing the query: ' . $mysqli->error;
}


// Close the database connection
$mysqli->close();

?>
 
- Ariën  -
Beheerder

- Ariën -

19/03/2024 12:16:49
Anchor link
Via cronjobs is altijd een goed idee. Ook kan je het eens proberen om het via de CLI uit te voeren, als je die mogelijkheid hebt.

Waar die op vastloopt is inderdaad wat uitzoekwerk, goede debugging moet je de goede richting op helpen. Het kan ook zijn dat de server die je opvraagt, het bijltje erbij neerlegt.
Gewijzigd op 19/03/2024 12:24:05 door - Ariën -
 
Martin Peter

Martin Peter

19/03/2024 21:20:47
Anchor link
Beste Arien, helaas dit blijkt dus niet de oplossing, echter wel geprobeerd, vandaar de later reactie. Door het proberen.
 
- Ariën  -
Beheerder

- Ariën -

19/03/2024 21:35:35
Anchor link
Opmerkelijk. Dat is just de oplossing. Als dat niet werk, dan mis je een paar controlepunten in je code.

Log elke actie die er plaatsvind in een textbestand, en doe dat bij elke iteratie van een product. Houd daarbij ook de tijd bij hoelang elke actie duurt, en toon bij elke iteratie hoelang die duurde.

Als je ergens een time-out heb, dan moet je in een oogopslag kunnen zien waar het fout gaat, waar het script eindigt, en hoelang welk proces duurde.

Als je Monolog gebruikt, dan kan je zoiets als dit gebruiken:
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
<?php
use Monolog\Logger;
use Monolog\Handler\StreamHandler;

// Configureer Monolog om logs naar een bestand te schrijven
$log = new Logger('cronjob');
$log->pushHandler(new StreamHandler('logs/app.log', Logger::INFO));

// Start de timer
$startTime = microtime(true);

// Simuleer een actie
$log->info('Actie gestart');
sleep(2); // Simuleer een actie die 2 seconden duurt
$log->info('Actie voltooid');

// Bereken de verstreken tijd
$endTime = microtime(true);
$elapsedTime = $endTime - $startTime;

// Log de verstreken tijd met Monolog
$log->info("Verstreken tijd voor actie: $elapsedTime seconden");
?>
Gewijzigd op 19/03/2024 21:41:41 door - Ariën -
 
 

Dit topic is gesloten.



Overzicht

 
 

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.