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

news2025/1/17 3:43:16

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

  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://www.coloradmin.cn/o/117153.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

个人黄金准备与须知

投资黄金可以为自己的资产保值&#xff0c;也可以福泽后人&#xff0c;因此十分符合国人传统文化特点和理财智慧。可是现在市场中可以投资黄金的平台那么多&#xff0c;投资者必须先认真“调查研究”&#xff0c;才能“去芜存菁”&#xff0c;选到值得托付的好平台。 其实投资者…

为笔记本电脑绑定公网IP随时随地BT做种完整方案(frp加v2ray配合比特彗星点亮绿灯)

BT做种需要拥有固定的IP(IPV4)和端口&#xff0c;如果想在拥有固定IP的服务端做种&#xff0c;可以直接参考前一期https://www.v2fy.com/p/2022-12-25-bt-1671963832000/ &#xff0c;如果想使用笔记本随时随地做种&#xff0c;那就需要拥有固定IP的服务器进行流量转发。 本篇…

富特科技在创业板IPO过会:计划募资约9亿元,股东包括小米等

近日&#xff0c;深圳证券交易所披露的信息显示&#xff0c;浙江富特科技股份有限公司&#xff08;下称“富特科技”&#xff09;获得创业板上市委会议审核通过。据贝多财经了解&#xff0c;富特科技于2022年6月16日在创业板递交招股书。 本次冲刺创业板上市&#xff0c;富特科…

【聆思CSK6 视觉AI开发套件试用】头肩、手势识别体验与PWM舵机控制

本篇文章来自极术社区与聆思科技组织的CSK6 视觉AI开发套件活动&#xff0c;更多开发板试用活动请关注极术社区网站。作者&#xff1a;酷电玩家 环境搭建 官方文档详细环境搭建教程&#xff1a;环境搭建 1、下载Git进行安装。 2、安装lisa zep工具&#xff0c;并初始化 CSK6…

洛谷千题详解 | P1026 [NOIP2001 提高组] 统计单词个数【C++、Java语言】

博主主页&#xff1a;Yu仙笙 专栏地址&#xff1a;洛谷千题详解 目录 题目描述 输入格式 输出格式 输入输出样例 解析&#xff1a; C源码&#xff1a; Java源码&#xff1a; C源码2&#xff1a; ----------------------------------------------------------------------------…

vector模板的简易实现

这篇文章&#xff0c;我们模拟一下STL里面的vector的实现。但是会简化一些内容&#xff0c;让大家能够更好的理解。模拟实现的目的不是为了更好的造轮子&#xff0c;而是为了更好的理解这些容器。 文章目录1. 成员变量2. push_back函数3. reserve函数4. pop_back函数和下标运算…

QT 多线程中使用QCanBusDevice进行PCAN通讯时,无法正常发出数据

QT 多线程中使用QCanBusDevice进行PCAN通讯时&#xff0c;无法正常发出数据 前言 我一开始的代码逻辑是&#xff0c;PCAN开启、关闭、发送、接收这些功能整合在一个工具类中&#xff0c;这个工具类的对象是在主线程创建的&#xff0c;然后我有一个要循环定时发送的功能是独立…

与企企通强强联手!哈尔斯二期数字化采购项目正式启动

近日&#xff0c;浙江哈尔斯真空器皿股份有限公司&#xff08;以下简称“哈尔斯”&#xff09;联合企企通举办二期数字化采购项目启动会&#xff0c;旨在助力哈尔斯实现采购数字化全面升级&#xff0c;提升自主品牌竞争力。会上&#xff0c;双方就该项目的建设方案、项目资源、…

铝合金表面处理废水除铝工艺

铝型材表面处理用水量大&#xff0c;产生废水多&#xff0c;废水中有害物质持续排放。如不加以处理必将污染环境。同时伴随着我国对排污量的征税&#xff0c;也会增加企业的成本和负担。因此&#xff0c;从企业的社会责任和效益两方面考虑&#xff0c;进行废水处理是必须和必要…

解决VsCode启动Vue项目报错:‘vue-cli-service‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。

问题描述 最近居家办公&#xff0c;网速不太稳定&#xff0c;开会的时候网络也是断断续续的&#xff0c;今天需要拉下前端项目运行起来 在我执行npm i下载包的时候&#xff0c;我看到网络超时的错误警告就感觉不太秒。知道大概率要启动失败了 果不其然执行npm run serve的时…

窃取信息的新恶意软件通过假冒的破解网站感染使用者

©网络研究院 一种名为“RisePro”的新型信息窃取恶意软件正在通过由 PrivateLoader 按安装付费 (PPI) 恶意软件分发服务运营的虚假破解站点进行分发。 RisePro 旨在帮助攻击者从受感染的设备中窃取受害者的信用卡、密码和加密钱包。 本周Flashpoint 和 Sekoia的分析师发…

前端框架 Nuxt3 集成 Pinia

目录 一、Nuxt3集成Pinia 二、Pinia的使用 state的使用 1、基本使用及动态渲染 2、state的重置 3、批量更改state数据 getters的使用 1、getters的基本使用 2、getters传参 actions的使用 1、actions的基本使用 一、Nuxt3集成Pinia 参考官方文档&#xff1a;简介 |…

【JavaSE】常用类(447~515)

String 447.常用类-每天一考 1.画图说明线程的生命周期&#xff0c;以及各状态切换使用到的方法等 状态&#xff0c;方法 2.同步代码块中涉及到同步监视器和共享数据&#xff0c;谈谈你对同步监视器和共享数据的理解&#xff0c;以及注意点。 synchronized(同步监视器){//操…

消息队列RabbitMQ学习笔记(五)高级特性

1. 发布确认高级 在生产环境中由于一些不明原因&#xff0c;导致 RabbitMQ 重启&#xff0c;在 RabbitMQ 重启期间生产者消息投递失败&#xff0c; 导致消息丢失&#xff0c;需要手动处理和恢复。于是&#xff0c;我们开始思考&#xff0c;如何才能进行 RabbitMQ 的消息可靠投…

ccc-sklearn-11-线性回归(1)

1.线性回归概述 回归需求在现实中非常多&#xff0c;自然也有了各种回归算法。最著名的就是线性回归和逻辑回归&#xff0c;衍生出了岭回归、Lasso、弹性网&#xff0c;以及分类算法改进后的回归&#xff0c;如回归树、随机森林回归、支持向量回归等&#xff0c;一切基于特征预…

自定义卷积实现卷积的重参数【手撕代码】

在我的上篇文章中主要对RepVGG进行了解析【RepVGG网络中重参化网络结构解读】&#xff0c;里面详细的对论文中的代码进行了解析&#xff0c;展示了RepVGG在重参数时是如何将训练分支进行合并的&#xff0c;总的一句话就是在推理阶段&#xff0c;会将1x1以及identity分支以paddi…

vivo 游戏中心低代码平台的提效秘诀

作者&#xff1a;vivo 互联网服务器团队- Chen Wenyang 本文根据陈文洋老师在“2022 vivo开发者大会"现场演讲内容整理而成。公众号回复【2022 VDC】获取互联网技术分会场议题相关资料。 在互联网流量见顶和用户需求分层的背景下&#xff0c;如何快速迭代产品功能&#xf…

函数模板-C11/17/14

函数模板 文章目录函数模板定义函数模板使用函数模板样例两阶段翻译 Two-Phase Translation模板的编译和链接问题多模板参数引入额外模板参数作为返回值类型让编译器自己找出返回值类型将返回值声明为两个模板参数的公共类型样例默认模板参数样例重载函数模板模板函数特化非类型…

cocoapods的使用

swift开发之cocoapods的使用 之前介绍了cocoapods的使用&#xff0c;我们可以知道通过pod search XXX(三方依赖库名称)可以就搜索到想要的第三方是否存在。 这次主要简单介绍cocoapods如何引入第三方库的,以BluetoothKit为例。 首先&#xff0c;我们终端中通过cd命令定位到要…

二十二、shiro安全框架基础

一、简介 1. shiro简介 Apache Shiro 是 Java 的一个安全&#xff08;权限&#xff09;框架。Shiro 可以非常容易的开发出足够好的应用&#xff0c;其不仅可以用在JavaSE 环境&#xff0c;也可以用在 JavaEE 环境。Shiro 可以完成&#xff1a;认证、授权、加密、会话管理、与…