Ключом в json может быть только строка. В python-е же ключом может быть любой объект.
Как возможное решение вы можете конвертировать словарь в список [(key1,value1),(key2,value2),...] и конвертировать его в json, а потом после декодирования из json конвертировать обратно в словарь.
Вы указываете Content-Type: application/json, а данные отправляете в формате application/x-www-form-urlencoded.
Вам нужно использовать json_encode вместо http_build_query