Skip to content

Commit

Permalink
Merge pull request #321 from ifanrx/nickname-avatar-update-support
Browse files Browse the repository at this point in the history
新增微信小程序更新头像和昵称描述
  • Loading branch information
jiajun-ifanr authored Nov 22, 2022
2 parents f8347ed + 319d2d9 commit e5fb8a3
Show file tree
Hide file tree
Showing 3 changed files with 159 additions and 119 deletions.
6 changes: 5 additions & 1 deletion cloud-function/node-sdk/wx-update-user-info.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
# 微信更新用户信息
# <span style="color: #f04134;">`已废弃`</span> 微信更新用户信息

> **danger**
> 从 2022 年 11 月 8 日 24 时开始,小程序 `wx.getUserProfile``wx.getUserInfo` 接口将被微信收回,其中获取用户头像将统一返回默认灰色头像,昵称将统一返回“微信用户”。请参考 [小程序用户头像昵称获取规则调整公告](https://developers.weixin.qq.com/community/develop/doc/00022c683e8a80b29bed2142b56c01)
<!-- 分隔符 -->
> **info**
> SDK >= 3.17.0
Expand Down
32 changes: 32 additions & 0 deletions js-sdk/account.md
Original file line number Diff line number Diff line change
Expand Up @@ -239,6 +239,38 @@ user 为 currentUser 对象,该对象的说明见上文

err 对象结构请参考[错误码和 HError 对象](/js-sdk/error-code.md)

### 设置头像和昵称

设置头像和昵称与[数据表更新数据项](schema/update-record.md)方法基本一致。

> **info**
> 基于安全考虑,设置头像和昵称需先进行违规检测。详见 [检测违规图片、音频、文本](./wechat/censor.md)
**请求示例**

{% ifanrxCodeTabs %}
```js
// 下面以更新昵称为例:
const updateNickname = async () => {
const nickname = 'John Doe'

try {
const censor = await wx.BaaS.wxCensorText(nickname)

if (censor.data.risky) {
// 处理昵称文本不合法的情况...
return
}

const user = await wx.BaaS.auth.getCurrentUser()
user.set('nickname', nickname).update()
} catch (error) {
// 处理错误情况 HError
}
}
```
{% endifanrxCodeTabs %}


### 设置邮箱

Expand Down
240 changes: 122 additions & 118 deletions js-sdk/wechat/signin-signout.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,18 +13,22 @@

SDK 提供了快速登录小程序的接口,省去使用微信登录接口时获取 code, session_key 等辅助操作。

> **danger**
> 从 2022 年 11 月 8 日 24 时开始,小程序 `wx.getUserProfile``wx.getUserInfo` 接口将被微信收回,其中获取用户头像将统一返回默认灰色头像,昵称将统一返回“微信用户”。请参考 [小程序用户头像昵称获取规则调整公告](https://developers.weixin.qq.com/community/develop/doc/00022c683e8a80b29bed2142b56c01)
>
> 为应对微信的调整,小程序 SDK 提供更新头像和昵称支持。通过 `wx.BaaS.auth.getCurrentUser()` 获取当前用户,并执行内置的 `update()` 方法即可达成更新。详见 [设置头像和昵称](../account.md#设置头像和昵称)
<!-- 分隔符 -->
> **danger**
> 从 2021 年 4 月 28 日后发布的小程序新版本,无法通过 wx.getUserInfo 与 `<button open-type="getUserInfo"/>` 获取加密的用户个人信息,而需要通过新增的 getUserProfile 接口获取。请参考 [小程序登录、用户信息相关接口调整说明](https://developers.weixin.qq.com/community/develop/doc/000cacfa20ce88df04cb468bc52801?blockType=1)
>
> 为应对微信的调整,小程序 SDK v3.18.0 中将会调整 `wx.BaaS.auth.loginWithWechat()` 登录方法,只保留静默登录和一键授权手机号登录两部分,并提供新的更新用户信息方法 `wx.BaaS.auth.updateUserInfo()`。弹框授权个人信息的执行时机将会返回给开发者自行判断。
<!-- 分隔两个 info -->
<!-- 分隔符 -->
> **info**
> 注意:新发布的小程序中,开发者在用户登录时可直接获取到 unionID。
小程序建议的登录流程是,可通过 `wx.BaaS.auth.loginWithWechat()` 获取用户 openID,这时无需弹框授权,开发者拿到 openID 可以建立自身的帐号 ID。当必须要获得用户的头像昵称等信息时,调用 `wx.getUserProfile` 接口,并将返回结果通过 `wx.BaaS.auth.updateUserInfo()` 方法更新用户信息。

同时,云函数 Node-SDK 也提供更新用户信息方法,详见[这里](/cloud-function/node-sdk/wx-update-user-info.md)。默认情况下只允许云函数更新用户信息,如需要开启 JS-SDK 更新,可在控制台 `开发 - 设置 - SDK - 微信小程序` 中打开 `允许在 SDK 更新用户信息` 开关。
小程序建议的登录流程是,可通过 `wx.BaaS.auth.loginWithWechat()` 获取用户 openID,这时无需弹框授权,开发者拿到 openID 可以建立自身的帐号 ID。

## 静默登录

Expand Down Expand Up @@ -145,112 +149,6 @@ catch 回调中的 res 对象示例:

res 对象结构请参考[错误码和 HError 对象](/js-sdk/error-code.md)


## 更新用户信息

开发者需要提前调用 `wx.getUserProfile` 获取用户信息,并调用以下方法更新。

`wx.BaaS.auth.updateUserInfo(data, {code, syncUserProfile})`

> **danger**
> 注意:在微信开发者工具中使用基础库版本小于 2.16.0 并调用 `wx.getUserProfile` 时是无法获取到 iv、rawData、signature 和 encryptedData 等字段的。为应对微信的调整,小程序基础库版本大于等于 2.16.0 时开发者需要先通过 `wx.login` 获取用户登录凭证 `code`,并调用 `wx.getUserProfile` 获取用户信息,再传入 `updateUserInfo` 方法。基础库版本小于 2.16.0 则无需调用 wx.login 方法,直接调用 wx.getUserProfile 即可。
>
> 同时,由于微信限制了 wx.getUserProfile 不能直接在 wx.login 的回调中调用,因此开发者需注意调用方法的顺序。也就是说,先调用 `wx.login` 方法,再调用 `wx.getUserProfile`。SDK 推荐使用 Promise.all 的方式处理上述问题。
<!-- 分隔两个 info -->
> **info**
> 由于 `wx.getUserProfile` 必须在点击事件里触发,无法直接在回调中调用,因此开发者需要注意区分登录 `wx.BaaS.auth.loginWithWechat``wx.getUserProfile` 的调用时机。
**参数说明**

| 参数 | 类型 | 必填 | 说明 |
| :-------------- | :------ | :------ | :----------- |
| data | Object || wx.getUserProfile 事件回调返回的参数 |
| code | Object || 用户登录凭证,基础库大于等于 2.16.0 时必填 |
| syncUserProfile | String || 是否[同步第一层级用户信息](/js-sdk/account.md#同步第一层级用户信息),可选值为 `overwrite``setnx``false`,默认值为 `setnx`|

**请求示例**

基础库版本大于等于 `2.16.0`

```js
Page({
// ...
updateUserInfo() {
const _getLoginCode = new Promise(resolve => {
wx.login({
success: res => resolve(res.code)
})
})

const _getUserProfile = new Promise(resolve => {
wx.getUserProfile({
desc: '获取用户信息',
success: res => resolve(res)
})
})

Promise.all([_getLoginCode, _getUserProfile]).then(result => {
const [code, userProfile] = result
wx.BaaS.auth.updateUserInfo(userProfile, {code}).then(res => {
// user 包含用户完整信息,详见下方描述
}, err => {
// **err 有两种情况**:用户拒绝授权,HError 对象上会包含基本用户信息:id、openid、unionid;其他类型的错误,如网络断开、请求超时等,将返回 HError 对象(详情见下方注解)
})
})
},
// ...
})
```

基础库小于 `2.16.0`

```js
Page({
// ...
updateUserInfo() {
wx.getUserProfile({
desc: '更新用户信息',
success: data => {
wx.BaaS.auth.updateUserInfo(data).then(user => {
// user 包含用户完整信息,详见下方描述
}, err => {
// **err 有两种情况**:用户拒绝授权,HError 对象上会包含基本用户信息:id、openid、unionid;其他类型的错误,如网络断开、请求超时等,将返回 HError 对象(详情见下方注解)
})
}
})
},
// ...
})
```

**用户同意授权返回示例**
then 回调中的 user 对象为 currentUser 对象,请参考[currentUser 小节](../account.md)


**用户拒绝授权示例**
catch 回调中的 HError 对象示例:

```json
{
"id": 61736923,
"openid": "ofo380BgVHDSf3gz0QK1DYPGnLxx",
"unionid": "",
"code": 603,
"message": "unauthorized"
}
```

**其他错误**
catch 回调中的 res 对象示例:

res 对象结构请参考[错误码和 HError 对象](/js-sdk/error-code.md)

> **info**
> `wx.BaaS.auth.updateUserInfo` 需要用户已登录,若未登录,该接口会返回 604 错误。
> 如果未在控制台开启“允许在 SDK 更新用户信息”开关,该接口会返回 616 错误。

## 更新用户手机号

开发者需要提供按钮的方式,令用户触发授权手机号操作。更新之后,用户表的 phone_verified 字段会更新为 true ,省掉了验证手机号的过程。
Expand Down Expand Up @@ -423,14 +321,6 @@ wx.getUserInfo({
})
```

## <span style="color: #f04134;">`已废弃`</span> 登入登出(SDK < 3.18.0)


> **danger**
> 从 2018 年 4 月 30 日开始,在小程序的体验版和开发版调用 wx.getUserInfo 接口,将默认调用失败。为应对微信的调整,我们在 SDK v1.4.0 中增加了对新的登录流程的支持,因此也推荐你使用新的 SDK 接口来完成登录和获取用户信息功能。关于最佳的登录实践,可参考 [微信登录能力优化](https://mp.weixin.qq.com/s?__biz=MjM5NDAxMDg4MA==&mid=2650959412&idx=1&sn=9a140ac9622845b4c362ab686a877197)
小程序建议的登录流程是,通过 `wx.BaaS.auth.loginWithWechat()` 获取用户 openID, 这时无需弹框授权,开发者拿到 openID 可以建立自身的帐号 ID。当必须要获得用户的头像昵称等信息时,才让用户点击 button(open-type="getUserInfo" ),弹框授权。

## 请求用户授权

开发者需要提供按钮的方式,令用户触发授权操作
Expand Down Expand Up @@ -503,6 +393,120 @@ res 对象结构请参考[错误码和 HError 对象](/js-sdk/error-code.md)
> `wx.BaaS.auth.loginWithWechat` 默认会检查用户是否已登录,若未登录,该接口默认会先执行登录操作

## <span style="color: #f04134;">`已废弃`</span> 更新用户信息

开发者需要提前调用 `wx.getUserProfile` 获取用户信息,并调用以下方法更新。

`wx.BaaS.auth.updateUserInfo(data, {code, syncUserProfile})`

> **danger**
> 注意:在微信开发者工具中使用基础库版本小于 2.16.0 并调用 `wx.getUserProfile` 时是无法获取到 iv、rawData、signature 和 encryptedData 等字段的。为应对微信的调整,小程序基础库版本大于等于 2.16.0 时开发者需要先通过 `wx.login` 获取用户登录凭证 `code`,并调用 `wx.getUserProfile` 获取用户信息,再传入 `updateUserInfo` 方法。基础库版本小于 2.16.0 则无需调用 wx.login 方法,直接调用 wx.getUserProfile 即可。
>
> 同时,由于微信限制了 wx.getUserProfile 不能直接在 wx.login 的回调中调用,因此开发者需注意调用方法的顺序。也就是说,先调用 `wx.login` 方法,再调用 `wx.getUserProfile`。SDK 推荐使用 Promise.all 的方式处理上述问题。
<!-- 分隔两个 info -->
> **info**
> 由于 `wx.getUserProfile` 必须在点击事件里触发,无法直接在回调中调用,因此开发者需要注意区分登录 `wx.BaaS.auth.loginWithWechat``wx.getUserProfile` 的调用时机。
**参数说明**

| 参数 | 类型 | 必填 | 说明 |
| :-------------- | :------ | :------ | :----------- |
| data | Object || wx.getUserProfile 事件回调返回的参数 |
| code | Object || 用户登录凭证,基础库大于等于 2.16.0 时必填 |
| syncUserProfile | String || 是否[同步第一层级用户信息](/js-sdk/account.md#同步第一层级用户信息),可选值为 `overwrite``setnx``false`,默认值为 `setnx`|

**请求示例**

基础库版本大于等于 `2.16.0`

```js
Page({
// ...
updateUserInfo() {
const _getLoginCode = new Promise(resolve => {
wx.login({
success: res => resolve(res.code)
})
})

const _getUserProfile = new Promise(resolve => {
wx.getUserProfile({
desc: '获取用户信息',
success: res => resolve(res)
})
})

Promise.all([_getLoginCode, _getUserProfile]).then(result => {
const [code, userProfile] = result
wx.BaaS.auth.updateUserInfo(userProfile, {code}).then(res => {
// user 包含用户完整信息,详见下方描述
}, err => {
// **err 有两种情况**:用户拒绝授权,HError 对象上会包含基本用户信息:id、openid、unionid;其他类型的错误,如网络断开、请求超时等,将返回 HError 对象(详情见下方注解)
})
})
},
// ...
})
```

基础库小于 `2.16.0`

```js
Page({
// ...
updateUserInfo() {
wx.getUserProfile({
desc: '更新用户信息',
success: data => {
wx.BaaS.auth.updateUserInfo(data).then(user => {
// user 包含用户完整信息,详见下方描述
}, err => {
// **err 有两种情况**:用户拒绝授权,HError 对象上会包含基本用户信息:id、openid、unionid;其他类型的错误,如网络断开、请求超时等,将返回 HError 对象(详情见下方注解)
})
}
})
},
// ...
})
```

**用户同意授权返回示例**
then 回调中的 user 对象为 currentUser 对象,请参考[currentUser 小节](../account.md)


**用户拒绝授权示例**
catch 回调中的 HError 对象示例:

```json
{
"id": 61736923,
"openid": "ofo380BgVHDSf3gz0QK1DYPGnLxx",
"unionid": "",
"code": 603,
"message": "unauthorized"
}
```

**其他错误**
catch 回调中的 res 对象示例:

res 对象结构请参考[错误码和 HError 对象](/js-sdk/error-code.md)

> **info**
> `wx.BaaS.auth.updateUserInfo` 需要用户已登录,若未登录,该接口会返回 604 错误。
> 如果未在控制台开启“允许在 SDK 更新用户信息”开关,该接口会返回 616 错误。

## <span style="color: #f04134;">`已废弃`</span> 登入登出(SDK < 3.18.0)


> **danger**
> 从 2018 年 4 月 30 日开始,在小程序的体验版和开发版调用 wx.getUserInfo 接口,将默认调用失败。为应对微信的调整,我们在 SDK v1.4.0 中增加了对新的登录流程的支持,因此也推荐你使用新的 SDK 接口来完成登录和获取用户信息功能。关于最佳的登录实践,可参考 [微信登录能力优化](https://mp.weixin.qq.com/s?__biz=MjM5NDAxMDg4MA==&mid=2650959412&idx=1&sn=9a140ac9622845b4c362ab686a877197)
小程序建议的登录流程是,通过 `wx.BaaS.auth.loginWithWechat()` 获取用户 openID, 这时无需弹框授权,开发者拿到 openID 可以建立自身的帐号 ID。当必须要获得用户的头像昵称等信息时,才让用户点击 button(open-type="getUserInfo" ),弹框授权。


## <span style="color: #f04134;">`已废弃`</span> 登入登出(SDK < 2.0.0)

> **info**
Expand Down

0 comments on commit e5fb8a3

Please sign in to comment.