当前位置: 首页 > news >正文

电商项目之有趣的支付签名算法

在这里插入图片描述

文章目录

  • 1 问题背景
  • 2 思路
  • 3 代码实现

1 问题背景

在发起支付的时候,一般都需要对发送的请求参数进行加密或者签名,下文简称这个过程为“签名”。行业内比较普遍的签发算法有:
(1)按支付渠道给定的字段排序进行拼接,最后再拼一个密钥,形成一个待签名的字符串tobeSign,然后对这个tobeSign进行MD5编码。比如MD5(商户号+子应用ID+商户订单号+流水号+金额+币种+密钥)
(2)针对请求参数中的字段(仅针对第一层的字段,不需要针对字段里面的字段,即不需要递归),进行字典升序排序,用格式key=value&连接符拼接,最后再拼一个密钥,再用MD5编码比如MD5(a=value1&b=value2&key=密钥)
这次遇到一种比较有趣的签名算法,笔者认为是基于第(2)的变种,渠道方要求针对请求参数中的字段,如果该字段是对象类型,那么该字段里面的字段也要按字典升序排序进行拼接,相当于是递归字典升序,困难度有一点提升

2 思路

文字描述得有点抽象,可以结合第3小节的代码实现来看

遍历每一层字段,都用一个容器存起来,要按字典升序存。维护一个层序遍历的容器——双向队列。将前面升序的数据入队。遍历队列的每一元素,元素从队头出队,再遍历元素中的字段是否是对象类型或者数组类型,使用一个容器存起来,要按字典降序存,存完后使用头插法入队。使用头插法倒叙入队,每一次从队头遍历,那么每一次遍历都是升序遍历。

3 代码实现

解释:代码中的BeansUtil.bean2MapIgnoreEmptyStr()是将对象转成一个Map。SymbolConstant.EQUAL的值是一个=SymbolConstant.AND的值是一个&

public static String buildToBeSignStr(Object payReq) {// 将对象转成一个MapMap<String, String> map = BeansUtil.bean2MapIgnoreEmptyStr(payReq);TreeMap<String, String> treeMap = new TreeMap<>(map);List<String> result = new LinkedList<>();for (Map.Entry<String, String> entry : treeMap.entrySet()) {// 层序遍历容器Deque<Map.Entry<String, String>> bfsHolder = new LinkedList<>();// 结果暂存容器List<String> tmpResult = new LinkedList<>();// 入队bfsHolder.offer(entry);while (CollectionUtils.isNotEmpty(bfsHolder)) {Map.Entry<String, String> pollEntry = bfsHolder.poll();String pKey = pollEntry.getKey();String pVal = pollEntry.getValue();if (StringUtils.isNotBlank(pVal) && JSONValidator.from(pVal).validate()) {// 是json串,仍需要继续解析log.info("value of key:{} is json str.", pKey);// 解析JSON字符串Object parsedObject = JSON.parse(pVal);boolean isJSONObject = parsedObject instanceof JSONObject;boolean isJSONArray = parsedObject instanceof JSONArray;if (isJSONObject || isJSONArray) {Map<String, String> map1 = null;if (isJSONObject) {log.info("JSON字符串是一个对象");JSONObject jsonObject = (JSONObject) parsedObject;// 处理对象map1 = BeansUtil.buildMapFromJsonStr(pVal);} else if (isJSONArray) {System.out.println("JSON字符串是一个数组");JSONArray jsonArray = (JSONArray) parsedObject;// 处理数组for (Object o : jsonArray) {map1 = BeansUtil.bean2MapIgnoreEmptyStr(o);}}if (MapUtils.isNotEmpty(map1)) {// 倒叙排序Map<String, String> treeMap1 = new TreeMap<>(Comparator.reverseOrder());treeMap1.putAll(map1);// 插入到队头Streams.of(treeMap1.entrySet()).forEach(bfsHolder::offerFirst);}} else {tmpResult.add(pKey + SymbolConstant.EQUAL + pVal);}} else {tmpResult.add(pKey + SymbolConstant.EQUAL + pVal);}}if (CollectionUtils.isNotEmpty(tmpResult)) {String tmpResultStr = String.join(SymbolConstant.AND, tmpResult);result.add(tmpResultStr);}}if (CollectionUtils.isNotEmpty(result)) {return String.join(SymbolConstant.AND, result);}return "";}

相关文章:

电商项目之有趣的支付签名算法

文章目录 1 问题背景2 思路3 代码实现 1 问题背景 在发起支付的时候&#xff0c;一般都需要对发送的请求参数进行加密或者签名&#xff0c;下文简称这个过程为“签名”。行业内比较普遍的签发算法有&#xff1a; &#xff08;1&#xff09;按支付渠道给定的字段排序进行拼接&am…...

Web开发核心

文章目录 1.http协议简介2.http协议特性3.http请求和响应协议4.最简单的Web程序5.基于flask搭建web⽹站6.浏览器开发者⼯具&#xff08;重点&#xff09; 1.http协议简介 HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写&#xff0c;是用于 万维网(WWW:Norld W…...

【Python】【Scrapy 爬虫】理解HTML和XPath

为了从网页中抽取信息&#xff0c;必须对其结构有更多了解。我们快速浏览HTML、HTML的树状表示&#xff0c;以及在网页上选取信息的一种方式XPath。 HTML、DOM树表示以及XPath 互联网是如何工作的&#xff1f; 当两台电脑需要通信的时候&#xff0c;你必须要连接他们&#xff…...

【CTF Web】CTFShow web5 Writeup(SQL注入+PHP+位运算)

web5 1 阿呆被老板狂骂一通&#xff0c;决定改掉自己大意的毛病&#xff0c;痛下杀手&#xff0c;修补漏洞。 解法 注意到&#xff1a; <!-- flag in id 1000 -->拦截很多种字符&#xff0c;连 select 也不给用了。 if(preg_match("/\|\"|or|\||\-|\\\|\/|\…...

LeetCode 968.监控二叉树 (hard)

968.监控二叉树 力扣题目链接(opens new window) 给定一个二叉树&#xff0c;我们在树的节点上安装摄像头。 节点上的每个摄影头都可以监视其父对象、自身及其直接子对象。 计算监控树的所有节点所需的最小摄像头数量。 贪心思路&#xff1a; 从下往上看&#xff0c;局部最…...

数理逻辑:1、预备知识

17.1 命题和联结词 ​ 命题&#xff1a;可以判定真假的陈述句。&#xff08;则悖论&#xff0c;祈使句&#xff0c;疑问句都不是命题&#xff09; ​ 原子命题&#xff1a;不能被分割为更小的命题的命题 例如&#xff1a; 2既是素数又是偶数 可以由$p: 2 是素数&#xff0c;…...

14-云原生监控体系-Redis_exporter 监控 MySQL[部署Dashborad告警规则实战]

文章目录 环境准备切片集群主从哨兵1. 部署1.1. 二进制方式1.1.1. 下载二进制包1.1.2. 部署1.2. docker-compose 容器方式1.3. 配置连接&认证参数1.3.1. 连接认证参数1.3.2. 配置服务控制 systemd2. 配置到 Prometheus3 Dashboard4. 告警规则...

DOS学习-目录与文件应用操作经典案例-xcopy

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一.前言 二.使用 三.案例 一.前言 xcopy命令是DOS系统中一个强大的文件和目录复制工具&…...

Midjourney是一个基于GPT-3.5系列接口开发的免费AI机器人

Midjourney是一个基于GPT-3.5系列接口开发的免费AI机器人&#xff0c;旨在提供多领域的智能对话服务。Midjourney在不同领域中有不同的定义和应用&#xff0c;以下是对其中两个主要领域的介绍&#xff1a; Midjourney官网&#xff1a;https://www.midjourney.com/ 一、AI绘画工…...

v-model详解

目录 原理 作用 表单类组件封装 ​编辑v-model简化代码 原理 v-model本质上是一个语法糖。例如应用在输入框上&#xff0c;就是value属性和input属性的合写。 作用 提供数据的双向绑定。 数据变&#xff0c;视图跟着变:value视图变&#xff0c;数据跟着变input 注意&…...

ArcGIS中分割与按属性分割的区别

1、分割ArcGIS批量导出各个市的县级行政边界 视频教学&#xff1a; ArcGIS批量导出各个市的县级行政边界002 2、ArcGIS批量导出全国各省的边界 视频教学&#xff1a; ArcGIS导出全国各省的边界003 推荐学习&#xff1a; ArcGIS全系列实战视频教程——9个单一课程组合系列直播回…...

就业班 第三阶段(ELK) 2401--5.20 day1 ELK 企业实战 ES+head+kibana+logstash部署(最大集群)

ELKkafkafilebeat企业内部日志分析系统 1、组件介绍 1、Elasticsearch&#xff1a; 是一个基于Lucene的搜索服务器。提供搜集、分析、存储数据三大功能。它提供了一个分布式多用户能力的全文搜索引擎&#xff0c;基于RESTful web接口。Elasticsearch是用Java开发的&#xff…...

PCM和QAM

PCM&#xff08;脉冲编码调制&#xff09;和QAM&#xff08;正交振幅调制&#xff09;是两种不同的信号调制技术&#xff0c;它们在通信系统中有着不同的应用和特点。 PCM&#xff08;脉冲编码调制&#xff09; 概述 PCM是一种数字信号处理技术&#xff0c;用于将模拟信号转…...

Mongodb分布式id

1、分布式id使用场景 分布式ID是指在分布式系统中用于唯一标识每个元素的数字或字符串。在分布式系统中&#xff0c;各个节点或服务可能独立运行在不同的服务器、数据中心或地理位置&#xff0c;因此需要一种机制来确保每个生成的ID都是全局唯一的&#xff0c;以避免ID冲突。 …...

AI模型抉择:开源VS闭源,谁主沉浮?

AI模型抉择&#xff1a;开源VS闭源&#xff0c;谁主沉浮&#xff1f; &#x1f604;生命不息&#xff0c;写作不止 &#x1f525; 继续踏上学习之路&#xff0c;学之分享笔记 &#x1f44a; 总有一天我也能像各位大佬一样 &#x1f3c6; 博客首页 怒放吧德德 To记录领地 &am…...

佩戴安全头盔监测识别摄像机

佩戴安全头盔是重要的安全措施&#xff0c;尤其在工地、建筑工程和工业生产等领域&#xff0c;安全头盔的佩戴对于工人的生命安全至关重要。为了更好地管理和监控佩戴安全头盔的情况&#xff0c;监测识别摄像机成为了一项重要的工具。监测识别摄像机可以通过智能技术监测并记录…...

5.24学习记录

[FSCTF 2023]ez_php2 比较简单的pop链 <?php highlight_file(__file__); Class Rd{public $ending;public $cl;public $poc;public function __destruct(){echo "All matters have concluded";die($this->ending);}public function __call($name, $arg){for…...

创建FreeRTOS工程

创建STM32CubeMX工程 配置时钟 配置FreeRTOS 生成Keil MDK的工程 打开工程 结尾 这就是我们用STM32CubeMX创建的最基本的一个FreeRTOS的工程。可以看到&#xff0c;这个与我们使用stm32开发的裸机程序有相同的地方&#xff0c;也有不同的地方&#xff0c;我们可以发现&am…...

HTML中 video标签样式铺满全屏

video标签默认不是铺满的&#xff0c;即使手动设置宽高100%也不会生效&#xff0c;所以当需要video铺满div时&#xff0c;需要加上一个css样式 <videocontrolsstyle"width: 100%; height: 100%; object-fit: fill"autoplay:src"item.video" ></v…...

vue项目移动端商场

一、项目前端页面展示 二、项目整体目录结构 三、项目流程 1. vue快速创建基础项目 创建项目 vue create hk-shop 1 选择需要的配置 创建基础文件夹目录 src文件夹下文件夹目录&#xff1a; ① views 文件夹存放界面 ② components 文件夹存放界面中局部组件 ③ config 文件夹存…...

达摩院春联AI实战落地:中小企业春节营销内容智能生产方案

达摩院春联AI实战落地&#xff1a;中小企业春节营销内容智能生产方案 1. 引言&#xff1a;当春节营销遇上AI 春节&#xff0c;是中国人最重要的节日&#xff0c;也是商家营销的黄金时段。对于中小企业来说&#xff0c;如何在这个节点高效、低成本地创作出有年味、有创意的营销…...

RMBG-2.0在在线教育平台的应用:自动为讲师照片生成透明背景直播贴纸

RMBG-2.0在在线教育平台的应用&#xff1a;自动为讲师照片生成透明背景直播贴纸 1. 引言&#xff1a;在线教育讲师的“形象”难题 如果你是一位在线教育平台的讲师&#xff0c;或者负责运营一个知识付费的直播间&#xff0c;你一定遇到过这样的场景&#xff1a; 直播前&…...

工业水质快检试剂盒怎么选?这家国产品牌值得关注

在工业水处理与环境监测领域&#xff0c;快速、准确的水质检测是保障生产安全和环保合规的关键环节。传统实验室检测流程复杂、耗时长&#xff0c;难以满足现场快速筛查和应急决策需求。面对这一行业痛点&#xff0c;水质快检试剂盒凭借操作简便、响应迅速的特点&#xff0c;正…...

数据库安全与运维管控(二):从“共享账号”到本地账密泄露分析

在日常的研发联调和生产排障中&#xff0c;开发人员不可避免地需要连接数据库来核对数据或验证逻辑。目前绝大多数企业的做法依然是&#xff1a;DBA 在底层数据库中执行 GRANT 命令&#xff0c;创建一个只读账号&#xff08;如 dev_readonly&#xff09;&#xff0c;然后将 IP …...

[特殊字符]Liberty Parser 可视化工具

一个纯前端、开箱即用的 .lib 文件解析 可视化分析工具。 &#x1f5bc;️ 工具界面一览 &#xff08;这里你可以放截图&#xff0c;效果很好&#xff09; 工具支持&#xff1a; &#x1f4c2; 直接上传 .lib 文件&#x1f50d; 实时筛选 cell / pin&#x1f4ca; 可视化展…...

你的SSH密钥可能已经过期了评

引言 在现代软件开发中&#xff0c;性能始终是衡量应用质量的重要指标之一。无论是企业级应用、云服务还是桌面程序&#xff0c;性能优化都能显著提升用户体验、降低基础设施成本并增强系统的可扩展性。对于使用 C# 开发的应用程序而言&#xff0c;性能优化涉及多个层面&#x…...

3.一文看懂反向传播:从单个神经元到 PyTorch 自动求导

反向求导&#xff0c;多层次对应一个神经&#xff0c;单个神经元场景 学习这一篇的前提是&#xff0c;已经学会了梯度算法和线性结构算法&#xff0c;不明白的可以去看我之前的文章。 前面看不懂的&#xff0c;直接跳转到 “ 反向传播的流程 ” 底层的数学算法 z 是中间变量 u …...

如何快速搭建个人数字图书馆:Talebook私有书库终极指南

如何快速搭建个人数字图书馆&#xff1a;Talebook私有书库终极指南 【免费下载链接】talebook 一个简单好用的个人书库 项目地址: https://gitcode.com/gh_mirrors/ta/talebook 想要拥有一个属于自己的数字图书馆吗&#xff1f;Talebook是一个基于Calibre的简单好用的个…...

问题解决策略基础算法实现训练1

问题 A&#xff1a; C 语言习题 字符串排序 [提交] [状态]题目描述 输入nnn个字符串&#xff0c;将它们按字母由小到大的顺序排列并输出。编写三个函数实现&#xff0c; 用于输出inputnnn个字符串&#xff0c; 用于排序sortstrnnn个字符串&#xff0c; 用于输出outputnnn个字符…...

如何安装Oracle 12c Cloud Control_OMS服务端组件与Agent部署

OMS安装卡在“Configuring Enterprise Manager Cloud Control”阶段主因是数据库连接失败或SYSAUX表空间不足&#xff1b;Agent状态为“Unknown”多因证书未信任或OMS URL缺失协议/端口&#xff1b;升级失败系OMS更新目录未手动同步补丁&#xff1b;Windows监控SQL Server需启用…...