# 小程序私密消息

## 功能介绍

小程序私密消息功能是这样一种能力：当分享者分享小程序卡片给其他用户或者微信群后，其他用户点击此小程序卡片时，开发者可以鉴别出点击卡片的用户是否被分享者分享过小程序卡片。

## 使用说明

### 1. 分享

创建业务活动后、分享小程序消息前，需要通过后台接口 [createActivityId](/miniprogram/dev/server/API/mp-message-management/updatable-message/api_createactivityid.md) 创建`activityId`，建立一个`activityId`与一个业务活动 ID 唯一关联。

然后通过 [wx.updateShareMenu](/miniprogram/dev/api/share/wx.updateShareMenu.md) 接口声明本次分享的消息为私密消息，私密消息具有不可二次转发性。

声明完成后，可以通过右上角菜单、分享按钮组件、wx.shareAppMessage（仅小游戏）分享私密消息给个人、群聊。

#### 场景一：个人分享给个人
  A --> B 

#### 场景二：个人分享给群
  A --> [B, C, D, E]

示例代码
```js
wx.updateShareMenu({
  withShareTicket: true,
  isPrivateMessage: true,
  activityId: 'xxx',
})
```

### 2. 验证

从群聊、单聊消息卡片进入小程序时，通过 [wx.authPrivateMessage](/miniprogram/dev/api/share/wx.authPrivateMessage.md) 接口可以验证当前用户是否是私密消息的接收者，即验证这条消息是否是**A直接转发给B**或者**A转发给B所在的群**。

该接口使用前，需要通过 [wx.login()](/miniprogram/dev/api/open-api/login/wx.login.md) 接口登录小程序。

#### 接口参数
| 参数       | 类型    | 说明                      |
|------------|---------|---------------------------|
| shareTicket       | string    | shareTicket                      |

#### success 回调
| 参数       | 类型    | 说明                      |
|------------|---------|---------------------------|
| valid  | Boolean   | 验证是否通过 |
| iv | String   | 加密算法的初始向量，详细见[加密数据解密算法](/miniprogram/dev/framework/open-ability/signature)       |
| encryptedData | String   | 经过加密的 `activityId`，解密后可得到原始的 `activityId`。若解密后得到的 `activityId` 可以与开发者后台的活动 ID 对应上则验证通过，否则表明 `valid` 字段不可靠（被篡改） 详细见[加密数据解密算法](/miniprogram/dev/framework/open-ability/signature)       |

## 注意事项
  - 若返回的`valid`字段为`false`，表示此次验证不通过。
  - 若返回的`valid`字段为`true`，表示验证通过。但是为了安全起见，预防`valid`字段被篡改的可能，可以把`encryptedData`和`iv`传到开发者后台去解密。若解密后得到的`activityId`就是当前活动所对应的`activityId` 则验证通过，否则表示验证不通过。
  - 当私密消息分享给群时，是按鉴别时刻用户是否在群里作为判断。
  - `activityId` 创建后 7 天内分享有效，120 天内验证有效。 

## 示例代码

```js
wx.authPrivateMessage({
  shareTicket: 'xxxxxx',
  success(res) {
    console.log('authPrivateMessage success', res)
    // res
    // {
    //   errMsg: 'authPrivateMessage:ok'
    //   valid: true
    //   iv: 'xxxx',
    //   encryptedData: 'xxxxxx'
    // }
  },
  fail(res) {
    console.log('authPrivateMessage fail', res)
  }
})
```
