【团购核销】抖音生活服务商家应用快速接入②——商家授权

文章目录

  • 一、前言
  • 二、授权流程
  • 三、授权Url
    • 3.1 Url参数表
    • 3.2 授权能力表
    • 3.3 源码示例
  • 四、授权回调
    • 4.1 添加授权回调接口
    • 4.2 授权回调接口源码示例
  • 五、实际操作演示
  • 六、参考

一、前言

目的:将抖音团购核销的功能集成到我们自己开发的App和小程序中

  • 【团购核销】抖音生活服务商家应用快速接入①——基础工作
  • 【团购核销】抖音生活服务商家应用快速接入②——商家授权
  • 【团购核销】抖音生活服务商家应用快速接入③——团购核销验券

二、授权流程

  • 杆知乐(24小时自助台球棋牌)为例。
商家 杆知乐商家版 抖音 点击抖音团购授权 添加out_shop_id再生成授权url 通过授权url登录抖音 选择门店进行绑定授权 将商家在抖音上的account_id和授权信息推送给技术服务商 商家 杆知乐商家版 抖音

三、授权Url

  • 业务授权URL:https://auth.dylk.com/auth-isv/
https://auth.dylk.com/auth-isv/?client_key=awxxxxxxxx&timestamp=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服务商应用标示
timestampurl开始生效的秒时间戳 ​,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 授权回调接口源码示例

  1. 校验签名,加密请求体与请求体的签名进行对比
  2. 判断是key和event无误
  3. 则保存商户授权信息
/*** 抖音推送接口*/
@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_生活服务商家应用_抖音开放平台
  • 生活服务消息推送_生活服务商家应用_抖音开放平台

觉得好,就一键三连呗(点赞+收藏+关注)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/886986.shtml

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

相关文章

解决 Android 单元测试 No tests found for given includes:

问题 报错&#xff1a; Execution failed for task :testDebugUnitTest. > No tests found for given includes: 解决方案 1、一开始以为是没有给测试类加public修饰 2、然后替换 Test 注解的包可以解决&#xff0c;将 org.junit.jupiter.api.Test 修改为 org.junit.Tes…

gbase8s之mysql的show命令实现

第一步&#xff1a;生成show.sh脚本 cat /home/gbase/show.sh #!/bin/bash #作者&#xff1a;乡村野中医 #创作时间2024-11-21 #脚本名称show.sh function show(){ #echo $# if [ "xdatabases" x$1 ] then echo "select name from sysdatabases;"|…

高级java每日一道面试题-2024年11月19日-基本篇-获取一个类Class对象的方式有哪些?

如果有遗漏,评论区告诉我进行补充 面试官: 获取一个类Class对象的方式有哪些? 我回答: 在 Java 中&#xff0c;获取一个类的 Class 对象有多种方式。这些方式各有优缺点&#xff0c;适用于不同的场景。以下是常见的几种方法及其详细解释&#xff1a; 1. 使用 new 关键字实…

android 实现答题功能

一、效果 二、实现思路 1、界面实现 实现起来其实不难&#xff0c;首先我们可以看到&#xff0c;界面是由答题进度、题目、选项ABCD组成&#xff0c;现在就是要考虑实现方式&#xff0c;答题进度可以使用Textviewprogressbar实现&#xff0c;题目直接使用Textview&#xff0c;…

正排索引和倒排索引

一、简介 正排索引&#xff1a;一个未经处理的数据库中&#xff0c;一般是以文档ID作为索引&#xff0c;以文档内容作为记录。 倒排索引&#xff1a;Inverted index&#xff0c;指的是将单词或记录作为索引&#xff0c;将文档ID作为记录&#xff0c;这样便可以方便地通过单词或…

深入理解Java异常:检查型与非检查型异常的区别与实践

目录 一、Java异常的基本概念 二、检查型异常与非检查型异常的区别 1. 检查型异常&#xff08;Checked Exception&#xff09; 2. 非检查型异常&#xff08;Unchecked Exception&#xff09; 三、检查型与非检查型异常的代码示例 1. 检查型异常示例 2. 非检查型异常示例…

C++初始化成员列表

1.介绍&#xff1a; 初始化成员列表是 C 中的一种构造函数语法&#xff0c;允许在对象构造时直接初始化类的成员变量&#xff0c;而不是先默认初始化再赋值 2.用法&#xff1a; ClassName(参数列表) : 成员1(参数1), 成员2(参数2), ... {// 构造函数体 }&#xff08;1&#…

Django一分钟:django中收集关联对象关联数据的方法

场景&#xff1a;我有一个模型&#xff0c;被其它多个模型关联&#xff0c;我配置了CASCADE级联删除&#xff0c;我想要告知用户删除该实例之后&#xff0c;哪些关联数据将会被一同删除。 假设我们当前有这样一组模型&#xff1a; class Warehouse(models.Model):""…

统计班级中的说谎者(字节青训)

题目 班里有 N 个学生&#xff0c;第 i 个学生的分数是 A_i。当且仅当分数 < A_i 的学生数量多于分数比他高的数量时&#xff0c;第 i 个学生会说谎。求出有多少学生会说谎。 输入格式 输入 N 学生的成绩&#xff0c;包含 A_1, A_2, ..., A_N 输出格式 对于每组数据&am…

卷积神经网络各层介绍

目录 1 卷积层 2 BN层 3 激活层 3.1 ReLU&#xff08;Rectified Linear Unit&#xff09; 3.2 sigmoid 3.3 tanh&#xff08;双曲正切&#xff09; 3.4 Softmax 4 池化层 5 全连接层 6 模型例子 1 卷积层 卷积是使用一个卷积核&#xff08;滤波器&#xff09;对矩阵进…

【工控】线扫相机小结 第四篇

背景 这一片主要是对第三篇继续补充。话说上一篇讲到了两种模式的切换&#xff0c;上一篇还遗留了一个Bug&#xff0c;在这一篇里进行订正&#xff01; 代码回顾 /// <summary>/// 其实就是打开触发/// </summary>void SetLineSacanWorkMode(){-----首先设置为帧…

MySql面试题.运维面试题之五

《(全国)MySQL数据库DBA测试题-第1套》 卷面总分 题号 单选题 多选题 判断题 100 题分 42 40 18 得分 一、单选题(每题3分,共计42分;得分____) 1. 二进制rpm包安装的mysql数据库,默认的数据文件存放在如下哪个目录里? A、/usr/local/mysql B、/tmp/ C、/var/lib/my…

AI 大模型重塑软件开发的未来

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

【软考】系统架构设计师-计算机系统基础(4):计算机网络

计算机网络功能&#xff1a;数据通信、资源共享、管理集中化、分布式处理、负载均衡 5G高峰速率&#xff1a;10Gbit/s 广域网&#xff08;因特网&#xff09;/城域网/局域网&#xff08;以太网&#xff09; 总线型&#xff1a;利用率低&#xff0c;易冲突&#xff0c;干扰大…

Ultiverse 和web3新玩法?AI和GameFi的结合是怎样

Gamef 和 AI 是我们这个周期十分看好两大赛道之一&#xff0c;(Gamef 拥有极强的破圈效应&#xff0c;引领 Web2 用户进军 Web3 最佳利器。AI是这个周期最热门赛道&#xff0c;无论 Web2的 OpenAl&#xff0c;还是 Web3&#xff0c;都成为话题热议焦点。那么结合 GamefiA1双叙事…

Matlab多输入单输出之倾斜手写数字识别

本文主要介绍使用matlab构建多输入单输出的网络架构&#xff0c;来实现倾斜的手写数字识别&#xff0c;使用concatenationLayer来拼接特征&#xff0c;实现网络输入多个特征。 1.加载训练数据 加载数据&#xff1a;手写数字的图像、真实数字标签和数字顺时针旋转的角度。 lo…

R | 统一栅格数据的坐标系、分辨率和行列号

各位同学&#xff0c;在做相关性等分析时&#xff0c;经常会遇到各栅格数据间的行列号不统一等问题&#xff0c;下面的代码能直接解决这类麻烦。以某个栅格数据的坐标系、分辨率和行列号为准&#xff0c;统一文件夹内所有栅格并输出到新的文件夹。 代码只需要更改输入输出和ti…

分布式缓存 + 数据存储 + 消息队列知识体系

文章目录 1. 分布式缓存的原理和技术2. 数据存储3. 数据的备份、恢复、迁移4. 项目案例分析5. 消息队列的原理和技术6. 消息队列的高级特性7. 项目案例分析 1. 分布式缓存的原理和技术 分布式缓存&#xff1a;分布式缓存是一种将数据存储在网络中的多个节点上的技术&#xff0c…

Nginx配置多前端,页面刷新404

nginx配置前端页面使用如下 location / {root /usr/share/nginx/html/zhtj;index index.html index.htm;} 但是这种页面刷新时候会显示404&#xff0c;解决办法如下 location / {root /usr/share/nginx/html/zhtj;index index.html index.htm;try_files $uri $uri/ /ind…

UE5 第一人称射击项目学习(完结)

这个项目几乎完结了。 也算我上手的第一个纯蓝图小项目。 现在只剩下缝缝补补了。 之前把子弹设计为蓝图&#xff0c;这里要引入C的面向对象思想&#xff0c;建立成员函数。 首先双击打开子弹的蓝图 这边就可以构造成员函数 写一个print your name 在这里生成成员函数后&am…