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