FacebookメッセンジャーのWebhookを正常にセットアップしました。昨日までメッセージの送受信もできました。しかし、今日、ユーザーから1つのメッセージを送信すると、サーバーwebhook POST APIで複数の呼び出しが発生します。停止しないようです。
理解した。私はFacebookからのすべての通信に応答を送信していました。そのため、ACKメッセージにも応答することになりました。次に、もう1つのACKが来ました。それが無限ループにつながった理由です。
this ページでは、受信したメッセージのさまざまなオブジェクト構造を見つけることができます。
{
"object":"page",
"entry":[
{
"id":PAGE_ID,
"time":1457764198246,
"messaging":[
{
"sender":{
"id":USER_ID
},
"recipient":{
"id":PAGE_ID
},
"timestamp":1457764197627,
"message":{
"mid":"mid.1457764197618:41d102a3e1ae206a38",
"seq":73,
"text":"hello, world!"
}
}
]
}
]
}
{
"object":"page",
"entry":[
{
"id":PAGE_ID,
"time":1458668856451,
"messaging":[
{
"sender":{
"id":USER_ID
},
"recipient":{
"id":PAGE_ID
},
"delivery":{
"mids":[
"mid.1458668856218:ed81099e15d3f4f233"
],
"watermark":1458668856253,
"seq":37
}
}
]
}
]
}
したがって、区別するためにentry[0].messaging[0].message
を参照できます。これはユーザーが送信したメッセージにのみ存在します。コールバックまたはポストバックには、この部分は含まれていません。応答する前に、これを確認してください。存在する場合は応答し、存在しない場合は応答しないでください。
それらの通話はすべて同じ内容ですか、それとも異なりますか? Facebookが送信する正確なメッセージ文字列をログに記録し、それらに何が含まれているかを確認できます。
たとえば、ユーザーがメッセージを受信したことを通知するメッセージ配信コールバックがあります。 JSONは次のようになります。
{'delivery': {'mids': ['mid.146174459xxx:30a42600a95exxxxx'], 'seq': 429, 'watermark': 146174459xxx}, 'recipient': {'id': xxxxxxxx}, 'sender': {'id': xxxxxx}}
編集:あなたがない httpステータス200で着信を確認している場合もあります。FacebookがWebhookからエラーを受信した場合、メッセージは複数回送信されます。
私の問題も同様でしたが、複数のメッセージ配信の投稿を受け取っていました。数時間のフラストレーションの後、メッセージがすべてのデバイスに配信されるたびに Message Delivered callback が呼び出されることに気付きました。したがって、Webアプリとモバイルアプリの両方にログインしている場合、コールバックは2回呼び出されます。
Facebookのメッセンジャーを使用する場合は、メッセージを送信した後、次の2つのことを考慮する必要があります。
A) メッセージ配信
B) メッセージ読み取り
Webhookを使用しているため、これはイベントの1つが発生するたびにトリガーされます(メッセージの受信、送信したメッセージの配信、ユーザーによるメッセージの読み取り)。したがって、たとえばWebhookでmessage_deliveriesをアクティブ化し、アクションとしてメッセージを送信すると、ループが発生します。
これを処理する適切な方法は、基本コードにあります。 PHP例:
// Skipping delivery messages
if (!empty($message['delivery'])) {
#Do something here if you want
continue;
}
// Skipping read messages
if (!empty($message['read'])) {
#Do something here if you want
continue;
}
それが役に立てば幸い !