{"record":{"id":"8e4be556ae231fd9","repo":"binarywang/WxJava","slug":"error-8e4be5","errorCode":null,"errorMessage":"非法请求参数，有部分参数为空 : ","messagePattern":"非法请求参数，有部分参数为空 : ","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"weixin-java-common/src/main/java/me/chanjar/weixin/common/util/crypto/SHA1.java","lineNumber":20,"sourceCode":"\nimport org.apache.commons.codec.digest.DigestUtils;\nimport org.apache.commons.lang3.StringUtils;\n\nimport java.util.Arrays;\n\n/**\n *\n * @author Daniel Qian\n * created on  14/10/19\n */\npublic class SHA1 {\n\n  /**\n   * 串接arr参数，生成sha1 digest.\n   */\n  public static String gen(String... arr) {\n    if (StringUtils.isAnyEmpty(arr)) {\n      throw new IllegalArgumentException(\"非法请求参数，有部分参数为空 : \" + Arrays.toString(arr));\n    }\n\n    Arrays.sort(arr);\n    StringBuilder sb = new StringBuilder();\n    for (String a : arr) {\n      sb.append(a);\n    }\n    return DigestUtils.sha1Hex(sb.toString());\n  }\n\n  /**\n   * {@code 用&串接arr参数，生成sha1 digest.}\n   *\n   * @param arr 参数数组\n   * @return sha1摘要\n   */\n  public static String genWithAmple(String... arr) {\n    if (StringUtils.isAnyEmpty(arr)) {","sourceCodeStart":2,"sourceCodeEnd":38,"githubUrl":"https://github.com/binarywang/WxJava/blob/1c43293a3c2c9d7e91304b6d037fb017f680d0c6/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/crypto/SHA1.java#L2-L38","documentation":"SHA1.gen concatenates the provided string arguments, sorts them, and computes a SHA-1 digest — the core of WeChat signature verification (JS-SDK, message signing, token validation). If ANY argument is null or empty it throws IllegalArgumentException, because a signature over incomplete material would be silently invalid. This is a strict precondition on signature inputs.","triggerScenarios":"Calling SHA1.gen with a null/empty token, timestamp, nonce, encryptStr, or jsapiTicket — i.e. one of the signature inputs was not fetched/available before signing.","commonSituations":"jsapi_ticket not yet fetched (null) when computing a JS-SDK signature; access_token/token missing; timestamp or nonce generated as empty string; a callback handler receiving a request with a missing signature component.","solutions":["Ensure all signature inputs (token, timestamp, nonce, ticket, etc.) are fetched and non-empty before calling SHA1.gen.","Pre-fetch and cache jsapi_ticket/access_token so they are never null at sign time.","Validate each input non-empty with a guard and fail with a clear message before invoking SHA1.gen.","On callbacks, reject requests missing any signature component early."],"exampleFix":"// before — ticket still null when signing\nString sig = SHA1.gen(nonce, timestamp, url, jsapiTicket); // throws\n\n// after — ensure ticket present\nif (StringUtils.isEmpty(jsapiTicket)) {\n  jsapiTicket = refreshJsapiTicket();\n}\nString sig = SHA1.gen(nonce, timestamp, url, jsapiTicket);","handlingStrategy":"validation","validationCode":"if (StringUtils.isAnyEmpty(token, timestamp, nonce, ticket)) {\n  throw new IllegalArgumentException(\"Signature inputs must all be non-empty: token/timestamp/nonce/ticket\");\n}\nString sig = SHA1.gen(token, timestamp, nonce, ticket);","typeGuard":"private static boolean signatureInputsReady(String... parts) {\n  if (parts == null) return false;\n  for (String p : parts) {\n    if (p == null || p.isEmpty()) return false;\n  }\n  return true;\n}","tryCatchPattern":"try {\n  return SHA1.gen(token, timestamp, nonce, ticket);\n} catch (IllegalArgumentException e) {\n  // one of the signature inputs was null/empty — refresh ticket/token and retry\n  ticket = refreshJsapiTicket();\n  return SHA1.gen(token, timestamp, nonce, ticket);\n}","preventionTips":["Pre-fetch and cache jsapi_ticket/access_token so they are never null at sign time.","Guard all signature inputs with a non-empty check before SHA1.gen.","On callbacks, reject requests missing any signature component early."],"tags":["crypto","signature","sha1","validation","precondition"],"backgroundTag":null,"analyzedSha":"1c43293a3c2c9d7e91304b6d037fb017f680d0c6","analyzedAt":"2026-08-14T02:29:11.060Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}