Class SignClientHelper

java.lang.Object
tech.riemann.nif.web.sign.SignClientHelper

public class SignClientHelper extends Object
签名客户端辅助工具类

用于客户端在发送请求前生成签名和相关Header信息

使用示例:

// 1. 创建辅助工具(指定算法和密钥)
SignClientHelper helper = new SignClientHelper("app001", "app001-secret", SignAlgorithm.HMAC_SHA256);

// 2. 准备业务参数
Map<String, String> params = new TreeMap<>();
params.put("amount", "100.00");
params.put("orderId", "123456");

// 3. 生成签名信息
SignInfo signInfo = helper.generateSignInfo(params);

// 4. 发送请求(签名信息通过Header传递)
HttpClient.post("/api/payment", params)
        .header(signInfo.getAppIdHeader(), signInfo.getAppId())
        .header(signInfo.getSignHeader(), signInfo.getSign())
        .header(signInfo.getTimestampHeader(), signInfo.getTimestamp())
        .header(signInfo.getNonceHeader(), signInfo.getNonce());
Author:
Kerbores(kerbores@riemann.tech)
  • Constructor Details

    • SignClientHelper

      public SignClientHelper(String appId, String secret, SignAlgorithm algorithm)
      构造函数(使用默认Header名称)
      Parameters:
      appId - 应用ID
      secret - 应用密钥
      algorithm - 签名算法
    • SignClientHelper

      public SignClientHelper(String appId, String secret, SignAlgorithm algorithm, SignClientHelper.HeaderConfig headerConfig)
      构造函数(自定义Header名称)
      Parameters:
      appId - 应用ID
      secret - 应用密钥
      algorithm - 签名算法
      headerConfig - Header配置
  • Method Details

    • generateSignInfo

      public SignClientHelper.SignInfo generateSignInfo(Map<String,String> params, String requestPath)
      生成签名信息

      根据业务参数生成完整的签名信息,包括签名、时间戳、nonce等

      签名内容组成(按字典序排序后连接): 1. 请求参数的MD5摘要(paramsMd5) 2. 应用密钥(appSecret) 3. 时间戳(timestamp) 4. 请求路径(requestPath) 5. 随机字符串(nonce)

      Parameters:
      params - 业务参数(用于签名计算)
      requestPath - 请求路径(如 /api/payment)
      Returns:
      签名信息对象
    • generateSignInfo

      public SignClientHelper.SignInfo generateSignInfo(Map<String,String> params, String requestPath, String nonce)
      生成签名信息(自定义nonce)

      允许客户端自定义nonce,适用于需要特定nonce生成策略的场景

      Parameters:
      params - 业务参数(用于签名计算)
      requestPath - 请求路径(如 /api/payment)
      nonce - 自定义nonce
      Returns:
      签名信息对象
    • generateSignInfoFromPojo

      public SignClientHelper.SignInfo generateSignInfoFromPojo(Object pojo, String requestPath)
      生成签名信息(从POJO对象提取参数)

      自动从POJO对象中提取签名字段,支持嵌套对象、集合等复杂类型

      提取规则: 1. 简单类型(基本类型、String、Number、Boolean、Date、Time等):直接转为字符串 2. 嵌套POJO对象:递归提取字段,使用 "父字段名.子字段名" 格式 3. 集合/数组:转为JSON格式字符串 4. Map:直接提取键值对 5. null值:跳过 6. static/transient字段:跳过

      Parameters:
      pojo - 业务POJO对象(用于签名计算)
      requestPath - 请求路径(如 /api/payment)
      Returns:
      签名信息对象
    • generateSignInfoFromPojo

      public SignClientHelper.SignInfo generateSignInfoFromPojo(Object pojo, String requestPath, String nonce)
      生成签名信息(从POJO对象提取参数,自定义nonce)
      Parameters:
      pojo - 业务POJO对象(用于签名计算)
      requestPath - 请求路径(如 /api/payment)
      nonce - 自定义nonce
      Returns:
      签名信息对象
    • generateSignHeaders

      public Map<String,String> generateSignHeaders(Map<String,String> params, String requestPath)
      生成签名Header Map

      生成包含所有签名相关Header的Map对象,便于各种HTTP客户端添加请求头信息

      使用示例:

      // 方式一:使用Map参数
      Map<String, String> params = new TreeMap<>();
      params.put("amount", "100.00");
      params.put("orderId", "123456");
      Map<String, String> headers = helper.generateSignHeaders(params, "/api/payment");
      
      // 方式二:使用POJO对象
      OrderDTO order = new OrderDTO();
      order.setAmount(new BigDecimal("100.00"));
      order.setOrderId("123456");
      Map<String, String> headers = helper.generateSignHeaders(order, "/api/payment");
      
      // 添加到HTTP请求
      HttpClient.post("/api/payment")
              .headers(headers)
              .body(params)
              .execute();
      
      Parameters:
      params - 业务参数(用于签名计算)
      requestPath - 请求路径(如 /api/payment)
      Returns:
      包含所有签名Header的Map(key为Header名称,value为Header值)
    • generateSignHeaders

      public Map<String,String> generateSignHeaders(Object pojo, String requestPath)
      生成签名Header Map(从POJO对象提取参数)

      自动从POJO对象中提取签名字段,生成包含所有签名相关Header的Map对象

      Parameters:
      pojo - 业务POJO对象(用于签名计算)
      requestPath - 请求路径(如 /api/payment)
      Returns:
      包含所有签名Header的Map(key为Header名称,value为Header值)
    • getAppId

      public String getAppId()
      获取应用ID
      Returns:
      应用ID
    • getAlgorithm

      public SignAlgorithm getAlgorithm()
      获取签名算法
      Returns:
      签名算法