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计算签名错误");
}
}
}