diff --git a/uni_modules/uni-id-pages/pages/userinfo/userinfo.vue b/uni_modules/uni-id-pages/pages/userinfo/userinfo.vue
index 65dfba1f75016e91ba815020279a57ef10414007..0cb2618eee4046432c035aa1012dfeeee89af15a 100644
--- a/uni_modules/uni-id-pages/pages/userinfo/userinfo.vue
+++ b/uni_modules/uni-id-pages/pages/userinfo/userinfo.vue
@@ -14,6 +14,16 @@
+
+
+
+
+
+
@@ -30,219 +40,256 @@
diff --git a/uni_modules/uni-id-pages/uniCloud/cloudfunctions/uni-id-co/common/constants.js b/uni_modules/uni-id-pages/uniCloud/cloudfunctions/uni-id-co/common/constants.js
index 0322db6a8f548f8fb3f0f210225b4f84ee3d9e03..1a05d9a0d7d10ce47957c30da96ac66ffebf3cd8 100644
--- a/uni_modules/uni-id-pages/uniCloud/cloudfunctions/uni-id-co/common/constants.js
+++ b/uni_modules/uni-id-pages/uniCloud/cloudfunctions/uni-id-co/common/constants.js
@@ -52,7 +52,11 @@ const LOG_TYPE = {
BIND_WEIXIN: 'bind-weixin',
BIND_QQ: 'bind-qq',
BIND_APPLE: 'bind-apple',
- BIND_ALIPAY: 'bind-alipay'
+ BIND_ALIPAY: 'bind-alipay',
+ UNBIND_WEIXIN: 'unbind-weixin',
+ UNBIND_QQ: 'unbind-qq',
+ UNBIND_ALIPAY: 'unbind-alipay',
+ UNBIND_APPLE: 'unbind-apple'
}
const SMS_SCENE = {
diff --git a/uni_modules/uni-id-pages/uniCloud/cloudfunctions/uni-id-co/common/error.js b/uni_modules/uni-id-pages/uniCloud/cloudfunctions/uni-id-co/common/error.js
index 3095e5f72573bddb56a33f3a6c0897c07061f201..3dba8b21fdb7583b9ae6dc7918ed769692ffa209 100644
--- a/uni_modules/uni-id-pages/uniCloud/cloudfunctions/uni-id-co/common/error.js
+++ b/uni_modules/uni-id-pages/uniCloud/cloudfunctions/uni-id-co/common/error.js
@@ -30,7 +30,11 @@ const ERROR = {
SET_INVITE_CODE_FAILED: 'uni-id-set-invite-code-failed',
INVALID_INVITE_CODE: 'uni-id-invalid-invite-code',
CHANGE_INVITER_FORBIDDEN: 'uni-id-change-inviter-forbidden',
- BIND_CONFLICT: 'uni-id-bind-conflict'
+ BIND_CONFLICT: 'uni-id-bind-conflict',
+ UNBIND_FAIL: 'uni-id-unbind-failed',
+ UNBIND_NOT_SUPPORTED: 'uni-id-unbind-not-supported',
+ UNBIND_UNIQUE_LOGIN: 'uni-id-unbind-unique-login'
+
}
function isUniIdError (errCode) {
diff --git a/uni_modules/uni-id-pages/uniCloud/cloudfunctions/uni-id-co/config/permission.js b/uni_modules/uni-id-pages/uniCloud/cloudfunctions/uni-id-co/config/permission.js
index f67725c6880d56611b9f236a82645671d05e3d90..4d694418040f9c646df5f42fb0b87b0d73187941 100644
--- a/uni_modules/uni-id-pages/uniCloud/cloudfunctions/uni-id-co/config/permission.js
+++ b/uni_modules/uni-id-pages/uniCloud/cloudfunctions/uni-id-co/config/permission.js
@@ -62,5 +62,17 @@ module.exports = {
},
getAccountInfo: {
auth: true
+ },
+ unbindWeixin: {
+ auth: true
+ },
+ unbindAlipay: {
+ auth: true
+ },
+ unbindQQ: {
+ auth: true
+ },
+ unbindApple: {
+ auth: true
}
}
diff --git a/uni_modules/uni-id-pages/uniCloud/cloudfunctions/uni-id-co/index.obj.js b/uni_modules/uni-id-pages/uniCloud/cloudfunctions/uni-id-co/index.obj.js
index 4508b34eadf539bf229e4191ff3b5b3ca1997169..cd113a8fb1cd3d8e3b706436a3322cdb58003007 100644
--- a/uni_modules/uni-id-pages/uniCloud/cloudfunctions/uni-id-co/index.obj.js
+++ b/uni_modules/uni-id-pages/uniCloud/cloudfunctions/uni-id-co/index.obj.js
@@ -42,7 +42,11 @@ const {
bindAlipay,
bindApple,
bindQQ,
- bindWeixin
+ bindWeixin,
+ unbindWeixin,
+ unbindAlipay,
+ unbindQQ,
+ unbindApple
} = require('./module/relate/index')
const {
updatePwd,
@@ -543,5 +547,30 @@ module.exports = {
* @tutorial https://uniapp.dcloud.net.cn/uniCloud/uni-id-pages.html#get-supported-login-type
* @returns
*/
- getSupportedLoginType
+ getSupportedLoginType,
+
+ /**
+ * 解绑微信
+ * @tutorial https://uniapp.dcloud.net.cn/uniCloud/uni-id-pages.html#unbind-weixin
+ * @returns
+ */
+ unbindWeixin,
+ /**
+ * 解绑支付宝
+ * @tutorial https://uniapp.dcloud.net.cn/uniCloud/uni-id-pages.html#unbind-alipay
+ * @returns
+ */
+ unbindAlipay,
+ /**
+ * 解绑QQ
+ * @tutorial https://uniapp.dcloud.net.cn/uniCloud/uni-id-pages.html#unbind-qq
+ * @returns
+ */
+ unbindQQ,
+ /**
+ * 解绑Apple
+ * @tutorial https://uniapp.dcloud.net.cn/uniCloud/uni-id-pages.html#unbind-apple
+ * @returns
+ */
+ unbindApple
}
diff --git a/uni_modules/uni-id-pages/uniCloud/cloudfunctions/uni-id-co/lang/en.js b/uni_modules/uni-id-pages/uniCloud/cloudfunctions/uni-id-co/lang/en.js
index dcfad833a3773bf2a0871875688d426b4bfe066f..343158599daf7c63294b5d5473f0b9cf826f0045 100644
--- a/uni_modules/uni-id-pages/uniCloud/cloudfunctions/uni-id-co/lang/en.js
+++ b/uni_modules/uni-id-pages/uniCloud/cloudfunctions/uni-id-co/lang/en.js
@@ -36,7 +36,10 @@ const sentence = {
'uni-id-invalid-invite-code': 'Invalid invite code',
'uni-id-change-inviter-forbidden': 'Change inviter is not allowed',
'uni-id-bind-conflict': 'This account has been bound',
- 'uni-id-admin-exist-in-other-apps': 'Administrator is registered in other consoles'
+ 'uni-id-admin-exist-in-other-apps': 'Administrator is registered in other consoles',
+ 'uni-id-unbind-failed': 'Please bind first and then unbind',
+ 'uni-id-unbind-not-supported': 'Unbinding is not supported',
+ 'uni-id-unbind-unique-login': 'This is the only way to login at the moment, please bind your phone number and then try to unbind'
}
module.exports = {
diff --git a/uni_modules/uni-id-pages/uniCloud/cloudfunctions/uni-id-co/lang/zh-hans.js b/uni_modules/uni-id-pages/uniCloud/cloudfunctions/uni-id-co/lang/zh-hans.js
index 639bcf39cfec40106db7a28bd670e0eec4591071..d39231111d74744c70ce6abbb22ca5840bf6467e 100644
--- a/uni_modules/uni-id-pages/uniCloud/cloudfunctions/uni-id-co/lang/zh-hans.js
+++ b/uni_modules/uni-id-pages/uniCloud/cloudfunctions/uni-id-co/lang/zh-hans.js
@@ -36,7 +36,10 @@ const sentence = {
'uni-id-invalid-invite-code': '邀请码不可用',
'uni-id-change-inviter-forbidden': '禁止修改邀请人',
'uni-id-bind-conflict': '此账号已被绑定',
- 'uni-id-admin-exist-in-other-apps': '超级管理员已在其他控制台注册'
+ 'uni-id-admin-exist-in-other-apps': '超级管理员已在其他控制台注册',
+ 'uni-id-unbind-failed': '请先绑定后再解绑',
+ 'uni-id-unbind-not-supported': '不支持解绑',
+ 'uni-id-unbind-unique-login': '这是当前唯一登录方式,请绑定手机号后再尝试解绑'
}
module.exports = {
diff --git a/uni_modules/uni-id-pages/uniCloud/cloudfunctions/uni-id-co/lib/utils/relate.js b/uni_modules/uni-id-pages/uniCloud/cloudfunctions/uni-id-co/lib/utils/relate.js
index efd55e53e5531aff025c63697af26c615d1d0e01..1563271c1ea006c12178c660d9f797784986e87c 100644
--- a/uni_modules/uni-id-pages/uniCloud/cloudfunctions/uni-id-co/lib/utils/relate.js
+++ b/uni_modules/uni-id-pages/uniCloud/cloudfunctions/uni-id-co/lib/utils/relate.js
@@ -5,8 +5,15 @@ const {
ERROR
} = require('../../common/error')
const {
- userCollection
+ userCollection, dbCmd, USER_IDENTIFIER
} = require('../../common/constants')
+const {
+ getUserIdentifier
+} = require('../../lib/utils/account')
+
+const {
+ batchFindObjctValue
+} = require('../../common/utils')
const merge = require('lodash.merge')
/**
@@ -56,7 +63,90 @@ async function postBind ({
}
}
+async function preUnBind ({
+ uid,
+ unBindAccount,
+ logType
+}) {
+ const notUnBind = ['username', 'mobile', 'email']
+ const userIdentifier = getUserIdentifier(unBindAccount)
+ const condition = Object.keys(userIdentifier).reduce((res, key) => {
+ if (userIdentifier[key]) {
+ if (notUnBind.includes(key)) {
+ throw {
+ errCode: ERROR.UNBIND_NOT_SUPPORTED
+ }
+ }
+
+ res.push({
+ [key]: userIdentifier[key]
+ })
+ }
+
+ return res
+ }, [])
+ const currentUnBindAccount = Object.keys(userIdentifier).reduce((res, key) => {
+ if (userIdentifier[key]) {
+ res.push(key)
+ }
+ return res
+ }, [])
+ const { data: users } = await userCollection.where(dbCmd.and(
+ { _id: uid },
+ dbCmd.or(condition)
+ )).get()
+
+ if (users.length <= 0) {
+ await this.middleware.uniIdLog({
+ data: {
+ user_id: uid
+ },
+ type: logType,
+ success: false
+ })
+ throw {
+ errCode: ERROR.UNBIND_FAIL
+ }
+ }
+
+ const [user] = users
+ const otherAccounts = batchFindObjctValue(user, Object.keys(USER_IDENTIFIER).filter(key => !notUnBind.includes(key) && !currentUnBindAccount.includes(key)))
+ let hasOtherAccountBind = false
+
+ for (const key in otherAccounts) {
+ if (otherAccounts[key]) {
+ hasOtherAccountBind = true
+ break
+ }
+ }
+
+ if (!hasOtherAccountBind && !user.mobile) {
+ throw {
+ errCode: ERROR.UNBIND_UNIQUE_LOGIN
+ }
+ }
+}
+
+async function postUnBind ({
+ uid,
+ unBindAccount,
+ logType
+}) {
+ await userCollection.doc(uid).update(unBindAccount)
+ await this.middleware.uniIdLog({
+ data: {
+ user_id: uid
+ },
+ type: logType
+ })
+ return {
+ errCode: 0
+ }
+}
+
module.exports = {
preBind,
- postBind
+ postBind,
+ preUnBind,
+ postUnBind
}
diff --git a/uni_modules/uni-id-pages/uniCloud/cloudfunctions/uni-id-co/module/relate/bind-alipay.js b/uni_modules/uni-id-pages/uniCloud/cloudfunctions/uni-id-co/module/relate/bind-alipay.js
index 7c0c399bdf48f258e0ba896e115b2f9f27c11beb..bdb451b3a48845d744e1c6d14117ffcbf3510c3a 100644
--- a/uni_modules/uni-id-pages/uniCloud/cloudfunctions/uni-id-co/module/relate/bind-alipay.js
+++ b/uni_modules/uni-id-pages/uniCloud/cloudfunctions/uni-id-co/module/relate/bind-alipay.js
@@ -47,7 +47,7 @@ module.exports = async function (params = {}) {
} = getAlipayAccountResult
const bindAccount = {
- apple_openid: openid
+ ali_openid: openid
}
await preBind.call(this, {
uid,
diff --git a/uni_modules/uni-id-pages/uniCloud/cloudfunctions/uni-id-co/module/relate/index.js b/uni_modules/uni-id-pages/uniCloud/cloudfunctions/uni-id-co/module/relate/index.js
index 5352792029a447de179156aa1713af1de4cdde94..4d99c02cfb0af805c36db470a36b7dd771e58029 100644
--- a/uni_modules/uni-id-pages/uniCloud/cloudfunctions/uni-id-co/module/relate/index.js
+++ b/uni_modules/uni-id-pages/uniCloud/cloudfunctions/uni-id-co/module/relate/index.js
@@ -5,5 +5,9 @@ module.exports = {
bindAlipay: require('./bind-alipay'),
bindApple: require('./bind-apple'),
bindQQ: require('./bind-qq'),
- bindWeixin: require('./bind-weixin')
+ bindWeixin: require('./bind-weixin'),
+ unbindWeixin: require('./unbind-weixin'),
+ unbindAlipay: require('./unbind-alipay'),
+ unbindQQ: require('./unbind-qq'),
+ unbindApple: require('./unbind-apple')
}
diff --git a/uni_modules/uni-id-pages/uniCloud/cloudfunctions/uni-id-co/module/relate/unbind-alipay.js b/uni_modules/uni-id-pages/uniCloud/cloudfunctions/uni-id-co/module/relate/unbind-alipay.js
new file mode 100644
index 0000000000000000000000000000000000000000..67bb43bd05830342854d59f95fd821042f11d332
--- /dev/null
+++ b/uni_modules/uni-id-pages/uniCloud/cloudfunctions/uni-id-co/module/relate/unbind-alipay.js
@@ -0,0 +1,32 @@
+const {
+ preUnBind,
+ postUnBind
+} = require('../../lib/utils/relate')
+const {
+ LOG_TYPE, dbCmd
+} = require('../../common/constants')
+
+/**
+ * 解绑支付宝
+ * @tutorial https://uniapp.dcloud.net.cn/uniCloud/uni-id-pages.html#unbind-alipay
+ * @returns
+ */
+module.exports = async function () {
+ const { uid } = this.authInfo
+
+ await preUnBind.call(this, {
+ uid,
+ unBindAccount: {
+ ali_openid: dbCmd.exists(true)
+ },
+ logType: LOG_TYPE.UNBIND_ALIPAY
+ })
+
+ return await postUnBind.call(this, {
+ uid,
+ unBindAccount: {
+ ali_openid: dbCmd.remove()
+ },
+ logType: LOG_TYPE.UNBIND_ALIPAY
+ })
+}
diff --git a/uni_modules/uni-id-pages/uniCloud/cloudfunctions/uni-id-co/module/relate/unbind-apple.js b/uni_modules/uni-id-pages/uniCloud/cloudfunctions/uni-id-co/module/relate/unbind-apple.js
new file mode 100644
index 0000000000000000000000000000000000000000..111c1bf645d48b1fa8af00ac950eb15697bce82d
--- /dev/null
+++ b/uni_modules/uni-id-pages/uniCloud/cloudfunctions/uni-id-co/module/relate/unbind-apple.js
@@ -0,0 +1,32 @@
+const {
+ preUnBind,
+ postUnBind
+} = require('../../lib/utils/relate')
+const {
+ LOG_TYPE, dbCmd
+} = require('../../common/constants')
+
+/**
+ * 解绑apple
+ * @tutorial https://uniapp.dcloud.net.cn/uniCloud/uni-id-pages.html#unbind-apple
+ * @returns
+ */
+module.exports = async function () {
+ const { uid } = this.authInfo
+
+ await preUnBind.call(this, {
+ uid,
+ unBindAccount: {
+ apple_openid: dbCmd.exists(true)
+ },
+ logType: LOG_TYPE.UNBIND_APPLE
+ })
+
+ return await postUnBind.call(this, {
+ uid,
+ unBindAccount: {
+ apple_openid: dbCmd.remove()
+ },
+ logType: LOG_TYPE.UNBIND_APPLE
+ })
+}
diff --git a/uni_modules/uni-id-pages/uniCloud/cloudfunctions/uni-id-co/module/relate/unbind-qq.js b/uni_modules/uni-id-pages/uniCloud/cloudfunctions/uni-id-co/module/relate/unbind-qq.js
new file mode 100644
index 0000000000000000000000000000000000000000..c9c80b84f337988a677d5fcac69a302e8ce062a6
--- /dev/null
+++ b/uni_modules/uni-id-pages/uniCloud/cloudfunctions/uni-id-co/module/relate/unbind-qq.js
@@ -0,0 +1,46 @@
+const {
+ preUnBind,
+ postUnBind
+} = require('../../lib/utils/relate')
+const {
+ LOG_TYPE, dbCmd
+} = require('../../common/constants')
+const {
+ getQQPlatform
+} = require('../../lib/utils/qq')
+
+/**
+ * 解绑QQ
+ * @tutorial https://uniapp.dcloud.net.cn/uniCloud/uni-id-pages.html#unbind-qq
+ * @returns
+ */
+module.exports = async function () {
+ const { uid } = this.authInfo
+ const { appId } = this.getClientInfo()
+ const qqPlatform = getQQPlatform.call(this)
+
+ await preUnBind.call(this, {
+ uid,
+ unBindAccount: {
+ qq_openid: dbCmd.or([
+ {
+ [qqPlatform]: dbCmd.exists(true)
+ },
+ {
+ [`${qqPlatform}_${appId}`]: dbCmd.exists(true)
+ }
+ ]),
+ qq_unionid: dbCmd.exists(true)
+ },
+ logType: LOG_TYPE.UNBIND_QQ
+ })
+
+ return await postUnBind.call(this, {
+ uid,
+ unBindAccount: {
+ qq_openid: dbCmd.remove(),
+ qq_unionid: dbCmd.remove()
+ },
+ logType: LOG_TYPE.UNBIND_QQ
+ })
+}
diff --git a/uni_modules/uni-id-pages/uniCloud/cloudfunctions/uni-id-co/module/relate/unbind-weixin.js b/uni_modules/uni-id-pages/uniCloud/cloudfunctions/uni-id-co/module/relate/unbind-weixin.js
new file mode 100644
index 0000000000000000000000000000000000000000..8770bbd5c015fa77a3ca7baf96a622d8ad2f7b44
--- /dev/null
+++ b/uni_modules/uni-id-pages/uniCloud/cloudfunctions/uni-id-co/module/relate/unbind-weixin.js
@@ -0,0 +1,40 @@
+const {
+ preUnBind,
+ postUnBind
+} = require('../../lib/utils/relate')
+const {
+ LOG_TYPE, dbCmd
+} = require('../../common/constants')
+const {
+ getWeixinPlatform
+} = require('../../lib/utils/weixin')
+
+/**
+ * 解绑微信
+ * @tutorial https://uniapp.dcloud.net.cn/uniCloud/uni-id-pages.html#unbind-weixin
+ * @returns
+ */
+module.exports = async function () {
+ const { uid } = this.authInfo
+ const weixinPlatform = getWeixinPlatform.call(this)
+
+ await preUnBind.call(this, {
+ uid,
+ unBindAccount: {
+ wx_openid: {
+ [weixinPlatform]: dbCmd.exists(true)
+ },
+ wx_unionid: dbCmd.exists(true)
+ },
+ logType: LOG_TYPE.UNBIND_WEIXIN
+ })
+
+ return await postUnBind.call(this, {
+ uid,
+ unBindAccount: {
+ wx_openid: dbCmd.remove(),
+ wx_unionid: dbCmd.remove()
+ },
+ logType: LOG_TYPE.UNBIND_WEIXIN
+ })
+}