Hulp met PHP en API
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.
Heb je hier al kunnen vinden wat je zocht?
https://woocommerce.github.io/woocommerce-rest-api-docs/#introduction
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)
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
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();
?>
// 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();
?>
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 -
Beste Arien, helaas dit blijkt dus niet de oplossing, echter wel geprobeerd, vandaar de later reactie. Door het proberen.
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)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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");
?>
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 -