wallet-svr/src/controllers/tiktok.controller.ts
2023-08-17 15:58:36 +08:00

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({})
}
}