PHP CURL请求Discord Webhook报错请求体包含无效JSON
问题成因
你收到{"code": 50109, "message": "The request body contains invalid JSON."}错误的核心原因有两点:
- 上传文件场景下错误使用了JSON请求格式:Discord Webhook上传附件时不支持纯JSON请求体,二进制文件无法直接被JSON序列化,你手动设置
Content-Type:application/json并将读取到的二进制图片内容做json_encode处理,必然会生成不符合规范的非法JSON结构。 - PHP CURL文件上传方式错误:直接读取文件二进制内容塞进POST字段的写法不符合
multipart/form-data上传规范,PHP CURL要求本地文件上传必须通过CURLFile类实例声明文件路径,才能自动组装符合规范的请求体。
修正后的代码
<?php // 替换为你自己的Discord Webhook地址 $ch = curl_init("https://discord.com/api/webhooks/xx/xx"); $payload = [ // 可选:随图片发送的文字消息,不需要可以删除该字段 'content' => '这是上传的猫咪图片', // 声明要上传的本地文件,realpath()会自动解析文件绝对路径避免路径错误 'files[0]' => new CURLFile(realpath("cat.png")) ]; // 直接传组装好的数组,不要做json_encode处理 curl_setopt($ch, CURLOPT_POSTFIELDS, $payload); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 禁止手动设置Content-Type请求头,CURL会自动生成带正确boundary标识的multipart/form-data头 $result = curl_exec($ch); // 可选:添加CURL错误排查逻辑 if (curl_errno($ch)) { echo 'CURL请求错误: ' . curl_error($ch); } curl_close($ch); var_dump($result); ?>
注意事项
- 确认
cat.png路径正确,如果文件不在脚本同级目录,直接传入文件的完整绝对路径即可。 - 多文件上传时依次添加
files[1]、files[2]字段,对应不同的CURLFile实例即可。 - Discord Webhook单次请求上传的所有附件总大小不得超过25MB,超出会触发其他接口错误。
内容的提问来源于stack exchange,提问作者Umut Santur
相关产品推荐
相关产品推荐

