【团购核销】抖音生活服务商家应用快速接入②——商家授权
文章目录
- 一、前言
- 二、授权流程
- 三、授权Url
- 3.1 Url参数表
- 3.2 授权能力表
- 3.3 源码示例
- 四、授权回调
- 4.1 添加授权回调接口
- 4.2 授权回调接口源码示例
- 五、实际操作演示
- 六、参考
一、前言
目的:将抖音团购核销的功能集成到我们自己开发的App和小程序中
- 【团购核销】抖音生活服务商家应用快速接入①——基础工作
- 【团购核销】抖音生活服务商家应用快速接入②——商家授权
- 【团购核销】抖音生活服务商家应用快速接入③——团购核销验券
二、授权流程
- 以杆知乐(24小时自助台球棋牌)为例。
三、授权Url
- 业务授权URL:https://auth.dylk.com/auth-isv/
https://auth.dylk.com/auth-isv/?client_key=awxxxxxxxx×tamp=1677686399&sign=xxxxxxxxxxxxxx&solution_key=1&permission_keys=1,16&out_shop_id=shop_id&charset=UTF-8&extra=aaaaaaaaaa
3.1 Url参数表
| 字段 | 含义 | 必填 |
|---|---|---|
| client_key | 服务商应用标示 | 是 |
| timestamp | url开始生效的秒时间戳 ,24小时内有效 | 是 |
| solution_key | 到店餐饮1,到店团购2,随心团5 | 是 |
| permission_keys | 授权能力如2.2表 | 是 |
| charset | 交互数据的编码 固定值:UTF-8 | 是 |
| sign | 根据参数内容生成的签名 | 是 |
| client_key | 服务商应用标示 | 是 |
| out_shop_id | 绑定抖音门店的外部门店ID | 否 |
3.2 授权能力表
| 能力枚举permission_keys | 语义 |
|---|---|
| 1 | 门店管理 |
| 2 | 订单查询 |
| 3 | 门店基础信息更新 |
| 4 | 门店任务查询 |
| 5 | 同步门店户 |
| 6 | 门店匹配 |
| 7 | 门店装修 |
| 8 | 门店亮照 |
| 9 | 会员管理 |
| 10 | 商品查询 |
| 11 | 商品发布 |
| 12 | 团购核销 |
| 13 | cps佣金设置与查询 |
| 14 | KA核销对账 |
| 15 | 团购核销对账 |
| 16 | 商户授权 |
| 17 | 三方码发布 |
| 18 | 同步品牌户 |
| 19 | 客资查询 |
3.3 源码示例
- 快速生成商家授权链接
private final static String AuthUrl = "https://auth.dylk.com/auth-isv/";public static String genAuthWithBindValidUrlFast(String outShopId) {Map<String, String> query = new HashMap<>();query.put("client_key", APPID);query.put("timestamp", String.valueOf(System.currentTimeMillis() / 1000));query.put("charset", "UTF-8");query.put("solution_key", "4");query.put("out_shop_id", outShopId);query.put("permission_keys", "1,2,10,12,14,15,16");String signResult = SignUtil.signV2(AppSecret, "", query);query.put("sign", signResult);String queryStr = query.entrySet().stream().map(entry -> new StringBuilder().append(entry.getKey()).append("=").append(entry.getValue())).collect(Collectors.joining("&"));StringBuilder resultSb = new StringBuilder(AuthUrl).append("?").append(queryStr);return resultSb.toString();
}
- 签名加密
SignUtil.java
/*** SignV2 用于生活服务应用计算header中的签名(sha256) 新申请应用请使用该方法计算* @param clientSecret 应用secret* @param body post请求/spi请求中的body参数json字符串* @param query url参数* @return 签名*/
public static String signV2(String clientSecret, String body, Map<String, String> query) {StringBuilder str = new StringBuilder(clientSecret);query.keySet().stream().filter(a -> !"sign".equals(a)).sorted().forEach(k -> {String val = query.get(k);str.append("&");str.append(k).append("=").append(val);});if (body != null && !"".equals(body)) {str.append("&");str.append("body").append("=").append(body);}System.out.printf("[Sign] v2 str:%s\n", str.toString());String result = SHA256(str.toString());System.out.printf("[Sign] v2 str:%s, result:%s\n", str.toString(), result);return result;
}/*** SHA-256加密* @param input 明文* @return 密文*/
public static String SHA256(String input) {String result = "";try {MessageDigest md = MessageDigest.getInstance("SHA-256");md.update(input.getBytes(StandardCharsets.UTF_8));byte[] digest = md.digest();result = bytes2Hex(digest);} catch (NoSuchAlgorithmException e) {e.printStackTrace();}return result;
}
四、授权回调
4.1 添加授权回调接口
抖音开放平台(服务商平台)第三方生活服务商家应用开发设置Webhooks- 添加你写好的接口,如果你的接口没写好,则会提示
参数不合法

- 如果接口是ok的,则会提示添加成功。

4.2 授权回调接口源码示例
- 校验签名,加密请求体与请求体的签名进行对比
- 判断是key和event无误
- 则保存商户授权信息
/*** 抖音推送接口*/
@PostMapping("/douyin/messages")
public String douyinMessage(@RequestBody String body, @RequestHeader Map<String, String> headers)
{log.info(body);log.info(headers.toString());// 获取请求头中的加签信息String douyinSign = headers.get("X-Douyin-Signature");if(douyinSign==null || douyinSign.length()==0){douyinSign = headers.get("x-douyin-signature");}String data = DouYinUtils.AppSecret + body;String sign = DigestUtils.sha1Hex(data);if(!sign.equals(douyinSign)){log.error("验签失败, data="+data);log.error("验签失败, sign1="+sign);log.error("验签失败, sign2="+douyinSign);return AjaxResult.error().toString();}JSONObject douyinData = JSONObject.parseObject(body);if(douyinData.getString("client_key").equals(DouYinUtils.APPID)){if(douyinData.getString("event").equals("life_saas_cooperate_auth_with_bind")){String content = douyinData.getString("content");JSONObject jsonObject = JSONObject.parseObject(content);Long shopId = Long.valueOf(jsonObject.getString("out_shop_id"));String accountId = jsonObject.getString("account_id");String solutionKey = jsonObject.getString("solution_key");String permissionKey = jsonObject.getJSONArray("permission_keys").toJSONString();BilliardsDouyin billiardsDouyin = new BilliardsDouyin();billiardsDouyin.setAccountId(accountId);billiardsDouyin.setPermissionKeys(permissionKey);billiardsDouyin.setSolutionKey(solutionKey);billiardsDouyin.setShopId(shopId);log.info(billiardsDouyin.toString());billiardsDouyinService.insertBilliardsDouyin(billiardsDouyin);BilliardsShop billiardsShop = billiardsShopService.selectBilliardsShopById(shopId);if (ObjectUtil.isNull(billiardsShop)) {log.error("抖音商家授权回调接口,查无此球厅");return AjaxResult.error().toString();}billiardsShop.setDouyinId(accountId);billiardsShopService.updateBilliardsShop(billiardsShop);}}return douyinData.getJSONObject("content").toJSONString();
}
五、实际操作演示




六、参考
- 能力授权&门店绑定SDK_生活服务商家应用_抖音开放平台
- 生活服务消息推送_生活服务商家应用_抖音开放平台
觉得好,就一键三连呗(点赞+收藏+关注)
相关文章:
【团购核销】抖音生活服务商家应用快速接入②——商家授权
文章目录 一、前言二、授权流程三、授权Url3.1 Url参数表3.2 授权能力表3.3 源码示例 四、授权回调4.1 添加授权回调接口4.2 授权回调接口源码示例 五、实际操作演示六、参考 一、前言 目的:将抖音团购核销的功能集成到我们自己开发的App和小程序中 【团购核销】抖音…...
django宠物服务管理系统
摘 要 宠物服务管理系统是一种专门为宠物主人和宠物服务提供商设计的软件。它可以帮助用户快速找到附近的宠物医院、宠物美容店、宠物寄养中心等服务提供商,并预订相关服务。该系统还提供了一系列实用的功能。通过使用宠物服务管理系统,用户可以更加方便…...
vue2中使用three.js步骤
1.使用npm 下载依赖这里以0.158.0版本为例 npm install three0.158.0 --save 2. <template><div id"container"></div> </template><script> import * as THREE from three; import { OBJLoader } from three/examples/jsm/loaders/O…...
部落商城App开发笔记 2024.11.21 实现进入app就是短视频
初步效果: 基于图鸟UI二次开发, 这里静态资源没有加载, 我在本机上安装了一个nginx, 需要启动一下. PS C:\dev\nginx-1.26.2> start .\nginx.exe重新刷新就有数据了. 先看看目前的页面吧. 首页. 分类: 发现. 消息. 购物车. 我的. 这个项目是有短视频的功能…...
解决.DS_Store 在项目一致无法排除,.gitignore里也不生效
.DS_Store 是 macOS 操作系统创建的隐藏文件,通常用于存储目录的属性,比如视图设置、图标位置等。它通常不应包含在代码仓库中,因此需要排除它。你提到即使将其添加到 .gitignore 文件中,仍然无法排除它,可能是由于以下…...
MySQL-关键字执行顺序
💖简介 在MySQL中,SQL查询语句的执行遵循一定的逻辑顺序,即使这些关键字在SQL语句中的物理排列可能有所不同。 🌟语句顺序 (8) SELECT (9) DISTINCT<select_list> (1) FROM <left_table> (3) <join_type> JO…...
极客时间《Redis核心技术与实战》开篇词 知识点总结
Redis 主要的数据持久化方式 RDB(Redis Database Backup file) RDB 是 Redis 提供的一种数据快照持久化方式,它会在指定的时间间隔内生成数据集的时间点快照,并将这些快照保存到磁盘上的一个 RDB 文件中。RDB 文件是一个压缩的二…...
TCP并发服务器
端口号快速复用函数 通过getsockopt和setsockopt函数,管理套接字的端口号复用设置。具体操作如下: getsockopt函数 int getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen);功能:获取套接字的某些选项的属性。…...
Debug-031-近期功能实现小结
由于时间原因,没办法对每个小的功能点进行比较细致的总结,这里统一去记录一下最近的实现了的功能,算是存档备份,为今后开发带来便利和参考。 一、ACEeditor ACEeditor使用手册(一)_ace editor-CSDN博客 AC…...
Consumer Group
不,kafka-consumer-groups.sh 脚本本身并不用于创建 Consumer Group。它主要用于管理和查看 Consumer Group 的状态和详情,比如列出所有的 Consumer Group、查看特定 Consumer Group 的详情、删除 Consumer Group 等。 Consumer Group 是由 Kafka 消费者…...
.NET架构师学习大纲
目录 微服务 Consul Ocelot Polly Skywalking Exceptionless Apollo Jenkins Docker Kubernetes DDD领域驱动设计 DevOps CDN Nginx 应用服务器集群 数据库高可用 异步化架构 Azure前沿技术 工具排查 O/RM-EFCore IOC&AOP Core WebApi WebServer 数…...
【代码随想录】贪心
455. 分发饼干 题目 随想录 本质: 对于每个孩子,使用可以满足该孩子的最小的饼干。所以对孩子胃口和饼干进行sort排序,依次将大的饼干满足给孩子。 贪心策略: 想一下局部最优,想一下全局最优,如果局部最优…...
Harmony鸿蒙类似与Android中broadcast广播的api使用及释义
EventHub模块提供了事件中心,提供订阅、取消订阅、触发事件的能力。 这里需要注意,该模块接口仅可在Stage模型下使用。且Api>9 EventHub.on on(event: string, callback: Function): void; 订阅指定事件。(接收广播) 参…...
openGauss 6.0.0主备部署(企业版)
openGauss 6.0.0主备部署(企业版) 文章目录 openGauss 6.0.0主备部署(企业版)一、环境准备1.操作系统环境2.修改主机名3.设置字符集编码4.修改openEuler默认yum源5.安装所需工具6.同步网络时间7.关闭防火墙 二、安装openGauss数据…...
【机器学习】聚类算法原理详解
聚类算法 性能度量: 外部指标 jaccard系数(简称JC)FM指数(简称FMI)Rand指数(简称RI) 内部指标 DB指数(简称DBI)Dunn指数(简称DI) 距离计算&am…...
Ubuntu20.04从零安装IsaacSim/IsaacLab
Ubuntu20.04从零安装IsaacSim/IsaacLab 电脑硬件配置:安装Isaac sim方案一:pip安装方案二:预构建二进制文件安装1、安装ominiverse2、在ominiverse中安装isaac sim,下载最新的4.2版本 安装Isaac Lab1、IsaacLab环境克隆2、创建con…...
基于Java Springboot大学校园旧物捐赠网站
一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术:Html、Css、Js、Vue、Element-ui 数据库:MySQL 后端技术:Java、Spring Boot、MyBatis 三、运行环境 开发工具:IDEA/eclipse 数据…...
【Java 集合】Collections 空列表细节处理
问题 如下代码,虽然定义为非空 NonNull,但依然会返回空对象,导致调用侧被检测为空引用。 实际上不是Collections的问题是三目运算符返回了null对象。 import java.util.Collections;NonNullprivate List<String> getInfo() {IccReco…...
大数据实验4-HBase
一、实验目的 阐述HBase在Hadoop体系结构中的角色;能够掌握HBase的安装和配置方法熟练使用HBase操作常用的Shell命令; 二、实验要求 学习HBase的安装步骤,并掌握HBase的基本操作命令的使用; 三、实验平台 操作系统࿱…...
deepin系统下载pnpm cnpm等报错
deepin系统下载pnpm cnpm等报错 npm ERR! request to https://registry.npm.taobao.org/pnpm failed, reason: certificate has expired 报错提示证书过期,执行以下命令 npm config set registry https://registry.npmmirror.com下载pnpm npm install pnpm -g查…...
Swagger和OpenApi的前世今生
Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章,二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑: 🔄 一、起源与初创期:Swagger的诞生(2010-2014) 核心…...
初学 pytest 记录
安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...
安卓基础(aar)
重新设置java21的环境,临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的: MyApp/ ├── app/ …...
2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...
Kafka入门-生产者
生产者 生产者发送流程: 延迟时间为0ms时,也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于:异步发送不需要等待结果,同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...
vue3 daterange正则踩坑
<el-form-item label"空置时间" prop"vacantTime"> <el-date-picker v-model"form.vacantTime" type"daterange" start-placeholder"开始日期" end-placeholder"结束日期" clearable :editable"fal…...
简单介绍C++中 string与wstring
在C中,string和wstring是两种用于处理不同字符编码的字符串类型,分别基于char和wchar_t字符类型。以下是它们的详细说明和对比: 1. 基础定义 string 类型:std::string 字符类型:char(通常为8位)…...
STL 2迭代器
文章目录 1.迭代器2.输入迭代器3.输出迭代器1.插入迭代器 4.前向迭代器5.双向迭代器6.随机访问迭代器7.不同容器返回的迭代器类型1.输入 / 输出迭代器2.前向迭代器3.双向迭代器4.随机访问迭代器5.特殊迭代器适配器6.为什么 unordered_set 只提供前向迭代器? 1.迭代器…...
linux设备重启后时间与网络时间不同步怎么解决?
linux设备重启后时间与网络时间不同步怎么解决? 设备只要一重启,时间又错了/偏了,明明刚刚对时还是对的! 这在物联网、嵌入式开发环境特别常见,尤其是开发板、树莓派、rk3588 这类设备。 解决方法: 加硬件…...
RFID推动新能源汽车零部件生产系统管理应用案例
RFID推动新能源汽车零部件生产系统管理应用案例 一、项目背景 新能源汽车零部件场景 在新能源汽车零部件生产领域,电子冷却水泵等关键部件的装配溯源需求日益增长。传统 RFID 溯源方案采用 “网关 RFID 读写头” 模式,存在单点位单独头溯源、网关布线…...
