【抖音小程序】通用交易系統-下單問題整理

在通用交易系統中,支付流程如下

1、服務端-預下單:生成參數與簽名信息(此過程不需要與抖音平臺對接)

參考?生成下單參數與簽名_抖音開放平臺

2、小程序用戶端:根據返回的參數與簽名,拉起抖音支付(tt.requestOrder、tt.getOrderPayment)??

參考??tt.requestOrder_抖音開放平臺

3、服務端:接收抖音回調、或主動查詢訂單(此過程需要小程序正式發布

1、生成應用公私鑰

抖音的密鑰分為:應用、平臺兩種類型,注意區分。

進入抖音簽名工具平臺

生成好后,需要將公鑰配置到抖音的控制臺中。

每次修改應用公鑰,都會變更keyVersion 值,后續簽名過程需要匹配該值。注意

2、生成參數與簽名

注意查看 官網文檔中對 [生成下單參數與簽名]? 必傳參數的要求。

抖音非必傳參數的兩種要求:

1)創建對象中,不允許出現該參數
2)該參數需要給定默認值,不能為 null?

待簽名對象


import java.io.Serializable;
import java.util.List;/**** 抖音下單,簽名對象* @author xuancg* @date 2025/6/6*/
public class DyOrderSignData implements Serializable {/**目前只支持傳入一項*/private List<Sku> skuList;private String outOrderNo;/*** 訂單總金額* 單位:分*/private Integer totalAmount;/**支付超時時間 秒、非必傳*/private Integer payExpireSeconds = 300;private String payNotifyUrl;/**開發者自定義收款商戶號、非必傳*///private String merchantUid;private GoodsPage orderEntrySchema;/*** 屏蔽的支付方式,當開發者沒有進件某個支付渠道,可在下單時屏蔽對應的支付方式。* 如:[1, 2]表示屏蔽微信和支付寶*/private Integer[] limitPayWayList = new Integer[0];public static class Sku implements Serializable{private String skuId;private Integer price;private Integer quantity;/**商品標題,長度 <= 256字節 */private String title;private List<String> imageList;/**商品類型,詳見此處的商品類型枚舉值*/private Integer type;/**交易規則標簽組*/private String tagGroupId;/**非必傳*///private IndustryOrderGoodsPage entrySchema;/**非必傳*/private String skuAttr;}/*** 商品詳情頁*/public static  class GoodsPage {/*** 訂單詳情頁跳轉路徑,沒有前導的“/”,長度 <= 512byte*/private String path;/*** 訂單詳情頁路徑參數,自定義的 json 結構,* 序列化成字符串存入該字段,平臺不限制* 但是寫入的內容需要能夠保證生成訪問訂單詳情的schema能正確跳轉到小程序內部的訂單詳情頁* 長度 <= 512byte* 選填*/// private String params;}}

?

簽名工具類

public class DecryptUtils {public static String getByteAuthorization(String privateKeyStr, String data, String appId, String nonceStr, long timestamp, String keyVersion) {String byteAuthorization = "";try {// 生成簽名String signature = getSignature(privateKeyStr, "POST", "/requestOrder", timestamp, nonceStr, data);System.out.println(signature);// 構造byteAuthorizationStringBuilder sb = new StringBuilder();sb.append("SHA256-RSA2048 ").append("appid=").append(appId).append(",").append("nonce_str=").append(nonceStr).append(",").append("timestamp=").append(timestamp).append(",").append("key_version=").append(keyVersion).append(",").append("signature=").append(signature).append("");byteAuthorization = sb.toString();} catch (Exception ex) {ex.printStackTrace();return "";}return byteAuthorization;}public static String getSignature(String privateKeyStr, String method, String uri, long timestamp, String nonce, String data) throws Exception {data = data.replace("\\", "");System.out.println(data);String rawStr = method + "\n" +uri + "\n" +timestamp + "\n" +nonce + "\n" +data + "\n";privateKeyStr = privateKeyStr.replace("\n","");System.out.println(rawStr);System.out.println(privateKeyStr);Signature sign = Signature.getInstance("SHA256withRSA");sign.initSign(string2PrivateKey(privateKeyStr));sign.update(rawStr.getBytes(StandardCharsets.UTF_8));return Base64.getEncoder().encodeToString(sign.sign());}public static PrivateKey string2PrivateKey(String privateKeyStr) {PrivateKey prvKey = null;try {byte[] privateBytes = Base64.getDecoder().decode(privateKeyStr);PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateBytes);KeyFactory keyFactory = KeyFactory.getInstance("RSA");prvKey = keyFactory.generatePrivate(keySpec);} catch (Exception ex) {ex.printStackTrace();}return prvKey;}}

調用簽名方法

/*** 待簽名串一共有五行(且必須嚴格按照以下順序),每一行必須以 \n(換行符,ASCII 編碼值為 0x0A)結束。* POST\n/requestOrder\n請求時間戳\n請求隨機串\ndata\n*/public  String createByteSign(DyOrderSignData request){// 請求時間戳long timestamp = System.currentTimeMillis()/1000L;// 隨機字符串String nonceStr = UUID.randomUUID().toString();String data = JSONUtil.toJsonStr(request);// 應用公鑰版本,每次重新上傳公鑰后需要更新,可通過「開發管理-開發設置-密鑰設置」處獲取String keyVersion = "3";String appId = "";String appPrivateContent = "";return DecryptUtils.getByteAuthorization(appPrivateContent,data, appId, nonceStr, timestamp, keyVersion);}

獲取應用私鑰內容

/***
* classpath:app/rsa_private_key.pem
*/
public String loadKeyContent(String configPath)  {String path = configPath;if (configPath.startsWith("classpath:")) {path = configPath.replaceFirst("classpath:", "");}if (!path.startsWith("/")) {path = "/" + path;}try {ClassPathResource classPathResource = new ClassPathResource(path);String content =  FileUtils.readFileToString(classPathResource.getFile(), StandardCharsets.UTF_8);String[] repls = {"-----BEGIN PRIVATE KEY-----", "-----END PRIVATE KEY-----", "\n", "\r"};for (String repl : repls) {content = content.replace(repl, "");}return content;} catch (Exception e) {e.printStackTrace();}return null;}

?

返回前端內容

DyOrderSignData request
1、簽名內容:String byteSign = createByteSign(request);
2、原始對象字符串(不建議傳原始對象,官網的示例不合理):

String objStr = JSONUtil.toJsonStr(request);

?3、問題問題

先通過抖音簽名工具,驗證生成的簽名內容是否一致。

簽名不一致

1、檢查是否使用應用私鑰進行簽名

2、私鑰字符串內容不能用換行符、頭部、尾部申明、其他隱藏符號等。

3、轉化的參數對象是否一致。即在第五行,傳入的JSON對象,可以在代碼中打印內容。然后粘貼到簽名工具中進行驗證。

前端簽名失敗

1、如果是參數缺少、格式錯誤:請添加參數默認值,或者調整參數格式

2、下單errNo:11084 下單errMsg:requestOrder:fail 簽名校驗異常

由后端返回下單的參數對象 字符串,不能由前端將對象進行json轉化。

如果在上一步簽名不一致問題解決后,仍然出現簽名校驗異常

1)檢查控制臺的應用公鑰與私鑰是否匹配

2)檢查keyVersion版本是否匹配

3)檢查后端的下單對象封裝JSON格式與返回前端字符串的JSON格式是否一致。

4)JSON對象中,不能有轉義符\\ 、換行符 等特殊符號

沒有收到抖音回調

小程序沒有發布上線

?

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

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

相關文章

模型參數、模型存儲精度、參數與顯存

模型參數量衡量單位 M&#xff1a;百萬&#xff08;Million&#xff09; B&#xff1a;十億&#xff08;Billion&#xff09; 1 B 1000 M 1B 1000M 1B1000M 參數存儲精度 模型參數是固定的&#xff0c;但是一個參數所表示多少字節不一定&#xff0c;需要看這個參數以什么…

EurekaServer 工作原理

一、核心工作流程 二、核心組件解析 1. 自動配置引擎 入口&#xff1a;EnableEurekaServer 引入 EurekaServerMarkerConfiguration&#xff0c;創建標記Bean Marker觸發條件&#xff1a;EurekaServerAutoConfiguration 檢測到 Marker 存在時激活關鍵Bean初始化&#xff1a; …

Playwright 與 Selenium:自動化測試的兩大主流工具對比

《Playwright 與 Selenium&#xff1a;自動化測試的兩大主流工具對比》 *Playwright 和 Selenium 是自動化測試領域的兩大主流工具&#xff0c;二者在架構設計、功能特性和適用場景上存在顯著差異&#xff0c;以下是核心對比&#xff1a; 一、架構與設計理念 維度Playwright…

網絡編程(Modbus進階)

思維導圖 Modbus RTU&#xff08;先學一點理論&#xff09; 概念 Modbus RTU 是工業自動化領域 最廣泛應用的串行通信協議&#xff0c;由 Modicon 公司&#xff08;現施耐德電氣&#xff09;于 1979 年推出。它以 高效率、強健性、易實現的特點成為工業控制系統的通信標準。 包…

R語言速釋制劑QBD解決方案之二

影響含量均一性的顯著因子&#xff08;%RSD&#xff09; 數據分析表明含量均一性的彎曲性不顯著。如半正態圖&#xff08;圖12&#xff09;所示&#xff0c;影響含量均一性的顯著因子為A&#xff08;原料藥粒徑&#xff09;和C&#xff08;MCC/Lactose&#xff09;。 mod2 <…

大模型原理、架構與落地

近年來&#xff0c;大模型&#xff08;Large Language Models&#xff0c;LLMs&#xff09;在人工智能領域迅猛發展&#xff0c;從GPT-3到GPT-4、Claude、Gemini、文心一言、GLM等模型相繼發布&#xff0c;大模型已逐漸走出實驗室&#xff0c;邁向產業落地。本文將從技術原理、…

WWDC 2025 macOS 26有哪些更新點

在2025年6月10日凌晨結束的WWDC 2025發布會中&#xff0c;蘋果正式發布了全新的macOS 26&#xff0c;并給其命名為Tahoe。 以下為macOS相關的主要內容&#xff1a; 命名方式改變 蘋果正式將各大系統的版本號改為對應年份&#xff0c;讓命名方式更直觀好記&#xff0c;macOS 2…

AI+預測3D新模型百十個定位預測+膽碼預測+去和尾2025年6月10日第104彈

從今天開始&#xff0c;咱們還是暫時基于舊的模型進行預測&#xff0c;好了&#xff0c;廢話不多說&#xff0c;按照老辦法&#xff0c;重點8-9碼定位&#xff0c;配合三膽下1或下2&#xff0c;殺1-2個和尾&#xff0c;再殺4-5個和值&#xff0c;可以做到100-300注左右。 (1)定…

.NET 8集成阿里云短信服務完全指南【短信接口】

文章目錄 前言一、準備工作1.1 阿里云賬號準備1.2 .NET 8項目創建 二、集成阿里云短信SDK2.1 安裝NuGet包2.2 配置阿里云短信參數2.3 創建配置類 三、實現短信發送服務3.1 創建短信服務接口3.2 實現短信服務3.3 注冊服務 四、創建控制器五、測試與優化5.1 單元測試5.2 性能優化…

解決HuggingFace不能git clone的問題

今天在從HuggingFace上clone項目的時候&#xff0c;一直出現超時問題&#xff0c;查了很多資料沒有解決&#xff0c;后來向mentor請教了一下&#xff0c;可以通過鏡像的方法解決這個問題&#xff0c;所以把方法放上來&#xff0c;希望對大家有幫助。 HuggingFace的服務器在國外…

Zookeeper 集群部署與故障轉移

Zookeeper 介紹 Zookeeper 是一個開源的分布式協調服務&#xff0c;由Apache基金會維護&#xff0c;專為分布式應用提供高可用、強一致性的核心基礎能力。它通過簡單的樹形命名空間&#xff08;稱為ZNode樹&#xff09;存儲數據節點&#xff08;ZNode&#xff09;&#xff0c;…

簡單聊下阿里云DNS劫持事件

阿里云域名被DNS劫持事件 事件總結 根據ICANN規則&#xff0c;域名注冊商&#xff08;Verisign&#xff09;認定aliyuncs.com域名下的部分網站被用于非法活動&#xff08;如傳播惡意軟件&#xff09;&#xff1b;頂級域名DNS服務器將aliyuncs.com域名的DNS記錄統一解析到shado…

服務器出現故障怎么辦?快速排查與解決方法

服務器故障的常見原因分析 硬件故障&#xff1a;內存、硬盤、網絡設備故障。 軟件故障&#xff1a;操作系統、應用程序、數據庫異常。 網絡攻擊&#xff08;如DDoS攻擊&#xff09;造成資源耗盡。 快速排查故障的步驟 檢查監控系統報警日志。 查看系統資源使用情況&#x…

Claude vs ChatGPT vs Gemini:功能對比、使用體驗、適合人群

隨著AI應用全面進入生產力場景&#xff0c;市面上的主流AI對話工具也進入“三國殺”時代&#xff1a; Claude&#xff08;Anthropic&#xff09;&#xff1a;新銳崛起&#xff0c;語言邏輯驚艷&#xff0c;Opus 模型被稱為 GPT-4 殺手ChatGPT&#xff08;OpenAI&#xff09;&a…

Git 使用大全:從入門到精通

Git 是目前最流行的分布式版本控制系統&#xff0c;被廣泛應用于軟件開發中。本文將全面介紹 Git 的各種功能和使用方法&#xff0c;包含大量代碼示例和實踐建議。 文章目錄 Git 基礎概念版本控制系統Git 的特點Git 的三個區域Git 文件狀態 Git 安裝與配置安裝 GitLinuxmacOSWi…

SpringBoot 框架第 1 次接口調用慢

文章目錄 背景分析思路 1:DeepSeek 分析思路 2:日志分析思路 3:Arthas 分析下載 Arthas啟動 Arthastrace 調用耗時分析Controller 調用耗時Service 調用分析ServiceImpl 耗時分析IService 耗時分析BaseMapper 耗時分析debug 執行鏈路MyBatisMapperProxy 解讀解決思路 1:預熱…

數據分析Agent構建

數據分析agent構建 代碼資料來源于 Streamline-Analyst&#xff0c;旨在通過該倉庫上的代碼了解如何使用大語言模型構建數據分析工具&#xff1b; 個人倉庫&#xff1a;Data-Analysis-Agent-Tutorial 不同的在于 Data-Analysis-Agent-Tutorial 是在 Streamline-Analyst 基礎…

Java后端檢查空條件查詢

通過拋出運行異常&#xff1a;throw new RuntimeException("請輸入查詢條件&#xff01;");BranchWarehouseServiceImpl.java // 查詢試劑交易&#xff08;入庫/出庫&#xff09;記錄Overridepublic List<BranchWarehouseTransactions> queryForReagent(Branch…

6??Go 語言中的哈希、加密與序列化:通往區塊鏈世界的鑰匙

Go 語言中的哈希、加密與序列化:通往區塊鏈世界的鑰匙 一、前言:離區塊鏈還有多遠? 區塊鏈聽起來可能遙不可及,似乎是只有密碼學專家和資深工程師才能涉足的領域。但事實上,構建一個區塊鏈的核心并不復雜,尤其當你已經掌握了一門系統編程語言,比如 Go。 要真正理解區…

python爬蟲——氣象數據爬取

一、導入庫與全局配置 python 運行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用&#xff1a; 引入數據解析、網絡請求、時間處理、數據庫操作等所需庫。requests&#xff1a;發送 …