
本文详解如何在 PHP 中安全、准确地将变量(如 $saved1)插入用于 Facebook Messenger API 的 JSON 格式请求体,避免因引号误用或转义问题导致变量不解析、换行失效或 JSON 格式错误。
本文详解如何在 php 中安全、准确地将变量(如 `$saved1`)插入用于 facebook messenger api 的 json 格式请求体,避免因引号误用或转义问题导致变量不解析、换行失效或 json 格式错误。
在 PHP 中构建 JSON 请求体时,直接在单引号字符串中使用 "$saved1" 或 "${saved1}" 是无效的——PHP 不会解析单引号字符串内的变量。而若错误使用双引号却忽略 JSON 的引号结构,又极易引发语法错误或 XSS 风险。正确做法是:明确区分 PHP 字符串拼接与 JSON 数据结构,优先采用字符串连接(.)或更健壮的 json_encode() 方式。
以下为推荐的两种实现方案:
✅ 方案一:安全拼接(适用于简单场景)
保持原始结构,仅对需动态插入的字段做显式拼接,并确保换行符 \n 在 JSON 中被正确转义(注意:JSON 规范要求换行符必须为 \n,且需位于双引号内):
$saved1 = "123"; // 示例值
$reply_message = '{
"messaging_type": "RESPONSE",
"recipient": {
"id": "1631126643573991"
},
"message": {
"text": "line1 \n ' . addslashes($saved1) . ' \n line 3"
}
}';⚠️ 注意:addslashes() 可防止 $saved1 中含双引号(")、反斜杠(\)等破坏 JSON 结构;但该方法仍属手动拼接,扩展性与安全性有限。
✅ 方案二(强烈推荐):使用 json_encode() 构建完整数组(最佳实践)
完全规避字符串拼接风险,让 PHP 自动处理转义与格式化:
$saved1 = "123";
$data = [
'messaging_type' => 'RESPONSE',
'recipient' => ['id' => '1631126643573991'],
'message' => [
'text' => "line1\n{$saved1}\nline 3"
]
];
$reply_message = json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
// 输出示例:{"messaging_type":"RESPONSE","recipient":{"id":"1631126643573991"},"message":{"text":"line1\n123\nline 3"}}此方式天然支持多行文本、特殊字符及 Unicode,且 json_encode() 会自动将 \n 转为 JSON 兼容的 \n(在传输中仍被正确解析为换行),同时杜绝注入隐患。
立即学习“PHP免费学习笔记(深入)”;
? 关键注意事项:
- 不要在单引号字符串中尝试插值(如
'text": "$saved1"'),PHP 完全忽略; - 手动拼接 JSON 时,务必对变量调用
addslashes()或json_encode($value)单独转义; - 始终验证生成的 JSON 是否有效:
json_last_error() === JSON_ERROR_NONE; - Facebook Messenger API 要求
Content-Type: application/json,已由你的curl_setopt($ch, CURLOPT_HTTPHEADER, $headers)正确设置,无需改动。
综上,与其调试引号嵌套,不如拥抱 json_encode()——它既是标准解法,也是可维护性与健壮性的双重保障。



















