電商項目之有趣的支付簽名算法

在這里插入圖片描述

文章目錄

  • 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 "";}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/15435.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/15435.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/15435.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C++|設計模式(〇)|設計模式的六大原則

這里文章只做簡要描述&#xff0c;作為掃盲 在軟件開發過程中&#xff0c;遵循一定的設計原則可以幫助開發者創建更加靈活、可維護和可擴展的系統。設計模式的六大原則是面向對象設計的核心理念&#xff0c;本文將詳細介紹這些原則&#xff0c;并結合實例說明它們的重要性和應用…

Android Studio添加依賴 新版 和 舊版 的添加方式(Gradle添加依賴)(Java)

舊版的&#xff08;在線添加&#xff09; 1找 文件 在項目的build.gradle文件中添加依賴(在下面的節點中添加庫 格式 ’ 組 &#xff1a;名字 &#xff1a; 版本號 ‘ ) dependencies {implementation com.example:library:1.0.0 }implementation 組:名字:版本…

【lambdastreammaven】

lambda 匿名函數 為了簡化java中的匿名內部類 事件監聽 寫一個類 實現 ActionListener 接口 (外部類) | | 內部類 類在其他地方用不到, 索性就把這個類定義在類的內部使用 好處: 1.內部可以使用外部類的成員 …

互聯網十萬個為什么之什么是分布式計算?

分布式計算是一種計算方法&#xff0c;它將計算任務分散到多個物理或邏輯上分開的計算機&#xff08;稱為節點&#xff09;上執行&#xff0c;這些節點通過網絡互連并協作完成共同的目標。每個節點具備獨立的處理能力和存儲資源&#xff0c;在分布式系統中&#xff0c;它們共享…

論文閱讀--CLIPasso

讓計算機把真實圖片抽象成簡筆畫&#xff0c;這個任務很有挑戰性&#xff0c;需要模型捕獲最本質的特征 以往的工作是找了素描的數據集&#xff0c;而且抽象程度不夠高&#xff0c;筆畫是固定好的&#xff0c;素描對象的種類不多&#xff0c;使得最后模型的效果十分受限 之所以…

小米財報:業績遠超預期,汽車推著手機跑!

隨著一季度財報陸續出爐&#xff0c;企業間的分化越來越明顯。 新環境下&#xff0c;很多公司都陷入停滯時&#xff0c;去討論“掉隊”已經沒有多少意義&#xff0c;現在真正值得我們關注的&#xff0c;是那些在逆風情況下&#xff0c;還能“領先”的企業。毫無疑問&#xff0…

ES集群性能優化參考建議

Elasticsearch&#xff08;ES&#xff09;集群性能優化是一個多方面的任務&#xff0c;涉及硬件、配置、查詢優化等多個方面。以下是一些建議&#xff0c;幫助你優化Elasticsearch集群的性能&#xff1a; 1. 硬件優化 內存&#xff1a;確保分配給Elasticsearch的內存足夠大&a…

C++|設計模式(三)|抽象工廠模式

抽象工廠模式仍然屬于創建型模式&#xff0c;我們在【簡單工廠和工廠方法模式】這篇文章中&#xff0c;描述了簡單工廠和工廠方法模式&#xff0c;并在文末&#xff0c;簡單介紹了工廠方法模式的局限性。 本文將通過汽車工廠的例子繼續來闡述使用抽象工廠模式相比較于工廠方法…

Linux修煉之路之馮系結構,操作系統

目錄 一&#xff1a;馮諾依曼體系結構 1.五大組件 2.存儲器存在的意義 3.幾個問題 二&#xff1a;操作系統 接下來的日子會順順利利&#xff0c;萬事勝意&#xff0c;生活明朗-----------林辭憂 一&#xff1a;馮諾依曼體系結構 我們當代的計算機的基本構成都是由馮諾依曼…

Kubernetes 容器編排

應用程序部署演變 主要有三個演變&#xff1a; 傳統部署&#xff1a;互聯網早期&#xff0c;會直接將應用程序部署在物理機上 優點&#xff1a;簡單&#xff0c;不需要其它技術的參與 缺點&#xff1a;不能為應用程序定義資源使用邊界&#xff0c;很難合理地分配計算資源&…

【開源】多語言大型語言模型的革新:百億參數模型超越千億參數性能

大型人工智能模型&#xff0c;尤其是那些擁有千億參數的模型&#xff0c;因其出色的商業應用表現而受到市場的青睞。但是&#xff0c;直接通過API使用這些模型可能會帶來數據泄露的風險&#xff0c;尤其是當模型提供商如OpenAI等可能涉及數據隱私問題時。私有部署雖然是一個解決…

PY32F003+RTL8710(AT) 實現獲取天氣情況

一、RTL8710主要AT指令 1、ATSR&#xff1a;模塊重啟 2、ATSE1&#xff1a;開啟回顯 3、ATPW1&#xff1a;station模式 4、ATPNssid,password,,&#xff1a;連接到AP 5、ATPK1&#xff1a;設置自動接收 6、ATPC0,v1.yiketianqi.com,80&#xff1a;與網站建立TCP連接 7、ATPT125…

關于pytorch加載模型報錯問題

load_net[“params”] 報keyerror 加載模型后查看對應參數是什么 model2 torch.load(m1_path "xxx.pth") print(model1.keys())若輸出如下&#xff1a; 已經有相應參數不需要執行 load_net[“params”]若輸出如下 則需要load_net[“params”]

Linux-命令上

at是一次性的任務&#xff0c;crond是循環的定時任務 如果 cron.allow 文件存在&#xff0c;只有在文件中出現其登錄名稱的用戶可以使用 crontab 命令。root 用戶的登錄名必須出現在 cron.allow 文件中&#xff0c;如果這個文件存在的話。系統管理員可以明確的停止一個用戶&am…

3D 生成重建014-Bidiff使用二維和三維先驗的雙向擴散

3D 生成重建014-Bidiff使用二維和三維先驗的雙向擴散 文章目錄 0 論文工作1 論文方法2 效果 0 論文工作 大多數三維生成研究集中在將二維基礎模型向上投影到三維空間中&#xff0c;要么通過最小化二維評分蒸餾采樣&#xff08;SDS&#xff09;損失&#xff0c;要么通過對多視圖…

判斷變量是否為數組的幾種方法

1、isArray 方法 isArray() 方法用于判斷一個對象是否為數組。如果對象是數組返回 true&#xff0c;否則返回 false。 Array.isArray(arr); // true 1 2、對象原型 通過原型鏈判斷是否具有和數組同一原型鏈的頂端。 arr.__proto__ Array.prototype; // true 1 3、instanceof…

[數據結構] -- 雙向循環鏈表

&#x1f308; 個人主頁&#xff1a;白子寰 &#x1f525; 分類專欄&#xff1a;C打怪之路&#xff0c;python從入門到精通&#xff0c;數據結構&#xff0c;C語言&#xff0c;C語言題集&#x1f448; 希望得到您的訂閱和支持~ &#x1f4a1; 堅持創作博文(平均質量分82)&#…

一文理清database/sql包的使用場景和宕機查詢流程

一文理清database/sql包你可能遇到的問題 那么database/sql包實現了什么功能呢&#xff1f;建立數據庫連接檢測連接是否能ping通通過連接進行具體的sql查詢查詢完將連接進行關閉當數據庫宕掉重啟后再次查詢 database/sql包創建的db連接 對于數據庫宕掉后重啟是否仍然有效&#…

AI繪畫工具:創意與技術的完美融合

隨著人工智能技術的飛速發展&#xff0c;我們見證了無數領域的革新與變革。其中&#xff0c;AI繪畫工具的出現&#xff0c;無疑為藝術界帶來了一股清新的風潮。這些工具以其獨特的魅力&#xff0c;吸引了無數藝術家和創意人士的目光&#xff0c;成為他們表達自我、探索未知的重…

Compose在xml中使用滑動沖突處理

一、背景 在現有Android項目中使用Compose可能存在滑動沖突問題&#xff0c;例如 SmartRefreshLayoutCoordinatorLayoutComposeView(ComposeView這里又是一個LazyColumn) 二、解決方案 官方介紹&#xff1a;https://developer.android.google.cn/develop/ui/compose/touch-inp…