Can't set Guzzle Content Type

Ok .. the problem was that I was setting body and headers outside of defautls. the solution is:

$client = new GuzzleHttp\Client([
'base_url' => [$url, []],
'defaults' => [
     'auth' => [$publishable_key, ''],
     'headers'  => ['content-type' => 'application/json', 'Accept' => 'application/json'],
     'body' => json_encode($body),
],
]);

Guzzle 6

Guzzle will set the Content-Type header to application/x-www-form-urlencoded when no Content-Type header is already present.

You have 2 options.

Option 1: On the Client directly

$client = new GuzzleHttp\Client(
    ['headers' => [
        'Content-Type' => 'application/json'
        ]
    ]
);

Option 2: On a Per Request basis

// Set various headers on a request
$client = new GuzzleHttp\Client();

$client->request('GET', '/whatever', [
    'headers' => [
        'Content-Type' => 'application/json'
    ]
]);

You can refer to Guzzle 6: Request Options