Если Вы скопировали код скрипта из листинга выше, создали файл apiKeys.php и указали в нём переменные $clientId и $clientSecret(или указали их в файле основного скрипта) в браузере Вы должны увидеть результат расчёта доставки полученный от API сервера CDEK аналогичный тому, что я привёл на скринсшоте ниже.
Причины возникновения ошибки "Unsupported Media Type" с кодом 415
Если при запросе информации по api с сервера СДЭК у Вас возникла ошибка Unsupported Media Type с статусом 415, причиной её возникновения является отсутствие в Вашем запросе заголовка Content-Type: application/json; charset=utf-8, который говорит серверу о том, что переданные в POST данные являются закодированной строкой JSON и имеют кодировку UTF-8. Это так же может быть понятно из текста ошибки, перевод которой может означать, что сервер CDEK не смог распознать тип передаваемых данных.
В моей практике было что такая ошибка сопровождалась HTML выводом информации с стороны сервера, хотя на выходе предполагается JSON, не смотря на то что видимо данный момент уже поправили и теперь запросы к URL сервера CDEK из примера выше всегда возвращают JSON, тем не менее ранее эту ситуацию можно было поправить, если дополнительно было передать заголовок Accept: application/json, который означает что клиент ожидает от сервера именно JSON закодированную строку и она бы возвращалась сервером CDEK даже при отсутствии заголовка Content-Type. То-есть ещё раз повторю в чём же отличие заголовка Content-Type от Accept: первый заголовок показывает тип содержимого который клиент направляет серверу(если разумеется этот заголовок передаёт именно клиент, а не сервер, в противном случаи заголовок бы обозначал тип контента который вернул сервер для клиента), второй заголовок означает формат данных, с которыми умеет работать клиент и соответственно данные именно в этом формате клиент ожидает получить от сервера.
На скринсшоте ниже приведён пример как выглядит описанная ошибка в браузере, если в коде из листинга выше не передать заголовок Content-Type.