const { callWxOpenApi, buildUrl } = require('../normalize') module.exports = class Auth { constructor (options) { this.options = Object.assign({ baseUrl: 'https://api.weixin.qq.com', timeout: 5000 }, options) } async _requestWxOpenapi ({ name, url, data, options }) { const defaultOptions = { method: 'GET', dataType: 'json', dataAsQueryString: true, timeout: this.options.timeout } const result = await callWxOpenApi({ name: `auth.${name}`, url: `${this.options.baseUrl}${buildUrl(url, data)}`, data, options, defaultOptions }) return result } async code2Session (code) { const url = '/sns/jscode2session' const result = await this._requestWxOpenapi({ name: 'code2Session', url, data: { grant_type: 'authorization_code', appid: this.options.appId, secret: this.options.secret, js_code: code } }) return result } async getOauthAccessToken (code) { const url = '/sns/oauth2/access_token' const result = await this._requestWxOpenapi({ name: 'getOauthAccessToken', url, data: { grant_type: 'authorization_code', appid: this.options.appId, secret: this.options.secret, code } }) if (result.expiresIn) { result.expired = Date.now() + result.expiresIn * 1000 // delete result.expiresIn } return result } async getUserInfo ({ accessToken, openid } = {}) { const url = '/sns/userinfo' const { nickname, headimgurl: avatar } = await this._requestWxOpenapi({ name: 'getUserInfo', url, data: { accessToken, openid, appid: this.options.appId, secret: this.options.secret, scope: 'snsapi_userinfo' } }) return { nickname, avatar } } }