收藏
回答

java接入微信服务signature和我SHA1算法加密结果不匹配?

请问微信推送signature的是通过字典排序的SHA1加密算法么?

回答关注问题邀请回答
收藏

1 个回答

  • Hanks🇨🇳
    Hanks🇨🇳
    01-09

    加密/校验流程如下:

    1)将token、timestamp、nonce三个参数进行字典序排序 2)将三个参数字符串拼接成一个字符串进行sha1加密 3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信


    01-09
    赞同
    回复 8
    • 小沐
      小沐
      01-09
      我就是这样算的,算的结果是两个不一样。
      01-09
      回复
    • Hanks🇨🇳
      Hanks🇨🇳
      01-09
      import java.io.UnsupportedEncodingException;
      import java.security.MessageDigest;
      import java.security.NoSuchAlgorithmException;
      import java.util.Arrays;
      import java.util.Formatter;
      import java.util.HashMap;
      import java.util.Map;
      import java.util.UUID;
      /**
       * 请求校验工具类
       *
       * @author liufeng
       * @date 2013-05-18
       */
      public class SignUtil {
          /**
           * 验证签名
           *
           * @param signature
           * @param timestamp
           * @param nonce
           * @return
           */
          public static boolean checkSignature(String signature, String timestamp, String nonce,String token) {
              String[] arr = new String[] { token, timestamp, nonce };
              Arrays.sort(arr);
              StringBuilder content = new StringBuilder();
              for (int i = 0; i < arr.length; i++) {
                  content.append(arr[i]);
              }
              MessageDigest md = null;
              String tmpStr = null;
              try {
                  md = MessageDigest.getInstance("SHA-1");
                  // 将三个参数字符串拼接成一个字符串进行sha1加密
                  byte[] digest = md.digest(content.toString().getBytes());
                  tmpStr = byteToStr(digest);
              } catch (NoSuchAlgorithmException e) {
                  e.printStackTrace();
              }
              content = null;
              return tmpStr != null ? tmpStr.equals(signature.toUpperCase()) : false;
          }
          /**
           * 将字节数组转换为十六进制字符串
           *
           * @param byteArray
           * @return
           */
          private static String byteToStr(byte[] byteArray) {
              String strDigest = "";
              for (int i = 0; i < byteArray.length; i++) {
                  strDigest += byteToHexStr(byteArray[i]);
              }
              return strDigest;
          }
          /**
           * 将字节转换为十六进制字符串
           *
           * @param mByte
           * @return
           */
          private static String byteToHexStr(byte mByte) {
              char[] Digit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
              char[] tempArr = new char[2];
              tempArr[0] = Digit[(mByte >>> 4) & 0X0F];
              tempArr[1] = Digit[mByte & 0X0F];
              String s = new String(tempArr);
              return s;
          }
          public static Map sign(String jsapi_ticket, String url) {
              Map ret = new HashMap();
              String nonce_str = create_nonce_str();
              String timestamp = create_timestamp();
              String string1;
              String signature = "";
              //注意这里参数名必须全部小写,且必须有序
              string1 = "jsapi_ticket=" + jsapi_ticket +
                        "&noncestr=" + nonce_str +
                        "×tamp=" + timestamp +
                        "&url=" + url;
              System.out.println(string1);
              try
              {
                  MessageDigest crypt = MessageDigest.getInstance("SHA-1");
                  crypt.reset();
                  crypt.update(string1.getBytes("UTF-8"));
                  signature = byteToHex(crypt.digest());
              }
              catch (NoSuchAlgorithmException e)
              {
                  e.printStackTrace();
              }
              catch (UnsupportedEncodingException e)
              {
                  e.printStackTrace();
              }
              ret.put("url", url);
              ret.put("jsapi_ticket", jsapi_ticket);
              ret.put("nonceStr", nonce_str);
              ret.put("timestamp", timestamp);
              ret.put("signature", signature);
              return ret;
          }
       private static String create_nonce_str() {
           return UUID.randomUUID().toString();
       }
       private static String create_timestamp() {
           return Long.toString(System.currentTimeMillis() / 1000);
       }
       private static String byteToHex(final byte[] hash) {
              Formatter formatter = new Formatter();
              for (byte b : hash)
              {
                  formatter.format("%02x", b);
              }
              String result = formatter.toString();
              formatter.close();
              return result;
          }
      }
      01-09
      回复
    • Hanks🇨🇳
      Hanks🇨🇳
      01-09
      用这个方法checkSignature ,你试试
      01-09
      回复
    • 小沐
      小沐
      01-09回复Hanks🇨🇳
      我试了,算出来的结果和微信还是不同
      01-09
      回复
    • Hanks🇨🇳
      Hanks🇨🇳
      01-09回复小沐
      你分别把每一步的操作,打印一下,看看你收到的参数对不对
      01-09
      回复
    查看更多(3)
登录 后发表内容
问题标签