前言
有个旧项目公众号H5,前期测试没问题都上线了。不过由于更换服务造成了部分功能受限,对于签名和验签都报错。找到问题所在,就是公众号后台白名单没添加最新的服务器IP导致,下面重温下实现微信公众号JSSDK初始化功能
步骤
1. 核心实现代码
public Map initJSSDKConfigInfo(String shareUrl) {
//String accessToken = this.getAccessToken();
try {
String jsapiTicket = this.getJsApiTicket();
String timestamp = Long.toString(System.currentTimeMillis() / 1000);
String nonceStr = UUID.randomUUID().toString();
String signature = this.buildJSSDKSignature(jsapiTicket,timestamp,nonceStr,shareUrl);
Map<String,String> map = new HashMap<String,String>();
map.put("shareUrl", shareUrl);
map.put("jsapi_ticket", jsapiTicket);
map.put("nonceStr", nonceStr);
map.put("timestamp", timestamp);
map.put("signature", signature);
map.put("appid", WeChatConfig.appId);
return map;
}catch (Exception e){
log.info("初始化jssdk",e.getMessage());
}
return null;
}
2. 几个小方法
private String getJsApiTicket() {
String jsApiTicket =redisCache.getCacheObject(JS_API_TICKET);
if (!StrUtil.isNotEmpty(jsApiTicket)){
//获取全局的access_token,唯一票据
String accessToken = redisCache.getCacheObject(ACCESS_TOKEN_KEY);
//log.info("getJsApiTicket"+accessToken);
if (StringUtils.isNotBlank(accessToken)) {
//获取jsapi_ticket
String url = WeChatConfig.getTicketUrl+"access_token="+accessToken+"&type=jsapi";
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
//请求
RestTemplate restTemplate = new RestTemplate();
HttpEntity<String> request = new HttpEntity<>(headers);
ResponseEntity<String> responseString = restTemplate.postForEntity(url, request, String.class);
JSONObject json = JSONObject.parseObject(responseString.getBody());
jsApiTicket = json.getString("ticket");
redisCache.setCacheObject(JS_API_TICKET, jsApiTicket, 115, TimeUnit.MINUTES);
}else {
//access为空打印
log.info("accessToken","重新获取");
this.creatAccessToken();
accessToken = redisCache.getCacheObject(ACCESS_TOKEN_KEY);
String url = WeChatConfig.getTicketUrl+"access_token="+accessToken+"&type=jsapi";
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
//请求
RestTemplate restTemplate = new RestTemplate();
HttpEntity<String> request = new HttpEntity<>(headers);
ResponseEntity<String> responseString = restTemplate.postForEntity(url, request, String.class);
JSONObject json = JSONObject.parseObject(responseString.getBody());
jsApiTicket = json.getString("ticket");
redisCache.setCacheObject(JS_API_TICKET, jsApiTicket, 115, TimeUnit.MINUTES);
}
}
log.info("getJsApiTicket jsApiTicket: {}", jsApiTicket);
return jsApiTicket.trim();
}
public static String buildJSSDKSignature(String ticket,String timestamp,String nonceStr ,String url) throws Exception {
String orderedString = "jsapi_ticket=" + ticket
+ "&noncestr=" + nonceStr + "×tamp=" + timestamp
+ "&url=" + url;
return sha1(orderedString);
}
public static String sha1(String orderedString) throws Exception {
String ciphertext = null;
MessageDigest md = MessageDigest.getInstance("SHA-1");
byte[] digest = md.digest(orderedString.getBytes());
ciphertext = byteToStr(digest);
return ciphertext.toLowerCase();
}
private static String byteToStr(byte[] byteArray) {
String strDigest = "";
for (int i = 0; i < byteArray.length; i++) {
strDigest += byteToHexStr(byteArray[i]);
}
return strDigest;
}
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;
}
欢迎点赞、收藏、评论。