事前準備,您需要有一個Facebook app,也要有一個粉絲頁,你還要是粉絲頁的管理員
1、進入到您的應用添加Messenger 平臺
2、進入到設置,需要添加您要的粉絲頁主頁,然後再添加Webhooks
3、Webhooks驗證的開發,進入到開發文檔,這裏官方是使用js的,我們這裏使用java進行開發驗證,從文檔上看,我們需要做兩件事,寫一個/webhook的驗證接口,其中是區分get和post,get是用來驗證的,post是用來接收信息的,這裏的返回內容都是有要求的,按文檔的做就行了,驗證的參數有三個hub.mode,hub.verify_token,hub.challenge,hub.verify_token參數就是我們自己定義的一個驗證token,再設置Webhook的時候需要填寫的。而接收的post方法,Facebook是以json的數據過來的,字段是看你發什麼信息,基礎的是page字段,entry字段,entry就是消息的主體。
4、回到應用的Messenger設置,Webhook設置驗證後需要增加權限,messages、messaging_postbacks等基礎的權限,根據您的需要進行添加即可。重點來了,到這裏全部設置好之後我們就可以再粉絲頁發個消息進行測試了,劃重點,考試送分的,測試的fb賬號需要是管理員,進入到您的粉絲頁主頁發條信息
5、在我們接收消息的方法裏面可以收到fb發過來的信息
{"object":"page","entry":[{"id":"1105231312976257","time":1587629080411,"messaging":[{"sender":{"id":"2764402560274235"},"recipient":{"id":"1105231312976257"},"timestamp":1587629079993,"message":{"mid":"m_SUQ5zeaI3BGC3oSwxs7at6FWwx-_n2TKGDjWsi318asN8PKos_gt5WqrLnQAby7hh4Pj0QyRUwnf5_4i5bxiQg","text":"hello"}}]}]}
6、接口的簡單編寫
驗證接口:
/**
* fb Webhook驗證
* @param mode
* @param verifyToken
* @param challenge
* @return
*/
@RequestMapping(value="/webhook",method=RequestMethod.GET)
@ResponseBody
public final ResponseEntity setupWebhookVerification(@RequestParam("hub.mode") String mode,
@RequestParam("hub.verify_token") String verifyToken, @RequestParam("hub.challenge") String challenge,HttpServletRequest request) {
logger.info("getHeadersInfo:"+JSON.toJSONString(GUtil.getHeadersInfo(request)));
logger.info("getParamsInfo:"+JSON.toJSONString(GUtil.getParamsInfo(request)));
logger.info("mode:"+mode+"\n verifyToken:"+verifyToken+"\n challenge:"+challenge);
System.out.println("----getwebhook12-----");
//需要看過來的日誌
if (mode.equalsIgnoreCase("subscribe") && VerificationFbToken.equals(verifyToken)) {
return ResponseEntity.ok(challenge);
} else {
return new ResponseEntity(HttpStatus.FORBIDDEN);
}
}
接收消息接口
/**
* 接收fb發送的信息
* @param fbReqBody
* @param request
* @param response
* @return
*/
@RequestMapping(value="/webhook",method=RequestMethod.POST)
@ResponseBody
public ResponseEntity setUpWebhookMessage(HttpServletRequest request) {
logger.info("getHeadersInfo:"+JSON.toJSONString(GUtil.getHeadersInfo(request)));
logger.info("getParamsInfo:"+JSON.toJSONString(GUtil.getParamsInfo(request)));
BufferedReader br;
try {
br = new BufferedReader(new InputStreamReader((ServletInputStream) request.getInputStream(), "utf-8"));
StringBuffer sb = new StringBuffer("");
String temp;
while ((temp = br.readLine()) != null) {
sb.append(temp);
}
br.close();
String params = sb.toString();
logger.info("paramsjson:"+params);
System.out.println("返回數據:"+params);
JSONObject json= JSON.parseObject(params);
if(!json.getString("object").equalsIgnoreCase("page")) {
return new ResponseEntity(HttpStatus.NOT_FOUND);
}else {
return ResponseEntity.ok("EVENT_RECEIVED");
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
return new ResponseEntity(HttpStatus.NOT_FOUND);
}
}