[英]Facebook Messenger API line break JSON error
JSON 有点新,但我了解基础知识......我有一个与 Facebook Messenger API 集成的系统,Webhook 页面只是将数据转储到我的 MySql 数据库中,这样我就可以在我的系统上处理数据。 一切正常,直到用户发送带有换行符的消息。 我不能发布我所有的代码,但这里是基础知识:
My_Webhook_File.php
$input = file_get_contents('php://input');
$data = json_decode($input, true);
$sender = $data['entry'][0]['messaging'][0]['sender']['id'];
$message = $data['entry'][0]['messaging'][0]['message']['text'];
$message_id = $data['entry'][0]['messaging'][0]['message']['mid'];
$recipient = $data['entry'][0]['messaging'][0]['recipient']['id'];
if(!empty($sender)){
$db = db("INSERT INTO FB (senderid, sender_name, recipient, the_time, data, is_read) VALUES ('".numbersonly($sender)."', '".$fbname."', '".$recipient."', NOW(), '".json_encode($data)."', '".$is_read."')");
}
一切正常,直到用户直接从 FB 发送带有换行符 (SHIFT + ENTER) 的文本。 我试过只将“$input”的内容转储到数据库中,但仍然得到相同的结果。 我将如何解决这个问题? 我试过 nl2br 根本不起作用。
返回内容示例:
{"object":"page","entry":[{"id":"MY_PAGE_ID","time":1672599591761,"messaging":[{"sender":{"id":"SENDER_ID"},"recipient":{"id":"RECIPIENT_ID"},"timestamp":1672599591554,"message":{"mid":"MESSAGE_ID","text":"maybe
this
will
work"}}],"hop_context":[{"app_id":MY_APP_ID,"metadata":""}]}]}
它应该如何看:
{"object":"page","entry":[{"id":"MY_PAGE_ID","time":1672599591761,"messaging":[{"sender":{"id":"SENDER_ID"},"recipient":{"id":"RECIPIENT_ID"},"timestamp":1672599591554,"message":{"mid":"MESSAGE_ID","text":"maybe\nthis\nwill\nwork"}}],"hop_context":[{"app_id":MY_APP_ID,"metadata":""}]}]}
因此,经过大量研究,我想出了一个解决办法。 这是更新的方法。
我将 SQL 列“数据”设置为文本类型而不是 JSON,然后使用 str_replace() 修复额外的行。 可能有更简洁的方法,但它似乎有效:)
<?php
// $message['data'] is directly from the DB
// replace all carriage returns with ":linebreak" to avoid converting <br /> in htmlentities
$data = str_replace(array("\r", "\n"), ':linebreak:', $message['data']);
$m = json_decode($data);
if(is_array($m->entry[0]->messaging[0]->message->attachments ?? null)){
foreach($m->entry[0]->messaging[0]->message->attachments as $obj){
if($obj->type == "image"){
?>
<a href="<?php echo $obj->payload->url;?>" target="_blank"><img src="<?php echo $obj->payload->url;?>" width="100%"></a><br />
<?php
}
}
}
// clean up any potential HTML code the user may have sent or characters that can affect the output
$parsed_data = htmlentities(stripslashes($m->entry[0]->messaging[0]->message->text));
// now that htmlentities is done, replace ":linebreak:" with <br />
$data = str_replace(':linebreak:', '<br />', $parsed_data);
echo $data;
?>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.