const { ERROR } = require('../../common/error') const { initWeixin } = require('../../lib/third-party/index') const { saveWeixinUserKey, saveSecureNetworkCache } = require('../../lib/utils/weixin') const loginByWeixin = require('../login/login-by-weixin') /** * 微信安全网络握手 * @tutorial https://uniapp.dcloud.net.cn/uniCloud/uni-id-pages.html#set-push-cid * @param {object} params * @param {string} params.code 微信登录返回的code * @param {boolean} params.callLoginByWeixin 是否同时调用一次微信登录 * @returns */ module.exports = async function (params = {}) { const schema = { code: 'string', callLoginByWeixin: { type: 'boolean', required: false } } this.middleware.validate(params, schema) let platform = this.clientPlatform if (platform !== 'mp-weixin') { throw new Error(`[secureNetworkHandshake] platform ${platform} is not supported`) } const { code, callLoginByWeixin = false } = params if (callLoginByWeixin) { return loginByWeixin.call(this, { code, secureNetworkCache: true }) } const weixinApi = initWeixin.call(this) let getWeixinAccountResult try { getWeixinAccountResult = await weixinApi.code2Session(code) } catch (error) { console.error(error) throw { errCode: ERROR.GET_THIRD_PARTY_ACCOUNT_FAILED } } const { openid, unionid, sessionKey // 微信小程序用户sessionKey } = getWeixinAccountResult await saveSecureNetworkCache.call(this, { code, openid, unionid, sessionKey }) await saveWeixinUserKey.call(this, { openid, sessionKey }) return { errCode: 0 } }