74 lines
2.9 KiB
TypeScript
74 lines
2.9 KiB
TypeScript
import BaseController, { ROLE_ANON } from 'common/base.controller'
|
|
import { ZError } from 'common/ZError'
|
|
import { role, router } from 'decorators/router'
|
|
import logger from 'logger/logger'
|
|
import { Account, PlatEnum } from 'modules/Account'
|
|
import { fetchAccessToken, refreshAccessToken } from 'service/tiktok.svr'
|
|
// 在tiktok的过期时间中, 减少一个小时
|
|
const EXPIRE_REDUCE_SECOND = 3600
|
|
class TiktokController extends BaseController {
|
|
@role(ROLE_ANON)
|
|
@router('post /wallet/login/tiktok')
|
|
async checkTiktokCode(req, res) {
|
|
let { code } = req.params
|
|
logger.db('login', req)
|
|
let result = await fetchAccessToken(code)
|
|
if (!(result.message === 'success' && result.data?.error_code === 0)) {
|
|
throw new ZError(10, `${result.message}: ${result.data?.description} (${result.data?.error_code})`)
|
|
}
|
|
const openId = result.data['open_id']
|
|
let user: any = {}
|
|
let now = Date.now() / 1000
|
|
user.accessToken = result.data['access_token']
|
|
user.refreshToken = result.data['refresh_token']
|
|
user.accessTokenExpire = now + result.data['expires_in'] - EXPIRE_REDUCE_SECOND
|
|
user.refreshTokenExpire = now + result.data['refresh_expires_in'] - EXPIRE_REDUCE_SECOND
|
|
user.scope = result.data['scope']
|
|
const { api_platform } = req.headers
|
|
if (api_platform) {
|
|
user.platform = api_platform
|
|
}
|
|
let account = await Account.insertOrUpdate({ plat: PlatEnum.TIKTOK, openId }, user)
|
|
const ztoken = await res.jwtSign({
|
|
id: account.id,
|
|
openid: user.openId,
|
|
version: user.accountVersion || 0,
|
|
plat: PlatEnum.TIKTOK,
|
|
})
|
|
return { token: ztoken }
|
|
}
|
|
@router('post /wallet/tiktok/accesstoken')
|
|
async getTiktokAccessToken(req, res) {
|
|
let user = req.user
|
|
let now = Date.now() / 1000
|
|
if (user.accessToken && user.accessTokenExpire) {
|
|
if (now < user.accessTokenExpire) {
|
|
return { accessToken: user.accessToken }
|
|
}
|
|
}
|
|
if (user.refreshToken && user.refreshTokenExpire) {
|
|
if (now >= user.accessTokenExpire) {
|
|
throw new ZError(11, 'need login again')
|
|
}
|
|
}
|
|
let result = await refreshAccessToken(user.refreshToken)
|
|
if (!(result.message === 'success' && result.data?.error_code === 0)) {
|
|
throw new ZError(10, `${result.message}: ${result.data?.description} (${result.data?.error_code})`)
|
|
}
|
|
user.accessToken = result.data['access_token']
|
|
user.refreshToken = result.data['refresh_token']
|
|
user.accessTokenExpire = now + result.data['expires_in'] - EXPIRE_REDUCE_SECOND
|
|
user.refreshTokenExpire = now + result.data['refresh_expires_in'] - EXPIRE_REDUCE_SECOND
|
|
await user.save()
|
|
return { accessToken: user.accessToken }
|
|
}
|
|
|
|
@role(ROLE_ANON)
|
|
@router('post /wallet/tiktok/webhook')
|
|
async totkokWebhook(req, res) {
|
|
let { user_openid, content } = req.params
|
|
console.log('tiktok event: ' + user_openid + ' ' + content)
|
|
res.code(200).send({})
|
|
}
|
|
}
|