const { preBind, postBind } = require('../../lib/utils/relate') const { LOG_TYPE } = require('../../common/constants') const { ERROR } = require('../../common/error') const { initQQ } = require('../../lib/third-party/index') const { generateQQCache, getQQPlatform, saveQQUserKey } = require('../../lib/utils/qq') /** * 绑定QQ * @tutorial https://uniapp.dcloud.net.cn/uniCloud/uni-id-pages.html#bind-qq * @param {Object} params * @param {String} params.code 小程序端QQ登录返回的code * @param {String} params.accessToken APP端QQ登录返回的accessToken * @param {String} params.accessTokenExpired accessToken过期时间,由App端QQ登录返回的expires_in参数计算而来,单位:毫秒 * @returns */ module.exports = async function (params = {}) { const schema = { code: { type: 'string', required: false }, accessToken: { type: 'string', required: false }, accessTokenExpired: { type: 'number', required: false } } this.middleware.validate(params, schema) const uid = this.authInfo.uid const { code, accessToken, accessTokenExpired } = params const qqPlatform = getQQPlatform.call(this) const appId = this.getClientInfo().appId const qqApi = initQQ.call(this) const clientPlatform = this.clientPlatform const apiName = clientPlatform === 'mp-qq' ? 'code2Session' : 'getOpenidByToken' let getQQAccountResult try { getQQAccountResult = await qqApi[apiName]({ code, accessToken }) } catch (error) { await this.middleware.uniIdLog({ success: false, type: LOG_TYPE.BIND_QQ }) throw { errCode: ERROR.GET_THIRD_PARTY_ACCOUNT_FAILED } } const { openid, unionid, // 保存下面四个字段 sessionKey // 微信小程序用户sessionKey } = getQQAccountResult const bindAccount = { qq_openid: { [clientPlatform]: openid }, qq_unionid: unionid } await preBind.call(this, { uid, bindAccount, logType: LOG_TYPE.BIND_QQ }) await saveQQUserKey.call(this, { openid, sessionKey, accessToken, accessTokenExpired }) return postBind.call(this, { uid, bindAccount, extraData: { qq_openid: { [`${qqPlatform}_${appId}`]: openid }, ...generateQQCache.call(this, { openid, sessionKey }) }, logType: LOG_TYPE.BIND_QQ }) }