package com.xc.xcspringboot.demo; import java.nio.charset.StandardCharsets; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.Formatter; /** * https://work.weixin.qq.com/api/doc/90000/90136/90506 * * @author tl19638 * @date 2020/8/18 */ public class 签名算法 { public static void main(String[] args) throws Exception { String genNonce = genNonce(); System.out.println("noncestr:" + genNonce); long timestamp = System.currentTimeMillis() / 1000; System.out.println("timestamp:" + timestamp); String sign = sign("https://www.sogou.com", genNonce, timestamp, "eaed581b260d754b1adf54d7875adc27"); System.out.println("sign:" + sign); } /** * 模拟生成随机 nonce 字符串 * * @return 随机字符串 */ private static String genNonce() { return bytesToHex(Long.toString(System.nanoTime()).getBytes(StandardCharsets.UTF_8)); } private static String bytesToHex(final byte[] hash) { Formatter formatter = new Formatter(); for (byte b : hash) { formatter.format("%02x", b); } String result = formatter.toString(); formatter.close(); return result; } private static String sign(String url, String nonce, Long timestamp, String ticket) throws Exception { String plain = String.format("jsapi_ticket=%s&noncestr=%s×tamp=%d&url=%s", ticket, nonce, timestamp, url); System.out.println("plain:" + plain); try { MessageDigest sha1 = MessageDigest.getInstance("SHA-1"); sha1.reset(); sha1.update(plain.getBytes(StandardCharsets.UTF_8)); return bytesToHex(sha1.digest()); } catch (NoSuchAlgorithmException e) { // throw new LeysenException("jsapi_ticket计算签名错误"); throw new Exception("jsapi_ticket计算签名错误"); } } }