|
@@ -0,0 +1,112 @@
|
|
|
+package cn.zhentao;
|
|
|
+
|
|
|
+import cn.hutool.core.util.StrUtil;
|
|
|
+import cn.hutool.crypto.digest.DigestUtil;
|
|
|
+
|
|
|
+import java.util.HashMap;
|
|
|
+import java.util.Map;
|
|
|
+
|
|
|
+/**
|
|
|
+ * Hello world!
|
|
|
+ *
|
|
|
+ */
|
|
|
+public class Api
|
|
|
+{
|
|
|
+ // 假设的appKey,实际应用中应从安全配置中获取
|
|
|
+ private static final String APP_KEY = "your_app_key_here";
|
|
|
+ private static final String APP_ID = "your_app_id";
|
|
|
+
|
|
|
+ public static void main(String[] args) {
|
|
|
+ // 模拟请求参数
|
|
|
+ String goodsId = "12345";
|
|
|
+ String reqId = "req_67890";
|
|
|
+ String reqTime = String.valueOf(System.currentTimeMillis());
|
|
|
+
|
|
|
+ // 生成签名
|
|
|
+ String signature = generateSignature(APP_ID, goodsId, reqId, reqTime, APP_KEY);
|
|
|
+ System.out.println("生成的签名: " + signature);
|
|
|
+
|
|
|
+ // 调用接口一
|
|
|
+ callApi1(APP_ID, goodsId, reqId, reqTime, signature);
|
|
|
+
|
|
|
+ // 调用接口二
|
|
|
+ callApi2(APP_ID, goodsId, reqId, reqTime, signature);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 生成MD5签名
|
|
|
+ * @param appId 应用ID
|
|
|
+ * @param goodsId 商品ID
|
|
|
+ * @param reqId 请求ID
|
|
|
+ * @param reqTime 请求时间戳
|
|
|
+ * @param appKey 应用密钥
|
|
|
+ * @return MD5签名
|
|
|
+ */
|
|
|
+ public static String generateSignature(String appId, String goodsId, String reqId, String reqTime, String appKey) {
|
|
|
+ // 拼接签名字符串:appId+goodsId+reqId+reqTime+appKey
|
|
|
+ String content = StrUtil.builder()
|
|
|
+ .append(appId)
|
|
|
+ .append(goodsId)
|
|
|
+ .append(reqId)
|
|
|
+ .append(reqTime)
|
|
|
+ .append(appKey)
|
|
|
+ .toString();
|
|
|
+
|
|
|
+ // 使用Hutool的DigestUtil进行MD5加密
|
|
|
+ return DigestUtil.md5Hex(content);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 模拟调用接口一
|
|
|
+ */
|
|
|
+ public static void callApi1(String appId, String goodsId, String reqId, String reqTime, String signature) {
|
|
|
+ System.out.println("\n调用接口一...");
|
|
|
+
|
|
|
+ // 模拟服务端验证签名
|
|
|
+ boolean isValid = verifySignature(appId, goodsId, reqId, reqTime, signature, APP_KEY);
|
|
|
+
|
|
|
+ if (isValid) {
|
|
|
+ System.out.println("接口一: 签名验证成功,处理请求...");
|
|
|
+ // 这里可以继续处理业务逻辑
|
|
|
+ } else {
|
|
|
+ System.out.println("接口一: 签名验证失败,拒绝请求!");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 模拟调用接口二
|
|
|
+ */
|
|
|
+ public static void callApi2(String appId, String goodsId, String reqId, String reqTime, String signature) {
|
|
|
+ System.out.println("\n调用接口二...");
|
|
|
+
|
|
|
+ // 模拟服务端验证签名
|
|
|
+ boolean isValid = verifySignature(appId, goodsId, reqId, reqTime, signature, APP_KEY);
|
|
|
+
|
|
|
+ if (isValid) {
|
|
|
+ System.out.println("接口二: 签名验证成功,处理请求...");
|
|
|
+ // 这里可以继续处理业务逻辑
|
|
|
+ } else {
|
|
|
+ System.out.println("接口二: 签名验证失败,拒绝请求!");
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 验证签名
|
|
|
+ * @param appId 应用ID
|
|
|
+ * @param goodsId 商品ID
|
|
|
+ * @param reqId 请求ID
|
|
|
+ * @param reqTime 请求时间戳
|
|
|
+ * @param signature 待验证的签名
|
|
|
+ * @param appKey 应用密钥
|
|
|
+ * @return 是否验证通过
|
|
|
+ */
|
|
|
+ public static boolean verifySignature(String appId, String goodsId, String reqId,
|
|
|
+ String reqTime, String signature, String appKey) {
|
|
|
+ // 重新生成签名
|
|
|
+ String calculatedSignature = generateSignature(appId, goodsId, reqId, reqTime, appKey);
|
|
|
+
|
|
|
+ // 比较签名是否一致
|
|
|
+ return StrUtil.equalsIgnoreCase(signature, calculatedSignature);
|
|
|
+ }
|
|
|
+}
|