DDConfigSign.java 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. package com.malk.server.dingtalk;
  2. import lombok.SneakyThrows;
  3. import java.net.URL;
  4. import java.net.URLDecoder;
  5. import java.security.MessageDigest;
  6. import java.util.Formatter;
  7. import java.util.Random;
  8. /**
  9. * 计算dd.config的签名参数
  10. **/
  11. public class DDConfigSign {
  12. /**
  13. * 计算dd.config的签名参数
  14. *
  15. * @param jsticket 通过微应用appKey获取的jsticket
  16. * @param nonceStr 自定义固定字符串
  17. * @param timeStamp 当前时间戳
  18. * @param url 调用dd.config的当前页面URL
  19. */
  20. @SneakyThrows
  21. public static String sign(String jsticket, String nonceStr, long timeStamp, String url) {
  22. String plain = "jsapi_ticket=" + jsticket + "&noncestr=" + nonceStr + "&timestamp=" + timeStamp + "&url=" + decodeUrl(url);
  23. MessageDigest sha1 = MessageDigest.getInstance("SHA-256");
  24. sha1.reset();
  25. sha1.update(plain.getBytes("UTF-8"));
  26. return byteToHex(sha1.digest());
  27. }
  28. // 字节数组转化成十六进制字符串
  29. private static String byteToHex(final byte[] hash) {
  30. Formatter formatter = new Formatter();
  31. for (byte b : hash) {
  32. formatter.format("%02x", b);
  33. }
  34. String result = formatter.toString();
  35. formatter.close();
  36. return result;
  37. }
  38. /**
  39. * 因为ios端上传递的url是encode过的,android是原始的url。开发者使用的也是原始url,
  40. * 所以需要把参数进行一般urlDecode
  41. */
  42. private static String decodeUrl(String url) throws Exception {
  43. URL urler = new URL(url);
  44. StringBuilder urlBuffer = new StringBuilder();
  45. urlBuffer.append(urler.getProtocol());
  46. urlBuffer.append(":");
  47. if (urler.getAuthority() != null && urler.getAuthority().length() > 0) {
  48. urlBuffer.append("//");
  49. urlBuffer.append(urler.getAuthority());
  50. }
  51. if (urler.getPath() != null) {
  52. urlBuffer.append(urler.getPath());
  53. }
  54. if (urler.getQuery() != null) {
  55. urlBuffer.append('?');
  56. urlBuffer.append(URLDecoder.decode(urler.getQuery(), "utf-8"));
  57. }
  58. return urlBuffer.toString();
  59. }
  60. /// test
  61. public static String getRandomStr(int count) {
  62. String base = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
  63. Random random = new Random();
  64. StringBuffer sb = new StringBuffer();
  65. for (int i = 0; i < count; i++) {
  66. int number = random.nextInt(base.length());
  67. sb.append(base.charAt(number));
  68. }
  69. return sb.toString();
  70. }
  71. }