# 小程序第三方平台插件

> 由于单平台拥有多使用方会造成混乱且主体限制，单独部署平台的成本又较高，权衡利弊，故转为采用插件化的形式对接。

## 引入插件

```bash
npm i miniapp3rd --save
```

```ts
import miniapp3rd, { Miniapp3rd, MiniappType } from 'miniapp3rd'
```

## 使用方法

### 初始化

```ts
miniapp3rd.init(options)
```

options 如下表格，详细的字段类型和方法参数及返回值可以查看类型声明。

| 选项 | 描述 |
| --- | --- |
| **微信小程序第三方平台配置** | |
| WEMINIAPP.appId | APPID |
| WEMINIAPP.appSecret | APPSECRET |
| WEMINIAPP.messageToken | 消息校验Token |
| WEMINIAPP.encodingAESKey | 消息加解密Key |
| WEMINIAPP.oldEncodingAESKey | 消息加解密Key（旧），第一次填写时跟 encodingAESKey 填同一个值，后续消息加解密Key有更新时，把旧的填到该字段 |
| **百度小程序第三方平台配置** | |
| BDMINIAPP.clientOriginalId | id，数字字符串 |
| BDMINIAPP.clientId | key |
| BDMINIAPP.appSecret | secret |
| BDMINIAPP.messageToken | 消息加解密Token |
| BDMINIAPP.encodingAESKey | 消息加解密key |
| BDMINIAPP.oldEncodingAESKey | 参照 WEMINIAPP.oldEncodingAESKey |
| **下列 Register / Accessor 类方法的第一个参数均为 miniappType** | |
| ticketRegister | 票据注册器 |
| ticketAccessor | 票据访问器，返回票据 |
| accessTokenRegister | 令牌注册器 |
| accessTokenAccessor | 令牌访问器，返回 { accessToken, expiresIn, updatedAt } |
| authorizerAccessTokenRegister | 小程序接口调用令牌注册器 |
| authorizerAccessTokenAccessor | 小程序接口调用令牌访问器 |
| **其他** | |
| logger | 日志，不传则不会打印日志，使用到的 Level：debug、info、warn、error、fatal |

### 实现接口

#### 授权事件接收

第三方平台会通过你配置的**授权事件接收 URL**向你推送授权事件，收到请求先转送给插件处理：

```ts
miniapp3rd.oauth(miniappType: MiniappType, query: any, body: any)
```

如上，body 要提供未经处理的原始 body。如果是授权事件是**票据推送**类型，插件内部通过 ticketRegister 存储票据，方法不会返回什么东西，如果是小程序授权、取消授权、更新授权等类型，则会返回解密后的事件内容交给你去处理。

#### 消息事件接收

第三方平台会通过你配置的**消息与事件接收 URL**向你推送消息和事件，收到请求先转送给插件处理：

```ts
miniapp3rd.message(miniappType: MiniappType, query: any, body: any, authorizerAppId?: AuthorizerAppId)
```

如上，body 要提供未经处理的原始 body，authorizerAppId 是微信小程序第三方平台必需的。插件处理后返回解密后的消息和事件内容交给你去处理。

### 授权

```ts
miniapp3rd.getAuthLogin(miniappType: MiniappType, redirectUri: string, authType: number | string = 3, bizAppId?: string)
```

redirectUri 是授权成功后，跳转到的页面，实际实现可以是一个接口去处理授权结果，处理完后展示 HTML 页面。百度小程序第三方平台只需要 redirectUri 参数。

注意：授权页需要从你配置的**授权发起页域名**上的页面进行跳转！

另外是微信独有的 getAuthBind，在移动端链接快速授权：

```ts
miniapp3rd.getAuthBind (miniappType: MiniappType, redirectUri: string, authType: number | string = 3, bizAppId?: string)
```

### 接口开发

获取小程序接口调用令牌：

```ts
miniapp3rd.getAuthorizerAccessToken(miniappType: MiniappType, authorizerAppId: AuthorizerAppId)
```

该方法会自动通过 authorizerAccessTokenAccessor 去获取小程序的接口调用令牌，如果过期则用 refreshToken 去刷新并通过 authorizerAccessTokenRegister 存回去。

手头有了小程序接口调用令牌，就可以去调用接口了：

```ts
miniapp3rd.weminiappOpenapi.request
miniapp3rd.bdminiappOpenapi.request
```

## 后续

后续可能会提供部分代开发接口的统一调用方法来代替调用 request。

---

this.ctx.request.rawBody

获取授权码的链接必须是配置里的授权发起页域名下的链接

收到 ticket 返回纯字符串 success
