67 lines
2.4 KiB
TypeScript
67 lines
2.4 KiB
TypeScript
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({})
|
|
}
|
|
}
|