java,获取微信分享需要的获取 signature、jsapi_ticket和access_token
生活随笔
收集整理的這篇文章主要介紹了
java,获取微信分享需要的获取 signature、jsapi_ticket和access_token
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?廢話不多,代碼說話,那個url是你需要分享的url,需要傳進來,然后入參加密。
java,獲取微信需要的獲取 jsapi_ticket和access_token? @Slf4j @Service public class WeChatServiceImpl implements WeChatService {@Value("${weixin.test.appid}")String appid ;@Value("${weixin.test.sercert}")String sercert;// 獲取token/*** 獲取 微信H5頁面 分享需要獲得的** @return*/@Overridepublic BaseResponse getWechatJSShare(String url) {String lastResult = null;try {String token = WechatToken.getAccessToken(appid, sercert);log.info("微信H5頁面分享 當次獲得到的 token={}",token);String jsapiTicket = WechatToken.getJsapiTicket(token);log.info("微信H5頁面分享 當次獲得到的 jsapiTicket={}",jsapiTicket);UUID uuid = UUID.randomUUID();String nonceStr = String.valueOf(uuid);long timeMillis = System.currentTimeMillis()/1000;ConcurrentHashMap<String, Object> objectObjectConcurrentHashMap = new ConcurrentHashMap<>(4);objectObjectConcurrentHashMap.put("noncestr", nonceStr);objectObjectConcurrentHashMap.put("timestamp", timeMillis);objectObjectConcurrentHashMap.put("jsapi_ticket", jsapiTicket);objectObjectConcurrentHashMap.put("url",url);TreeMap<String, Object> stringObjectTreeMap = new TreeMap<>();stringObjectTreeMap.putAll(objectObjectConcurrentHashMap);Iterator<Map.Entry<String, Object>> iterator = stringObjectTreeMap.entrySet().iterator();StringBuilder stringBuilder = new StringBuilder();while (iterator.hasNext() == true) {Map.Entry<String, Object> mapMiddle = iterator.next();stringBuilder.append(mapMiddle.getKey());stringBuilder.append("=");stringBuilder.append(mapMiddle.getValue());stringBuilder.append("&");}String str = stringBuilder.toString();str = str.substring(0, str.length() - 1);System.out.println("str = " + str);byte[] bytes = Digests.sha1(str.getBytes("UTF-8"));String signature = byteToHex(bytes);ImmutableMap<String, Object> ofMap = ImmutableMap.of("appId", appid, "timestamp", timeMillis, "nonceStr", nonceStr, "signature", signature);lastResult = JSON.toJSONString(ofMap);log.info("微信H5頁面分享 當次最終獲得到的參數為 lastResult={}",lastResult);} catch (Exception e) {log.info("微信H5頁面分享 當次最終獲得到的參數為 lastResult={}",lastResult);log.info("微信H5頁面分享 獲取參數失敗 e={}",e);BaseResponse.buildSuccess("獲取參數失敗");}return BaseResponse.buildSuccess("獲取成功",lastResult);} } package com.fh.hr.web.api.util;import org.apache.commons.lang3.Validate;import java.io.IOException; import java.io.InputStream; import java.security.GeneralSecurityException; import java.security.MessageDigest; import java.security.SecureRandom; import java.util.Formatter;/*** 摘要算法, 支持md5與sha1算法* @author Luxor* @version 2016/11/2.*/ public class Digests {private static final String SHA1 = "SHA-1";private static final String MD5 = "MD5";private static SecureRandom random = new SecureRandom();/*** 對輸入字符串進行sha1散列.*/public static byte[] sha1(byte[] input) {return digest(input, SHA1, null, 1);}public static byte[] sha1(byte[] input, byte[] salt) {return digest(input, SHA1, salt, 1);}public static byte[] sha1(byte[] input, byte[] salt, int iterations) {return digest(input, SHA1, salt, iterations);}/*** 對輸入字符串進行MD5*/public static byte[] md5(byte[] input) {return digest(input, MD5, null, 1);}/*** 對字符串進行散列, 支持md5與sha1算法.*/private static byte[] digest(byte[] input, String algorithm, byte[] salt, int iterations) {try {MessageDigest digest = MessageDigest.getInstance(algorithm);if (salt != null) {digest.update(salt);}byte[] result = digest.digest(input);for (int i = 1; i < iterations; i++) {digest.reset();result = digest.digest(result);}return result;} catch (GeneralSecurityException e) {throw new RuntimeException(e);}}/*** 生成隨機的Byte[]作為salt.** @param numBytes byte數組的大小*/public static byte[] generateSalt(int numBytes) {Validate.isTrue(numBytes > 0, "numBytes argument must be a positive integer (1 or larger)", numBytes);byte[] bytes = new byte[numBytes];random.nextBytes(bytes);return bytes;}/*** 對文件進行md5散列.*/public static byte[] md5(InputStream input) throws IOException {return digest(input, MD5);}/*** 對文件進行sha1散列.*/public static byte[] sha1(InputStream input) throws IOException {return digest(input, SHA1);}public static byte[] digest(InputStream input, String algorithm) throws IOException {try {MessageDigest messageDigest = MessageDigest.getInstance(algorithm);int bufferLength = 8 * 1024;byte[] buffer = new byte[bufferLength];int read = input.read(buffer, 0, bufferLength);while (read > -1) {messageDigest.update(buffer, 0, read);read = input.read(buffer, 0, bufferLength);}return messageDigest.digest();} catch (GeneralSecurityException e) {throw new RuntimeException(e);}}public 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;}} @Slf4j public class WechatToken {private static final String URL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s";/*** 獲取微信H5分享的js_ticket 過期時間為 7200s == 2小時*/public static final String TICKET_URL = "https://api.weixin.qq.com/cgi-bin/ticket/getticket";public static Map<String, TokenItem> TOKENS = new ConcurrentHashMap<>();public static Map<String, TicketItem> TICKET_TOKENS = new ConcurrentHashMap<>();public static String getAccessToken(String appId, String secret) {TokenItem tokenItem = TOKENS.get(appId);Long now = System.currentTimeMillis();if (tokenItem != null && tokenItem.expiresIn - now > 0) {return tokenItem.token;}synchronized (WechatToken.class) {now = System.currentTimeMillis();if (tokenItem != null && tokenItem.expiresIn.compareTo(now) > 0) {return tokenItem.token;}String url = String.format(URL, appId, secret);String rawResponse = HttpClientUtil.post(url);JSONObject response = JSON.parseObject(rawResponse);if (response.containsKey("errcode")) {// TODO EXCEPTIONlog.info("get weChat Access_Token has error! rawResponse={}",rawResponse);return null;}if (tokenItem == null) {TOKENS.put(appId, new TokenItem());}// 提前2分鐘TOKENS.get(appId).expiresIn = now + (response.getLong("expires_in") - 120) * 1000;TOKENS.get(appId).token = response.getString("access_token");return TOKENS.get(appId).token;}}public static class TokenItem {private String token = null;private Long expiresIn = -1L;}public static class TicketItem {private Integer errcode;private String errmsg;private String ticket = null;private Long expiresIn = -1L;}public static String getJsapiTicket(String access_token) {TicketItem ticketItem = WechatToken.TICKET_TOKENS.get(WechatConstant.TICKET_TOKEN_STR);Long now = System.currentTimeMillis();if (ticketItem != null && ticketItem.expiresIn - now > 0) {return ticketItem.ticket;}synchronized (WechatToken.class) {now = System.currentTimeMillis();if (ticketItem != null && ticketItem.expiresIn.compareTo(now) > 0) {return ticketItem.ticket;}String params = "type=jsapi&access_token=" + access_token;String result = HttpUtil.get(new StringBuilder().append(TICKET_URL).append("?").append(params).toString());JSONObject response = JSON.parseObject(result);if (0 != (int)response.get("errcode") && !("ok").equals(response.get("errmsg"))) {log.info("get weChat Ticket_Token has error! result={}", result);return null;}if (ticketItem == null) {TICKET_TOKENS.put(WechatConstant.TICKET_TOKEN_STR, new TicketItem());}// 提前2分鐘TICKET_TOKENS.get(WechatConstant.TICKET_TOKEN_STR).expiresIn = now + (response.getLong("expires_in") - 120) * 1000;TICKET_TOKENS.get(WechatConstant.TICKET_TOKEN_STR).ticket = response.getString("ticket");return TICKET_TOKENS.get(WechatConstant.TICKET_TOKEN_STR).ticket;}}}?
總結
以上是生活随笔為你收集整理的java,获取微信分享需要的获取 signature、jsapi_ticket和access_token的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: zookeeper是如何实现数据一致性的
- 下一篇: HashTable 和HashMap区别