速通抖音开放平台API-生活服务商应用

背景

公司需要获取线下团购及对应达人推广信息,并整合其他平台的相应情况,用来计划构建一个达人数据管理后台,这里直接进行速通测试,用来评估项目成本

准备

1、创建应用

抖音开放平台控制台

先点击上面链接进入官方控制台,然后依次点击【生活服务商应用】-【创建生活服务商应用】,然后按照你们门店实际的信息进行一步步填写即可,最后申请绑定对应【抖音店铺账号】。

2、绑定抖音店铺

这时候通知对应抖音店铺账号使用者进行通过申请即可。

3、权限申请

然后我们依次点击我们创建好的【应用】-【解决方案】,然后选择类型以及权限,这里我们选【餐饮】-【到店餐饮团购解决方案】,然后点击【开通能力权限】,依次点击完成即可。

4、参数配置获取(秘钥等等)

再回到应用的首页,点击【基础信息】,即可获取APPID和AppSecret。

然后是商家ID,需要商家进入【抖音来客】后台,获取商家ID(accountId),链接如下:

抖音来客

实现

这里用的是node.js代码作为示例,其他语言的代码,开放平台也是对应示例代码,链接如下:

示例接口-团购订单查询

1、配置文件

config/index.js

javascript 复制代码
const config = {
    clientKey: 'aw************ob', // APPID
    clientSecret: '39********************3935c', // AppSecret
    accountId: '71****************39', // 商家ID
}
export default config

2、access_token获取

utils\client_token.js

javascript 复制代码
import fetch from 'node-fetch';
import config from '../config/index.js';
import logger from './logger.js';

let accessToken = null;
let tokenExpireTime = 0;

export async function getAccessToken() {
    const now = Date.now();
    if (accessToken && now < tokenExpireTime) {
        logger.debug('使用缓存的access_token');
        return accessToken;
    }
    
    const response = await fetch('https://open.douyin.com/oauth/client_token/', {
        method: 'POST',
        headers: {
            'Content-Type': 'application/json'
        },
        body: JSON.stringify({
            client_key: config.clientKey,
            client_secret: config.clientSecret,
            grant_type: 'client_credential'
        })
    });
    
    const json = await response.json();
    logger.info('----------------access_token-----------------');
    logger.info('获取access_token报文:', json);
    logger.info('---------------------------------------------');
    
    try {
        const result = json;
        
        if (result.data && result.data.access_token) {
            accessToken = result.data.access_token;
            tokenExpireTime = now + ((result.data.expires_in || 7200) - 60) * 1000;
            logger.info(`获取access_token成功: ${accessToken}`);
            logger.info('---------------------------------------------\n\n');
            return accessToken;
        } else {
            const errorMsg = result.data?.errmsg || result.data?.error_description || result.message || 'Unknown error';
            logger.error(`获取access_token失败: ${errorMsg}`);
            logger.info('---------------------------------------------\n\n');
            throw new Error(errorMsg);
        }
        
    } catch (e) {
        logger.error(`获取access_token报错: ${e.message}`);
        logger.info('---------------------------------------------\n\n');
        throw e;
    }
}

export { accessToken };

效果:

3、接口实现

server\index.js

javascript 复制代码
import fetch from 'node-fetch';
import config from '../config/index.js';
import { getAccessToken } from '../utils/client_token.js';
import logger from '../utils/logger.js';

/**
 * 生活服务商家应用-餐饮团购-订单查询
 */
async function akteOrderQuery() {
    const accountId = config.accountId;
    const pageNum = 1;
    const pageSize = 10;

    const accessToken = await getAccessToken();

    const params = {
        account_id: accountId,
        page_num: pageNum,
        page_size: pageSize
    };

    const headers = {
        'access-token': accessToken,
        'content-type': 'application/json'
    };

    logger.info('---------------------------------------------');      
    logger.info('请求URL:https://open.douyin.com/goodlife/v1/akte/order/query/');
    logger.info('请求类型:GET');
    logger.info('---------------------------------------------');   
    logger.info('请求参数:');
    logger.info(params);
    logger.info('---------------------------------------------');
    logger.info('请求头:');
    logger.info(headers);
    logger.info('---------------------------------------------');

    const response = await fetch(`https://open.douyin.com/goodlife/v1/akte/order/query/?account_id=${accountId}&page_num=${pageNum}&page_size=${pageSize}`, {
        headers: headers
    });
    const json = await response.json();
    logger.info('响应结果:');
    logger.info(json);
    logger.info('---------------------------------------------');
}

akteOrderQuery();

效果:

相关推荐
zttbee8 小时前
npm install卡顿
前端·npm·node.js
西红柿炖牛腩3548 小时前
机房电脑不能联网,怎么离线把课件里的 3D 模型压小?Draco / Meshopt 参数清单
前端·javascript·3d·性能优化·大屏端
爱喝水的小周8 小时前
实验十三 Vue 过渡与动画—电商后台消息中心实现
前端·javascript·vue.js
无责任此方_修行中8 小时前
如何不用括号调用 JS 的函数?
前端·javascript·node.js
无责任此方_修行中8 小时前
Deno 的八年:一场没逃出 Node 引力的运行时起义
前端·javascript·node.js
用户2986985301410 小时前
在 React 中使用 JavaScript 将 Markdown 转换为 PDF
javascript·react.js·markdown
Hilaku10 小时前
为什么我在团队里禁止使用 axios?
前端·javascript·程序员
一只游鱼10 小时前
我用原生 JS 做了一个「会呼吸」的博客:Canvas 水境 + 合成音效 + 会破裂的留言气泡(vibe coding)
javascript·agent·canvas·github pages
只睡四小时11 小时前
Local-First 数据契约:一张表装下 4 类数据
前端·javascript·架构设计·local-first·数据契约
王大师王文峰12 小时前
HTML 入门到进阶:语义化标签、表单与多媒体一篇打通【语义化布局、表单校验、video/audio、Canvas、无障碍与 SEO】
前端·css·node.js·html·css3·jquery·html5