uni-open-bridge-common.md 8.7 KB
Newer Older
d-u-a's avatar
d-u-a 已提交
1 2 3 4 5 6
# uni-open-bridge-common

`uni-open-bridge-common``uni-id` 体系中用于 `开放平台数据` 管理的公共模块。

> `云函数公共模块`是不同云函数共享代码的一种方式。如果你不了解什么是`云函数公共模块`,请另读文档[公共模块](https://uniapp.dcloud.io/uniCloud/cf-common)

d-u-a's avatar
d-u-a 已提交
7 8 9 10
调用微信绝大多数后台接口时都需使用 `access_token``session_key``ticket`,开发者需要进行妥善保存。为了解决这个问题,使用公共模块 `uni-open-bridge-common` 统一调用

`uni-open-bridge-common` 有配套的云对象 `uni-open-bridge`, 可免维护 `access_token``ticket` 调用,[详情](/uni-open-bridge)

d-u-a's avatar
d-u-a 已提交
11 12 13 14 15 16
`uni-open-bridge-common` 提供了 `access_token``session_key``encrypt_key``ticket` 的读取、写入、删除操作。

`uni-open-bridge-common` 支持多层 读取 / 写入 机制,`redis -> database -> fallback`,优先级如下:

如果用户没有开通 `redis` 或者操作失败,透传到 `database``database` 失败后,如果用户配置了 `fallback`,继续调用 `fallback` 方法,否则抛出 `Error`

17 18
`database` 对应的表为: `opendb-open-data`

d-u-a's avatar
d-u-a 已提交
19 20 21 22 23 24

## access_token

`access_token` 是微信小程序全局唯一后台接口调用凭据,调用绝大多数后台接口时都需使用。开发者可以通过 getAccessToken 接口获取并进行妥善保存。[详情](https://developers.weixin.qq.com/miniprogram/dev/framework/server-ability/backend-api.html#access_token)


d-u-a's avatar
d-u-a 已提交
25
### getAccessToken(key: Object, fallback: Function)
d-u-a's avatar
d-u-a 已提交
26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81

读取 access_token


### setAccessToken(key: Object, value: Object, expiresIn: Number)

写入 access_token


### removeAccessToken(key: Object)

删除 access_token


### key 属性

|参数				|类型			|必填	|描述																															|
|:-:				|:-:			|:-:	|:-:																															|
|dcloudAppid|String		|是		|DCloud应用appid。[详情](https://ask.dcloud.net.cn/article/35907)	|
|platform		|String		|是		|[详情](#platform)																								|

### value 属性

|参数					|类型		|描述					|
|:-:					|:-:		|:-:					|
|access_token	|String	|							|

### expiresIn

有效时间(秒)


### 示例代码

```js
'use strict';

const {
  getAccessToken,
  setAccessToken,
  removeAccessToken
} = require('uni-open-bridge-common')

exports.main = async (event, context) => {
  const key = {
    dcloudAppid: '',
    platform: ''
  }
  const value = {
    access_token: ''
  }
  const expiresIn = 7200

  // 写入 (redis / 数据库)
  await setAccessToken(key, value, expiresIn)

82
  // 读取 (redis / 数据库)
d-u-a's avatar
d-u-a 已提交
83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
  let result1 = await getAccessToken(key)

  // 删除
  await removeAccessToken(key)


  // 删除后读取, 返回 null
  let result2 = await getAccessToken(key)
  console.log(result2) // null

  return null
};
```


## user_key

100 101 102 103 104
平台对应的值

|平台				|值					|描述																																																								|
|:-:				|:-:				|:-:																																																								|
|微信小程序	|session_key|微信小程序会话密钥。[详情](https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/user-login/code2Session.html)	|
d-u-a's avatar
d-u-a 已提交
105 106


d-u-a's avatar
d-u-a 已提交
107
### getUserKey(key: Object, fallback: Function)
d-u-a's avatar
d-u-a 已提交
108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130

读取 user_key


### setUserKey(key: Object, value: Object, expiresIn: Number)

写入 user_key


### removeUserKey(key: Object)

删除 user_key


### key 属性

|参数				|类型			|必填	|描述																															|
|:-:				|:-:			|:-:	|:-:																															|
|dcloudAppid|String		|是		|DCloud应用appid。[详情](https://ask.dcloud.net.cn/article/35907)	|
|platform		|String		|是		|[详情](#platform)																								|
|openid			|String		|是		|																																	|
|fallback		|Function	|否		|[详情](#fallback)																								|

131 132 133 134 135 136
### value 属性

|参数				|类型		|描述								|
|:-:				|:-:		|:-:								|
|session_key|String	|微信小程序会话密钥	|

d-u-a's avatar
d-u-a 已提交
137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166
### expiresIn

有效时间(秒)


### 示例代码

```js
'use strict';

const {
  getUserKey,
  setUserKey,
  removeUserKey,
} = require('uni-open-bridge-common')

exports.main = async (event, context) => {
  const key = {
    dcloudAppid: '',
    platform: '',
    openid: ''
  }
  const value = {
    'session_key': ''
  }
  const expiresIn = 7200

  // 写入 (redis / 数据库)
  await setUserKey(key, value, expiresIn)

167
  // 读取 (redis / 数据库)
d-u-a's avatar
d-u-a 已提交
168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189
  let result1 = await getUserKey(key)

  // 删除
  await removeUserKey(key)


  // 删除后读取, 返回 null
  let result2 = await getUserKey(key)
  console.log(result2) // null

  return null
};
```


## encrypt_key

为了避免小程序与开发者后台通信时数据被截取和篡改,微信侧维护了一个用户维度的可靠key,用于小程序和后台通信时进行加密和签名。[详情](https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/user-encryptkey.html)

开发者可以分别通过小程序前端和微信后台提供的接口,获取用户的加密 key。


d-u-a's avatar
d-u-a 已提交
190
### getEncryptKey(key: Object, fallback: Function)
d-u-a's avatar
d-u-a 已提交
191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254

读取 encrypt_key


### setEncryptKey(key: Object, value: Object, expiresIn: Number)

写入 encrypt_key


### removeEncryptKey(key: Object)

删除 encrypt_key


### key 属性

|参数				|类型			|必填	|描述																															|
|:-:				|:-:			|:-:	|:-:																															|
|dcloudAppid|String		|是		|DCloud应用appid。[详情](https://ask.dcloud.net.cn/article/35907)	|
|platform		|String		|是		|[详情](#platform)																								|
|openid			|String		|是		|																																	|
|version		|Number		|是		|版本																															|
|fallback		|Function	|否		|[详情](#fallback)																								|


### value 属性

|参数				|类型		|描述			|
|:-:				|:-:		|:-:			|
|encrypt_key|String	|加密 key	|
|iv					|String	|加密 iv	  |

### expiresIn

有效时间(秒)


### 示例代码

```js
'use strict';

const {
  getEncryptKey,
  setEncryptKey,
  removeEncryptKey
} = require('uni-open-bridge-common')

exports.main = async (event, context) => {
  const key = {
    dcloudAppid: '',
    platform: '',
    openid: '',
    version: 1
  }
  const value = {
    encrypt_key: '',
    iv: ''
  }
  const expiresIn = 7200

  // 写入 (redis / 数据库)
  await setEncryptKey(key, value, expiresIn)

255
  // 读取 (redis / 数据库)
d-u-a's avatar
d-u-a 已提交
256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271
  let result1 = await getEncryptKey(key)

  // 删除
  await removeEncryptKey(key)

  // 删除后读取, 返回 null
  let result2 = await getEncryptKey(key)
  console.log(result2) // null

  return null
};
```


## ticket

d-u-a's avatar
d-u-a 已提交
272
`ticket` 是公众号用于调用微信 JS 接口的临时票据。[详情](https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html#62)
d-u-a's avatar
d-u-a 已提交
273 274


d-u-a's avatar
d-u-a 已提交
275
### getTicket(key: Object, fallback: Function)
d-u-a's avatar
d-u-a 已提交
276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332

读取 ticket


### setTicket(key: Object, value: Object, expiresIn: Number)

写入 ticket


### removeTicket(key: Object)

删除 ticket


### key 属性

|参数				|类型			|必填	|描述																															|
|:-:				|:-:			|:-:	|:-:																															|
|dcloudAppid|String		|是		|DCloud应用appid。[详情](https://ask.dcloud.net.cn/article/35907)	|
|platform		|String		|是		|[详情](#platform)																								|
|fallback		|Function	|否		|[详情](#fallback)																								|

### value 属性

|参数				|类型		|描述			|
|:-:				|:-:		|:-:			|
|ticket			|String	|					|

### expiresIn

有效时间(秒)


### 示例代码

```js
'use strict';

const {
  getTicket,
  setTicket,
  removeTicket
} = require('uni-open-bridge-common')

exports.main = async (event, context) => {
  const key = {
    dcloudAppid: '',
    platform: ''
  }
  const value = {
    ticket: ''
  }
  const expiresIn = 7200

  // 写入 (redis / 数据库)
  await setTicket(key, value, expiresIn)

333
  // 读取 (redis / 数据库)
d-u-a's avatar
d-u-a 已提交
334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364
  let result1 = await getTicket(key)

  // 删除
  await removeTicket(key)


  // 删除后读取, 返回 null
  let result2 = await getTicket(key)
  console.log(result2) // null

  return null
};
```


## Platform@platform

平台对应的值

|值					|描述				|
|:-:				|:-:				|
|mp-weixin	|微信小程序	|
|app-weixin	|微信 App	  |
|h5-weixin	|微信公众号	|
|web-weixin	|微信pc网页	|
|mp-qq			|QQ 小程序		|
|app-qq			|QQ App			|


## fallback@fallback

365
可选 `async function fallback()`,当 `reids -> database` 都找不到对应 `key` 时,调用此方法,需要返回数据格式如下
d-u-a's avatar
d-u-a 已提交
366 367 368 369 370 371 372 373

```json
{
  value: null,
  duration: 1
}
```

d-u-a's avatar
d-u-a 已提交
374
为了简化调用 `getAccessToken()``getTicket()` 已内置 `fallback` 到微信的服务器,需要在 `config-center` 中配置 `appid` `appsecret`
d-u-a's avatar
d-u-a 已提交
375 376 377 378


注意事项
- 所有方法类型为 `async`,需要使用 `await`
379
- 所有方法校验 `key` 属性是否有效,无效则 `throw new Error()`,对 `value` 仅校验是否为 `undefined`