35 lines
978 B
JavaScript
35 lines
978 B
JavaScript
const crypto = require('crypto')
|
|||
|
|
const { HttpError } = require('./http')
|
||
|
|
|
||
|
|
async function code2session(code, deviceId) {
|
||
|
|
const appid = process.env.WX_APPID
|
||
|
|
const secret = process.env.WX_SECRET
|
||
|
|
if (!appid || !secret) {
|
||
|
|
const seed = deviceId || 'guest'
|
||
|
|
return {
|
||
|
|
openid: `demo_${crypto.createHash('sha1').update(seed).digest('hex').slice(0, 16)}`,
|
||
|
|
demo: true
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
const url = new URL('https://api.weixin.qq.com/sns/jscode2session')
|
||
|
|
url.search = new URLSearchParams({
|
||
|
|
appid,
|
||
|
|
secret,
|
||
|
|
js_code: code,
|
||
|
|
grant_type: 'authorization_code'
|
||
|
|
}).toString()
|
||
|
|
|
||
|
|
let session
|
||
|
|
try {
|
||
|
|
const res = await fetch(url, { signal: AbortSignal.timeout(8000) })
|
||
|
|
session = await res.json()
|
||
|
|
} catch (error) {
|
||
|
|
throw new HttpError(502, '微信登录服务不可用')
|
||
|
|
}
|
||
|
|
if (!session.openid) throw new HttpError(400, session.errmsg || '微信登录失败')
|
||
|
|
return { openid: session.openid, demo: false }
|
||
|
|
}
|
||
|
|
|
||
|
|
module.exports = { code2session }
|