const { preBind, postBind } = require('../../lib/utils/relate') const { LOG_TYPE } = require('../../common/constants') const { generateWeixinCache } = require('../../lib/utils/weixin') const { initWeixin } = require('../../lib/third-party/index') const { ERROR } = require('../../common/error') /** * 绑定微信 * @param {Object} params * @param {String} params.code 微信登录返回的code * @returns */ module.exports = async function (params = {}) { const schema = { code: 'string' } this.middleware.validate(params, schema) const uid = this.authInfo.uid const { code } = params const weixinApi = initWeixin.call(this) const clientPlatform = this.clientPlatform const apiName = clientPlatform === 'mp-weixin' ? 'code2Session' : 'getOauthAccessToken' let getWeixinAccountResult try { getWeixinAccountResult = await weixinApi[apiName](code) } catch (error) { await this.middleware.uniIdLog({ success: false, type: LOG_TYPE.BIND_WEIXIN }) throw { errCode: ERROR.GET_THIRD_PARTY_ACCOUNT_FAILED } } const { openid, unionid, // 保存下面四个字段 sessionKey, // 微信小程序用户sessionKey accessToken, // App端微信用户accessToken refreshToken, // App端微信用户refreshToken expired: accessTokenExpired // App端微信用户accessToken过期时间 } = getWeixinAccountResult const bindAccount = { wx_openid: { [clientPlatform]: openid }, wx_unionid: unionid } await preBind.call(this, { uid, bindAccount, logType: LOG_TYPE.BIND_WEIXIN }) return postBind.call(this, { uid, bindAccount, extraData: { ...generateWeixinCache.call(this, { sessionKey, // 微信小程序用户sessionKey accessToken, // App端微信用户accessToken refreshToken, // App端微信用户refreshToken accessTokenExpired // App端微信用户accessToken过期时间 }) }, logType: LOG_TYPE.BIND_WEIXIN }) }