
# 接收并处理facebook发送的上行消息接口
#### 接口功能
接受并处理facebook发送的上行消息。
#### 使用说明
- 前提条件 已通过鉴权，和ccmessaging对接成功。
  
- 详见官方文档：https://developers.facebook.com/
 
#### 接口鉴权
```
获取请求头X-Hub-Signature-XX 里面的鉴权字符串，将request里面的参数与渠道配置里的secretKey加密进行对比，相同鉴权通过。
        String algorithm = channelConfig.getAlgorithm();
        String signature = "";
        if (AlgorithmEnum.SHA256.getValue().equals(algorithm)) {
            String signatureHeader = request.getHeader("X-Hub-Signature-256");
            // 校验signatureHeaderSha256
            if (StringUtils.isTrimEmpty(signatureHeader)) {
                log.error("sha256 Signature from facebook is empty");
                return false;
            }
            signature = StringUtils.substringAfter(signatureHeader, "sha256=");
        } else {
            String signatureHeader = request.getHeader();
            // 校验signatureHeader
            if (StringUtils.isTrimEmpty(signatureHeader)) {
                log.error("sha1 Signature from facebook is empty");
                return false;
            }
            signature = StringUtils.substringAfter(signatureHeader, "sha1=");
        }
        String hash;
        try {
            hash = getSignatureByAlgorithm(payloadContent, secretKey, channelConfig.getAlgorithm());
        } catch (Exception e) {
            log.error("Fail to get the signature, and the exception is {}", e.getMessage());
            return false;
        }
        return StringUtils.equals(hash, signature);
```
![](https://support.huaweicloud.com/api-ccfs-cec/public_sys-resources/note_3.0-zh-cn.png)
sha1加密算法存在安全风险，请谨慎使用。
#### 接口原型
表1接口原型说明 
|   请求方法    |                                                                                                 POST                                                                                                  ||
|---|---|---|
| **请求URL** | https://ip:port/social/on/facebook/{channelId} | 其中，ip:port为对外暴露的nslb的ip和port， channelId为渠道id |
   
#### 请求参数
表2请求Headers参数说明 
| 参数名称                     | 选取原则 | 参数类型   | 说明                                  |
|:---|:---|:---|:---|
| Content-Type             | 必选   | String | 固定填 application/json;charset=UTF-8。 |
| X-Hub-Signature-***XX*** | 必选   | String | facebook鉴权信息                        |
   
表3请求Body中request参数说明 
| 参数名称   | 选取原则 | 参数类型      | 说明                                                                                                                                |
|:---|:---|:---|:---|
| object | 必选   | String    | 请求对象结构体                                                                                                                           |
| entry  | 必选   | JSONArray | entry中包含事件数据，详情见[表4] |
   
 表4entry参数说明 
| 参数名称      | 选取原则 | 参数类型      | 说明                                                                                                                                     |
|:---|:---|:---|:---|
| id        | 必选   | String    | page主页编号                                                                                                                               |
| time      | 必选   | long      | 请求时间                                                                                                                                   |
| messaging | 必选   | JSONArray | messaging webhook事件，详情见[表5] |
   
 表5messaging参数说明 
| 参数名称      | 选取原则 | 参数类型       | 说明                                                                                                                      |
|:---|:---|:---|:---|
| message   | 必选   | JSONObject | 事件内容，详见[表6] |
| sender    | 必选   | JSONObject | 发送者id，格式： {"id":"5465176836886605"}                                                                                     |
| timestamp | 必选   | Long       | 消息发送时间                                                                                                                  |
| recipient | 必选   | JSONObject | 格式：{"id":"107416531546370"}                                                                                             |
   
 表6message参数说明 
| 参数名称 | 选取原则 | 参数类型   | 默认值 | 说明             |
|:---|:---|:---|:---|:---|
| mid  | 必选   | String | 无   | 消息id，messageId |
| text | 必选   | String | 无   | 消息内容           |
   
#### 响应参数
当调用本接口响应成功，无响应内容；
当调用本接口响应失败，响应错误状态码和错误描述。
#### 接口示例
- 请求示例
  ```
  POST /social/on/facebook/202108135240338790
  host : 10.10.10.2:28090
  connection : Keep-Alive
  x-forwarded-for : 10.10.10.3, 10.10.10.4
  x-real-ip : 10.10.10.5
  content-length : 314
  remote-host : 10.10.10.6
  accept : */*
  accept-encoding : deflate, gzip
  user-agent : facebookexternalua
  content-type : application/json
  x-hub-signature-256 : sha256=599c****************3bc
  facebook-api-version : v8.0
  {
  "object" : "page",
  "entry" : [{
  "id" : "107416531546370",
  "time" : 1629191082254,
  "messaging" : [{
  "sender" : {
  "id" : "5465176836886605"
  },
  "recipient" : {
  "id" : "107416531546370"
  },
  "timestamp" : 1629191082001,
  "message" : {
  "mid" : "m_5ugOgGm2v5x36EyvvInnNOwvV5bGYdVdhgz8VK0mdjnLC3qm8PfaQZdWwAsLOg8hiDIqmpkcYQtllLH_tDzl7A",
  "text" : "jianlian"
  }
  }
  ]
  }
  ]
  }
  ```
  
 
