抖音小程序实践三:接口开发指南

article/2025/11/6 8:29:40

通过官方文档可以更系统的学习到所有的接口,我这边罗列一下我自己用到测试过的接口供大家参考。

  1. 前端-小程序对接官方文档:https://microapp.bytedance.com/docs/zh-CN/mini-app/develop/api/open-interface/user-information/tt-get-user-info
  2. 服务端-小程序官方文档:https://developer.open-douyin.com/docs/resource/zh-CN/mini-app/develop/server/server-api-introduction

在这里插入图片描述

1.前端-获取用户信息授权

API文档:https://microapp.bytedance.com/docs/zh-CN/mini-app/develop/api/open-interface/user-information/tt-get-user-info

// tt.getUserProfile(); 获取用户的基本信息,只可在 tap和支付 事件回调中调用,每次调用都会弹出授权提示窗,若用户同意,则会返回用户的真实数据。//获取已登录用户的基本信息或特殊信息,首次使用的用户会弹出授权提示窗,若用户同意,则会返回用户的真实数据。tt.getUserInfo({success(res) {console.log("getUserInfo 调用成功", JSON.stringify(res));},fail(res) {console.log("getUserInfo 调用失败", JSON.stringify(res));},})

响应:

{"userInfo": {"nickName": "claxxxxxhen","avatarUrl": "https://p9-passport.byteacctimg.com/img/mosaic-legacy/3796/2975xxx00.image","gender": 0,"city": "","province": "","country": "","language": "","userId": "37431xxxxx1486","sessionId": "3b652xxxxxxc3b490351ef1311"},"rawData": "{\"nickName\":\"claixxxxn\",\"avatarUrl\":\"https://p9-passport.byteacctimg.com/img/mosaic-legacy/3796/297xxxx.image\",\"gender\":0,\"city\":\"\",\"province\":\"\",\"country\":\"\",\"language\":\"\"}","signature": "5fed6c636f3cdxxxxx3d2e97e0869d0","encryptedData": "G+kEtB+JE2S3/r8V0Ftxxxx/CxxxxxxxxxxxxxFKKLp6LNpm3QtoHlj2BZREiN8zSE8z7gK51ECsKFDyPn4mtuthY90zj+Zwx0EPyC+DwP1ZJ4ahVawzVkMdnBMhnT48+7CZvOAWa/LyY93MmSsDNLDR0BBTpBnYbnqSW3tGNvTcllNuX2F1Laso2RtsFQlQPoVvoBysfIxliFDvL2+Rw/ZEIc2i7uXnbDeTzPuiiC8km7a/ImZSEZiTdsGNDKEnepmYStswydENgG51NiPRwj15JyOAeALb34xhgYFFZGZFw703XGUbXIn8s8tbqJ+u72cjbqxTp/D7qBL2cHA3uJC6rhrM/VgH7hiDMlwApdRQuFcNQSItQ41RhcD14R7iFoQObc4/IPT0BmvG+WuKMV+PuEp8vaA==","iv": "ar8P0OkTQxxxxqHrW9w==","errMsg": "getUserProfile:ok"
}
  • 其中encryptedData是需要的用户openId等数据
  • iv是用于解密的,需要留存

Q:此外,什么是用户的openId?什么是用户的unionId?
A:开发者可通过OpenID来获取用户基本信息。特别需要注意的是,如果开发者拥有多个移动应用、网站应用和公众帐号,可通过获取用户基本信息中的unionid来区分用户的唯一性。也就是说,小程序内openId是唯一的,全平台unionId是唯一的。

2.前端-用户登录

API文档:https://developer.open-douyin.com/docs/resource/zh-CN/mini-app/develop/api/open-interface/log-in/tt-login

tt.login({force: true,success(res) {console.log(`login 调用成功${res.code} ${res.anonymousCode}`);},fail(res) {console.log(`login 调用失败`);},
});

响应:

{"anonymousCode": "UAx9YfgVDsxxxxxxxxxxiZCXh7OaAfiW8ei…6mhQP1ETXRfFRKxidnPqMxZtxgXv7yrbWjkBwVePN6FIJq-1Q","code": "1ujmWYVW0mlU4xzzzzzzxxxxxxxxMUkdf9Vp1…g9z0Gy8LFbNekfVjY-Ng6V4_Bc6HxAPQ-SQvrPS8Gf-1ZFvaE","isLogin": true,"errMsg": "login:ok"
}

tt.login调用douyin接口登录,获取code/anonymous_code,这两个字段是后续个人加密信息解密的重要字段

3.服务端-jscode2session换取sessionKey

API文档:https://microapp.bytedance.com/docs/zh-CN/mini-app/develop/server/log-in/code-2-session/

        Map<String, String> dataMap = new HashMap<>();dataMap.put("appid", "tt60d416xxxxc8801");dataMap.put("secret", "582830exxxxc99e14c0999a");dataMap.put("code", "3muFdjQoIFZw0WcBLhltspBxxxxxNfT6mkCQO4RbKicdR0j7a12-PRO6yRCHn90HYDg8DerKt_lxoVr1Donbw");dataMap.put("anonymous_code", "i8MsKM6tGuKzjxMH3vJF3R4NxAN6xxxxxxxx38wsHAcfmY4dXwaWInvy6isFJ5X8ejQzKcYJVgiPCPkBkMwkw4MrRjFY_iVDOcTOY74");HttpResult httpResult = HttpClientUtils.doPostJson("https://developer.toutiao.com/api/apps/v2/jscode2session", JSON.toJSONString(dataMap));//注意这是生产的地址String res = httpResult.getBody();System.out.println(res);

响应:

{"err_no": 0,"err_tips": "success","data": {"session_key": "hZy6t19VPjFqm********","openid": "V3WvSshYq9******","anonymous_openid": "","unionid": "f7510d9ab***********"}
}
  • 这个时候能够获取session_key(解密用户信息的重点字段),此外还有重要的用户openid和unionid

4.服务端-敏感信息解密

API文档:https://microapp.bytedance.com/docs/zh-CN/mini-app/develop/api/open-interface/user-information/sensitive-data-process/
这边测试解密用户信息,此外手机号等encryptData的数据,都可以拿这套流程来解密。
我这边主要写了java后端解密的方法,对于js也可以解密,官方文档有比较多的方法展示。

  Base64.Decoder decoder = Base64.getDecoder();byte[] sessionKeyBytes = decoder.decode("Ps2xsxxxxxxxJkA==");byte[] ivBytes = decoder.decode("ar8P0OxxxxxxqHrW9w==");byte[] encryptedBytes =             decoder.decode("cfOy32OwcBaZv7xxxxxxxxxxxvZQHOjzDABhBOWInm0PNGwzXIBkUIZmto2pjC8VDmZS3v3N27OCb2c5E7DblfSVbcjXHuZN7OPB+zOxDADD7Q==");Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");SecretKeySpec skeySpec = new SecretKeySpec(sessionKeyBytes, "AES");IvParameterSpec ivSpec = new IvParameterSpec(ivBytes);cipher.init(Cipher.DECRYPT_MODE, skeySpec, ivSpec);byte[] ret = cipher.doFinal(encryptedBytes);String res = new String(ret);System.out.println(res);
  • 注意:Cipher cipher = Cipher.getInstance(“AES/CBC/PKCS5Padding”); // JDK does not support PKCS7Padding, use PKCS5Padding instead
  • 以上会有一个坑,对于JDK版本的不同,对解密的key的长度会有限制。比如Illegal key size or default parameters这种错误。因为美国的出口限制,Sun通过权限文件(local_policy.jar、US_export_policy.jar)做了相应限制。因此存在一些问题:●密钥长度上不能满足需求(如:java.security.InvalidKeyException: Illegal key size or default parameters),然后网上说要通过替换JDK/jre/lib/security的local_policy.jar
  • 我们正好遇到了服务器上的JDK版本较老,本地的JDK比较新,而上线报错这样的问题,下面的方法亲测解决异常
  • 关于JDK如何启用无限强度加密:
    • 针对Java 8u151之前版本,内含有限强度策略文件,我们下载 oracle上的无限制版本替换local_policy.jar、US_export_policy.jar
    • 针对Java 8u151之后版本,默认采用无限强度策略文件,如果我们想定义要使用的版本,有一个安全属性crypto.policy。Security.setProperty(“crypto.policy”,“unlimited”).在JCE框架初始化之前设置该属性。

5.再看看敏感数据解密流程

  1. tt.login调用douyin接口登录,获取code/anonymous_code
  2. getUserProfile,获取iv、encryptedData
  3. jscode2session 获取session_key (前后端获取均可)
  4. 解密用户信息 (前后端解密均可),注意保存用户信息

这样就能够获取openid\unionid\用户明文信息了

6.前端-获取用户设备信息

tt.getSystemInfo({success(res) {console.log("getSystemInfo 调用成功", JSON.stringify(res));},fail(res) {console.log("getSystemInfo 调用失败", JSON.stringify(res));},});

响应:

"language": "zh_CN","version": "6.6.3","brand": "devtools","fontSizeSetting": 16,"platform": "devtools","battery": 100,"wifiSignal": 4,"appName": "devtools","statusBarHeight": 47,"nativeSDKVersion": "10.3.0","model": "iPhone 12","system": "iOS 14","deviceScore": {"cpu": 7.905,"gpu": 9.0622,"memory": 7.0344,"overall": 7.9524},"SDKVersion": "2.68.0","pixelRatio": 3,"screenWidth": 390,"screenHeight": 844,"windowWidth": 390,"windowHeight": 844,"safeArea": {"left": 0,"right": 390,"top": 47,"bottom": 810,"width": 390,"height": 763},"SDKUpdateVersion": "2.68.0.3","devicePixelRatio": 3,"errMsg": "getSystemInfo:ok"
}

7.前端-获取用户手机号

获取抖音API当前登录状态的手机号,获取前需用户授权,否则无法获取。注意:该能力无法直接使用,需申请白名单

小程序获取手机号授权能力仅适用于以下场景:网络购物、帐号下信息内容同步、票务预订、业务办理、信息查询(如:社保、公积金)、预约等,其他不符合使用规范的申请不予开通,申请可参考: 获取用户手机号开通指南

评级达 B 级,且信用分达到 90 分的企业主体小程序,可以申请获取用户手机号能力

tt.getPhoneNumber({success(res) {console.log("getPhoneNumber 调用成功", JSON.stringify(res));},fail(res) {console.log("getPhoneNumber 调用失败", JSON.stringify(res));},})

响应:

{"detail": {"cloudId": "","encryptedData": "0tJ8EV5kwMq8xxxxxxQmf1KG2yKVJX3pYMgWbnY4SJ0MmWMFHJx1ySIaWIgt09sMCL0vAPmgMQ8Hv6d9NgRksOYDTdO1JEmJMy4VGJpBUKL3qqcOvBIc6ToN3RyUTad6Q==","iv": "ZtZtYvS7gNbGMpyYg500rA==","errMsg": "getPhoneNumber:ok"},"errMsg": "getPhoneNumber:ok"
}

这个数据就一样解密即可

8.前端-获取用户精准位置信息

用于频繁请求地理位置,实时获取精确位置信息。一般适用于打车、外卖等需要频繁请求获取地理位置的行业。需要申请后可查看。

tt.chooseAddress({success(res) {console.log("chooseAddress 调用成功", JSON.stringify(res));},fail(res) {console.log("chooseAddress 调用失败", JSON.stringify(res));},})

只要有接口权限,并且是用户登录授权状态,即可获取
响应:

{"longitude": 116.3974,"latitude": 39.9092,"city": "北京市","speed": 0,"accuracy": 65,"altitude": 0,"verticalAccuracy": 65,"horizontalAccuracy": 65,"errMsg": "getLocation:ok"
}

9.前端-消息订阅

前端发起用户订阅订单消息通知,用户同意后,即可通过接口发送实时订单消息给用户,提升用户体验

小程序消息订阅能力说明

注意:沙盒内测试仅支持安卓,如绑定的设备是IOS的测试会报错 — {"errMsg":"requestSubscribeMessage:fail not supported by current application","errNo":21502}

 tt.requestSubscribeMessage({tmplIds: [], // 需要填入开放平台申请的模版id,支持最多3个同类型模版success(res) {//订阅成功console.log("订阅成功", res);},fail(error) {//订阅失败console.log("订阅失败, 错误详情: ", error);tt.showToast({title: "订阅失败",icon: "fail",});},complete(res) {//订阅完成console.log("tt.requestSubscribeMessage API调用完成: ", res);},});

如果是安卓设备,请求结果如下:

{"MSG137673105551c58exxxxx15858": "accept","itemSettings": {"MSG137673105551cxxxxxbf15858": "accept"},"errMsg": "requestSubscribeMessage:ok"
}

10.服务端-获取AccessToken

AccessToken是接口鉴权凭证
access_token 是小程序的全局唯一调用凭据,开发者调用小程序支付时需要使用 access_token。access_token 的有效期为 2 个小时,需要定时刷新 access_token,重复获取会导致之前一次获取的 access_token 的有效期缩短为 5 分钟。

接口:POST https://developer.toutiao.com/api/apps/v2/token
请求示例:

curl --location --request POST 'https://developer.toutiao.com/api/apps/v2/token' \
--header 'Content-Type: application/json' \
--data-raw '{"appid": "ttabc*****","secret": "d428***********","grant_type": "client_credential"
}'

响应:

{"err_no": 0,"err_tips": "success","data": {"access_token": "0801121***********","expires_in": 7200}
}

11.服务端-发送订阅消息

请求地址: POST https://developer.toutiao.com/api/apps/subscribe_notification/developer/v1/notify
POSTMAN中的请求示例

curl --location --request POST 'https://developer.toutiao.com/api/apps/subscribe_notification/developer/v1/notify' \
--header 'Content-Type: application/json' \
--data-raw '{"access_token": "080112184679zzzz7556f426d33673d3d","app_id": "tt60d4166zzzzzzz8801","tpl_id": "MSG137673105zzzzzz7c84bf15858","open_id": "_000S3uzzzzzzzzAzN_zZb","data": {"快递派送": "SF1111111111"}
}'

响应:

{"err_no": 0,"err_tips": ""
}

http://chatgpt.dhexx.cn/article/33d6eWYq.shtml

相关文章

抖音小程序开发教程之初识抖音小程序 (教程含源码)

初识抖音小程序 抖音小程序是什么 字节跳动小程序依托字节系全生态产品&#xff0c;为用户提供更智能、高效的链接内容与服务的方式。开发者能够利用字节跳动小程序丰富的基础能力&#xff0c;快速接入并完成小程序服务搭建。 如何注册 microapp.bytedance.com 小程序可以…

Win7 蓝牙耳机无法使用

1.现象 蓝牙属性显示不可用无耳机设备显示 百度百科无法解决 https://jingyan.baidu.com/article/eb9f7b6d577e9e869364e8dc.html百度知道无法解决 从电脑品牌官网下载安装你机型的Intel 蓝牙驱动程序(Windows 7/XP) 驱动&#xff0c;不要下载安装这个Broadcom 蓝牙驱动程序…

C语言写出猜数字游戏的代码

猜数字游戏&#xff0c;即电脑生成随机数&#xff0c;根据用户输入猜大猜小最终实现猜对数字 思想&#xff1a;电脑生成随机数跟用户输入的那个数进行比较&#xff0c;若大了或者小了继续猜&#xff0c;这里可以写个死循环知道猜对才可以跳出来 代码如下所示&#xff1a; #in…

c语言小游戏(c语言小游戏代码飞机大战)

怎样用C语言编写一个小游戏&#xff1f; “贪吃蛇”C代码&#xff1a; #include #include #include #include #include #define W 78 //游戏框的宽,x轴 #define H 26 //游戏框的高,y轴 int dir3;//方向变量&#xff0c;初值3表示向“左” int Flag0;//吃了食物的标志(1是0否)…

c++小游戏代码(免费)

#include<bits/stdc.h> using namespace std; int main() { system("color B3"); cout<<" 猜数\n"; cout<<"请猜&#xff1a;"; int z; float a; float b; srand(time(0)); arand()%1001; …

什么是MySQL数据库 MySQL数据库的特点

转自&#xff1a;微点阅读 https://www.weidianyuedu.com 什么是MySQL&#xff1f; MySQL是一个多用户、多线程的SQL数据库&#xff0c;是一个客户机/服务器结构的应用&#xff0c;它由一个服务器守护程序mysqld和很多不同的客户程序和库组成。 SQL (Structured Query Language…

MySQL常见的数据类型有哪些?

一、数据类型是什么&#xff1f; 数据类型是指列、存储过程参数、表达式和局部变量的数据特征&#xff0c;它决定了数据的存储格式&#xff0c;代表了不同的信息类型。 有一些数据是要存储为数字的&#xff0c;数字当中有些是要存储为整数、小数、日期型等... 二、MYSQL常见…

MySQL数据库常用概念和数据类型

前言 本系列文章会带各位小伙伴学习数据库技术。数据库技术是Java开发中必不可少的一部分知识内容。也是非常重要的技术。 本系列教程由浅入深, 全面讲解数据库体系&#xff0c;非常适合零基础的小伙伴来学习。 全文大约 【1466】字&#xff0c;不说废话&#xff0c;只讲可以让…

mysql的特点

1&#xff0e; 它使用的核心线程是完全多线程&#xff0c;支持多处理器。 2&#xff0e; 有多种列类型&#xff1a;1、2、3、4、和8字节长度自有符号&#xff0f;无符号整数、FLOAT、DOUBLE、CHAR、VARCHAR、TEXT、BLOB、DATE、TIME、DATETIME、 TIMESTAMP、YEAR、和ENUM类型。…

MySQL数据库简介及特点

什么是MySQL&#xff1f; MySQL是一个多用户、多线程的SQL数据库&#xff0c;是一个客户机/服务器结构的应用&#xff0c;它由一个服务器守护程序mysqld和很多不同的客户程序和库组成。 SQL (Structured Query Language结构化查询语言)是目前使用最广的并且是标准的数据库语言。…

MySQL的特性

MySQL的特性 MySQL是一个真正的多用户、多线程SQL数据库服务器。SQL&#xff08;结构化查询语言&#xff09;是世界上最流行的和标准化的数据库语言。下面看一下MySQL的特性。 &#xff08;1&#xff09;使用C和C语言编写&#xff0c;并使用了多种编译器进行测试&#xff0c;…

python标识符、命名规则及关键字(含笔记)

目录 1、标识符和关键字 1.1 标识符概念 1.2 标识符规则 2、命名规则 3、关键字 1、标识符和关键字 1.1 标识符概念 开发人员在程序中自定义的一些符号和名称。标示符是自己定义的,如变量名,函数名等。 1.2 标识符规则 2、命名规则 见名知意。起一个有意义的名字&#…

python命名规则和标识符有哪些

以标识符为例&#xff0c;python命名规则如下&#xff1a; 1、标识符是由字符、下划线和数字组成&#xff0c;且第一个字符不能是数字。 2、标识符不能和Python中的保留字相同。 3、Python中的标识符中&#xff0c;不能包含空格等特殊字符。 Python是一种计算机程序设计语言…

python变量、函数、类的命名规则

本篇是转载文章&#xff0c;原出处为&#xff1a;【Python面试】 说说Python变量、函数、类的命名规则&#xff1f; - 云社区 - 腾讯云 问&#xff1a;Python变量、函数、类的命名规则&#xff1f; 答&#xff1a;Python命名规范在编写代码中起到很重要的作用&#xff0c;虽然…

python语言变量命名规则

Python语言变量命名规则 变量名只能包含字母、数字和下划线。&#xff08;推荐学习&#xff1a;0基础入门python&#xff09; 变量名可以字母或下划线开头&#xff0c;但不能以数字开头。例如&#xff0c;可将变量命名为message_1&#xff0c;但不能将其命名为1_message。 变…

Python 变量函数命名规则

Python 变量命名规则 模块名 & 包名 纯小写字母&#xff0c;单词之间用 _ 分割 类名 首字母大写&#xff0c;不用 _ 分割 全局变量名&#xff08;类似于 Java 中的 static 变量&#xff09; 纯大写&#xff0c;单词之间用 _ 分割 普通变量 纯小写字母&#xff0c;_ 分割 私…

Python代码的命名规则

一个项目需要有多个文件&#xff1a;配置、主文件、核心代码…会让我们在使用代码中更加便捷&#xff0c;对代码模块一目了然。当然小编也是Python初学者&#xff0c;所写的代码并不是大项目。配置文件以及其他的.py文件并不是很丰富&#xff0c;以下是在学习大佬代码得出来的&…

Python标识符的命名规则

[快速理解] Python标识符是指变量、函数、类、模块等的名称。 例如&#xff1a;a10中的a是标识符 反例&#xff1a;for i in [1,2,3]中的for和in不是标识符&#xff0c;是保留字&#xff0c;i是标识符。Python保留字有特殊的语法功能。 选择题 以下选项中都可以作为Python标识…

Python变量命名5大规则!

Python变量名不是随便乱起&#xff0c;需要遵循以下规则&#xff1a; 1、只能字母、下划线开头&#xff0c;不能数字开头。变量用小写字母开头是 Python 的惯例&#xff0c;也是编码的好习惯&#xff0c;大家要养成好习惯哟。 大家可以动手试试上面4个变量名哪个是正确的&…

python基础-命名规则

一、变量 由字母、数字、下划线组成&#xff0c;不能以数字开头&#xff0c;下划线开头尽量不用不能使用python的保留字严格区分大小写可用中文命名&#xff0c;但是不建议使用尽量取有意义的名字 user_name 张三 user_age 25 print (用户名为&#xff1a;,user_name) prin…