2017-10-25 17 views
0

私のFacebookページのFacebook leadgen webhookは、私のページに投稿されたすべてのフォームのリードを2つ作成しています。Facebook leadgen webhook duplicate leadsを作成する

Facebook leadgen testerを使用すると、リードは1回だけ作成されます。テストリードを生成するだけでなく、手動でフォームに記入することでこれを試してみました。しかし、実際の人がFacebook上でリードを提出すると、リードはCRM上に2回作成されます。これにより、Facebookは、Webhookを再度呼び出す必要がないことを通知する何らかの確認をFacebookが期待していると考えられます。

確認メッセージの返信に関するご意見は本当に役に立ちます。

編集:さらにテストすると、Heroku dynoがスリープ状態になり、リードが生成されたときに重複が発生します。これはwebhookを実行させますが、Facebookからのアプリの応答は失敗します。これにより、リードが再度送信され、2度目の成功です。

質問:アプリがスリープからアウェイクに設定されているときに、最初のインスタンスで成功メッセージを送信する方法。

ウェブフックで使用されるコードは次のとおりです。

<?php 
require_once('./autoload.php'); 
$input = json_decode(file_get_contents('php://input'),true); 
$leadgen_id = $input["entry"][0]["changes"][0]["value"]["leadgen_id"]; 
$user_access_token = MYTOKEN; 

function getLead($leadgen_id,$user_access_token) { 
    //fetch lead info from FB API 
    $graph_url = 'https://graph.facebook.com/v2.9/' . $leadgen_id. "?access_token=" . $user_access_token; 
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, $graph_url); 
    curl_setopt($ch, CURLOPT_HEADER, 0); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); 
    $output = curl_exec($ch); 
    curl_close($ch); 

    //work with the lead data and pass to an array 
    $leaddata = json_decode($output); 
    $lead = array(); 
    for($i=0; $i<count($leaddata->field_data); $i++) { 
     $lead[$leaddata->field_data[$i]->name]=$leaddata->field_data[$i]->values[0]; 
     //error_log(print_r($lead, true)); 
    } 
    return $lead; 
} 

$lead = getLead($leadgen_id,$user_access_token); 


//Pass array to CRM specific array 
$queryData = http_build_query(array(
'fields' => array(
"TITLE" => $lead['full_name'], 
"STATUS_ID" => "NEW", 
"OPENED" => "Y", 
"ASSIGNED_BY_ID" => 1, 
"PHONE" => array(array("VALUE" => $lead['phone_number'], "VALUE_TYPE" => "WORK")), 
"EMAIL" => array(array("VALUE" => $lead['email'], "VALUE_TYPE" => "WORK")), 
"Custom_field_1" => $input["entry"][0]["changes"][0]["value"]["created_time"], 
"Custom_field_2" => $input["entry"][0]["changes"][0]["value"]["page_id"], 
"Custom_field_3" => $input["entry"][0]["changes"][0]["value"]["form_id"], 
"Custom_field_4" => $input["entry"][0]["changes"][0]["value"]["leadgen_id"], 
"Custom_field_5" => "Facebook" 
), 
'params' => array("REGISTER_SONET_EVENT" => "Y") 
)); 


//Call the CRM JSON 
$queryUrl = 'MYCRM/crm.lead.add.json'; 


$curl = curl_init(); 
curl_setopt_array($curl, array(
CURLOPT_SSL_VERIFYPEER => 0, 
CURLOPT_POST => 1, 
CURLOPT_HEADER => 0, 
CURLOPT_RETURNTRANSFER => 1, 
CURLOPT_URL => $queryUrl, 
CURLOPT_POSTFIELDS => $queryData, 
)); 

$result = curl_exec($curl); 
curl_close($curl); 
$result = json_decode($result, 1); 

?> 
+1

エンドポイントは200 OKステータスコードを返すだけで済みますが、_quickly_する必要があります。 Facebookは失敗とみなす前に、最大で2秒以内で対応する必要があります。あなたのオプションは、いつでも "siestas"を取っていない基本的なアーキテクチャに切り替えるか、あなたの最後の重複を無視するだけです(次に、その目的のために格納するユニークな識別子を見つけ出します。次の着信リードを既に存在するリードと比較してください)。 – CBroe

答えて

0

妥当な量の調査の後。この問題は間違いなくコードにあります。それは、Herokuのダイノスが30分ごとに睡眠状態に入ることと関係しています。

一時的な解決策:ダイノックスを人工的に目を覚ますためにKaffeine Appを使用してください。ここでの問題は、1ヶ月当たりのダイノー時間が制限されていることです(550時間)。一時的な回避策は、お支払い情報を追加して450時間を追加することです。

永続的な解決策:ダイノスが常に起き続けることを可能にする有料版のヘロクに移動します。

アプリがフロントエンドでなくて、おそらく1日に10〜15回呼び出されるため、一時的な解決策は私にとっては今のところ機能します。エンドポイントは重複を識別/排除できないため、重複リード問題には解決が必要でした。

関連する問題