import BaseController, { ROLE_ANON } from 'common/base.controller' import { ZError } from 'common/ZError' import { role, router } from 'decorators/router' import { PlatEnum } from 'enums/PlatEnum' import logger from 'logger/logger' import { Account } from 'modules/Account' import { IPlat } from 'plats/IPlat' import { PlatTikTok } from 'plats/PlatTikTok' import { fetchAccessToken, refreshAccessToken } from 'service/tiktok.svr' // 在tiktok的过期时间中, 减少一个小时 const EXPIRE_REDUCE_SECOND = 3600 const plat: IPlat = new PlatTikTok() class TiktokController extends BaseController { @role(ROLE_ANON) @router('post /wallet/login/tiktok') async checkTiktokCode(req, res) { logger.db('login', req) const { openId, data } = await plat.verifyToken(req) const { api_platform } = req.headers if (api_platform) { data.platform = api_platform } let account = await Account.insertOrUpdate({ plat: PlatEnum.TIKTOK, openId }, data) const ztoken = await res.jwtSign({ id: account.id, openid: account.openId, version: account.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({}) } }