PHP返回JSON需设header('Content-Type: application/json; charset=utf-8'),确保文件UTF-8无BOM,否则小程序解析失败或res.data为字符串。

PHP 返回 JSON 数据给微信小程序,关键不是“怎么转 JSON”,而是“怎么让小程序能正确接收并解析”。绝大多数问题出在响应头、编码、跨域(调试时)、以及小程序端 JSON.parse 的前置条件上。
PHP 必须设置正确的 Content-Type 响应头
微信小程序的 wx.request 默认会尝试解析响应体为 JSON,但前提是服务端返回的 Content-Type 是 application/json。如果 PHP 只用 json_encode() 而没设头,小程序可能收到字符串而非对象,res.data 会是原始字符串,后续调用 .xxx 报错。
- 必须写:
header('Content-Type: application/json; charset=utf-8'); - 不要写:
header('Content-Type: text/html; charset=utf-8');或漏掉这行 - 如果用了框架(如 ThinkPHP、Laravel),确认其 JSON 方法是否自动设头;原生 PHP 务必手动加
确保数据 UTF-8 编码且无 BOM
PHP 文件本身要是 UTF-8 无 BOM 格式,否则 json_encode() 可能返回 null,或小程序解析时报 JSON parse error。
- 用 VS Code / Sublime 等编辑器检查右下角编码,选 “UTF-8” 而非 “UTF-8 with BOM”
- 避免在
前输出任何空格、换行、BOM 字节 - 敏感操作:用
mb_detect_encoding($data, ['UTF-8'], true)检查数据编码,非 UTF-8 的字段(如数据库查出的 GBK 内容)需先转码:mb_convert_encoding($str, 'UTF-8', 'GBK')
小程序端 wx.request 需显式声明 responseType
虽然默认是 json,但一旦 PHP 响应头不标准,或返回了非 JSON 内容(比如 PHP 错误信息混入),小程序可能 fallback 到 text 类型,导致 res.data 是字符串而非对象。
立即学习“PHP免费学习笔记(深入)”;
- 建议始终指定:
responseType: 'json' - 同时做基础校验:
if (typeof res.data === 'string') { console.error('后端未返回有效 JSON:', res.data); } - 后端调试时,可用
console.log(JSON.stringify(res))查看原始响应结构
常见错误现象与对应检查点
小程序报错 “JSON parse error” 或 res.data 是空对象/字符串,大概率不是 PHP json_encode 写错了,而是链路中某处破坏了 JSON 完整性。
- PHP 中有
echo "debug info";或var_dump残留 → 响应体混入非 JSON 文本 - 开启了
display_errors = On,PHP 报错直接输出到响应流 → 关闭它或捕获异常 - Nginx/Apache 配置了额外的响应头(如
X-Powered-By不影响,但某些安全模块会注入内容)→ 用 curl 直接测 PHP 脚本排除中间件干扰:curl -i http://your-api/test.php - 小程序真机调试时提示 “request:fail net::ERR_CONNECTION_REFUSED” → 实际是域名未配置合法 HTTPS,或未在小程序后台添加 request 合法域名
最易被忽略的是:PHP 输出 JSON 前,任何 echo、print、警告、Notice 都会导致响应体开头出现不可见字符,JSON 解析立刻失败。宁可加日志到文件,也不要临时 echo 调试。











