Hey there,
I got a weird problem, which was not reported so far. Or I didn’t find it by now.
I’m sending requests from our Website (Casarista, which works on PHP) to Klaviyo. These calls are made server-to-server in the backend. The problem is, that special characters (which appear in the german language all the time) are not en-/decoded properly.
I tried many ways to solve this issue, but nothing worked as expected.
I create my JSON-objects with the json_decode() function of PHP. So far, so well.
An example JSON for this endpoint https://a.klaviyo.com/api/profiles/ is:
{"data":{"type":"profile","attributes":{"email":"example@domain.tld","first_name":"Christoph u00e4u00fcu00df 3","last_name":"Eibl"}}}
First name without decoding: “Christoph äüß 3” (for testing purposes I added these special characters)
In Klaviyo the name is displayed as: “Christoph u00e4u00fcu00df 3 Eibl”
When I send the special characters without encoding, like this request:
{"data": {"type": "profile","attributes": {"email": "example@domain.tld","first_name": "Christoph äüß 3ö","last_name": "Eibl"}}}
I get an error from the API itself.
{"errors":[{"id":"ea5ae00e-9055-403a-9172-6670a57561cc","status":400,"code":"parse_error","title":"Malformed request.","detail":"JSON parse error - 'utf-8' codec can't decode byte 0xe4 in position 99: invalid continuation byte","source":{"pointer":"/data/"}}]}
I tried:
- url_encode the values of all strings - didn’t work
- used several options for the json_decode (JSON_INVALID_UTF8_SUBSTITUTE, JSON_INVALID_UTF8_IGNORE, JSON_UNESCAPED_UNICODE)
Is there a way to tell the API endpoint to encode my values?
What is wrong with my requests?
I’m really desperat and I don’t know what’s wrong with my request. I’m looking forward to your help.
Best regards,
Christoph
p.s. this is the code for sending the requests to the klaviyo API:
<?php
$curl = curl_init();
// set all options according to the database values
curl_setopt_array($curl, array(
CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => $curlTimeoutMax,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => $method,
CURLOPT_POSTFIELDS => $jsonObject,
CURLOPT_HTTPHEADER => array(
"Authorization: Klaviyo-API-Key ".$klaviyoApiKey,
"accept: application/json",
"content-type: application/json",
"revision: 2023-06-15"
),
));
// execute the request
$response = curl_exec($curl);
?>