From 901e787fc655962b88dac9896b25f41d796cd2c9 Mon Sep 17 00:00:00 2001 From: cctyl <34262992+cctyl@users.noreply.github.com> Date: Sat, 1 Jul 2023 18:44:49 -0700 Subject: [PATCH] =?UTF-8?q?feature:=20App=20Sign=20=E6=B7=BB=E5=8A=A0java?= =?UTF-8?q?=E7=89=88=E6=9C=AC=E5=AE=9E=E7=8E=B0=20(#729)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feature: App Sign 添加java版本实现 * modify: 优化签名代码以及文档 --- docs/misc/sign/APP.md | 70 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 69 insertions(+), 1 deletion(-) diff --git a/docs/misc/sign/APP.md b/docs/misc/sign/APP.md index b2cc7c2..7c4f899 100644 --- a/docs/misc/sign/APP.md +++ b/docs/misc/sign/APP.md @@ -23,7 +23,7 @@ ## Demo -该 Demo 提供 [Python](#Python) 语言例程 +该 Demo 提供 [Python](#Python) 和 [Java](#Java) 语言例程 使用 appkey = `1d8b6e7d45233436`, appsec = `560c52ccd288fed045859ed18bffd973` 对如下 `params` 参数进行签名 @@ -63,3 +63,71 @@ print(query) {'appkey': '1d8b6e7d45233436', 'id': 114514, 'str': '1919810', 'test': 'いいよ,こいよ', 'sign': '01479cf20504d865519ac50f33ba3a7d'} appkey=1d8b6e7d45233436&id=114514&str=1919810&test=%E3%81%84%E3%81%84%E3%82%88%EF%BC%8C%E3%81%93%E3%81%84%E3%82%88&sign=01479cf20504d865519ac50f33ba3a7d ``` + +### Java + + +```java +package io.github.cctyl; + +import java.nio.charset.StandardCharsets; +import java.util.HashMap; +import java.util.Map; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.net.URLEncoder; +import java.util.TreeMap; + +/** + * @author cctyl + */ +public class AppSigner { + + private static final String APP_KEY = "1d8b6e7d45233436"; + private static final String APP_SEC = "560c52ccd288fed045859ed18bffd973"; + + public static String appSign(Map params) { + // 为请求参数进行 APP 签名 + params.put("appkey", APP_KEY); + // 按照 key 重排参数 + Map sortedParams = new TreeMap<>(params); + // 序列化参数 + StringBuilder queryBuilder = new StringBuilder(); + for (Map.Entry entry : sortedParams.entrySet()) { + if (queryBuilder.length() > 0) { + queryBuilder.append('&'); + } + queryBuilder + .append(URLEncoder.encode(entry.getKey(), StandardCharsets.UTF_8)) + .append('=') + .append(URLEncoder.encode(entry.getValue(), StandardCharsets.UTF_8)); + } + return generateMD5(queryBuilder .append(APP_SEC).toString()); + } + + private static String generateMD5(String input) { + try { + MessageDigest md = MessageDigest.getInstance("MD5"); + byte[] digest = md.digest(input.getBytes()); + StringBuilder sb = new StringBuilder(); + for (byte b : digest) { + sb.append(String.format("%02x", b)); + } + return sb.toString(); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + return null; + } + + public static void main(String[] args) { + Map params = new HashMap<>(); + params.put("id", "114514"); + params.put("str", "1919810"); + params.put("test", "いいよ,こいよ"); + System.out.println(appSign(params)); + } +} +``` + +输出结果为:01479cf20504d865519ac50f33ba3a7d