首页
统计
邻居
留言
关于
Search
1
彩虹商城系统开发API文档
4,329 阅读
2
IntelliJ IDEA 报错TextMate bundle load error: Bundle kotlin can't be registered
3,747 阅读
3
使用RaiDrive将网盘映射为本地磁盘
2,175 阅读
4
谷歌浏览器 Google Chrome 69.0.3497.100 正式稳定版、测试版及开发版本大全
2,133 阅读
5
抖音、小红书、快手 免费三网解析去水印小工具
2,051 阅读
精选推荐
源码分享
软件下载
影视资源
经验教程
模板插件
Emlogo
Wordpress
浮夸小生。
情感杂文
趣味生活
影视后期
Java学习笔记
登录
Search
标签搜索
个人分享
Wordpress
浮夸小生。
Wordpress教程
Java
PHP
Wordpress优化
Java笔记
网络技巧
网站
CDN
Windows
又拍云
教程
浏览器
IntelliJ IDEA
html
建站教程
微信
情感杂文
浮夸小生。
累计撰写
83
篇文章
累计收到
220
条评论
首页
栏目
精选推荐
源码分享
软件下载
影视资源
经验教程
模板插件
Emlogo
Wordpress
浮夸小生。
情感杂文
趣味生活
影视后期
Java学习笔记
页面
统计
邻居
留言
关于
搜索到
2
篇与
微信
的结果
2024-04-26
微信JS-SDK 签名方式-java代码小记
签名加密方式阅读官方文档: JS-SDK使用权限签名算法 首先获取 access_token -> AppID(开发者ID) + AppSecret(开发者密码) 获取方式:公众号后台地址-基本配置 其次获取 jsapi_ticket —>携带 access_token 请求链接 (见官方文档)生成加密方式最终需要返回如下信息:wx.config({ debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId: '', // 必填,公众号的唯一标识 timestamp: , // 必填,生成签名的时间戳 nonceStr: '', // 必填,直接UUID 随机串 signature: '',// 必填,签名 jsApiList: [] // 必填,需要使用的JS接口列表 }); 加密算法不在赘述,详情查看 官方文档 {message type="info" content="注意 : access_token 与 jsapi_ticket 有效其为 7200秒(2小时) 微信官方强烈要求做全局缓存"/}附java实现代码:@Slf4j public class WeChatUtil { private static final String APP_ID = "开发者ID"; private static final String APP_SECRET = "开发者密钥"; private static final long EXPIRATION_TIME_MILLIS = 7200 * 1000; // 7200秒转换为毫秒 private static String accessToken; private static String jsapiTicket; private static Date accessTokenLastUpdateTime; private static Date jsapiTicketLastUpdateTime; private static final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); // 使用线程安全的ConcurrentHashMap来存储accessToken和jsapiTicket,避免多线程并发问题 private static final ConcurrentHashMap<String, String> cache = new ConcurrentHashMap<>(); // 获取微信配置信息 public static WxConfig getWxConfig(String url) { String accessToken = getAccessToken(); String jsapiTicket = getJsapiTicket(accessToken); if (StringUtils.isNotBlank(accessToken) && StringUtils.isNotBlank(jsapiTicket)) { //进行加密 String nonceStr = UUID.randomUUID().toString(); Long timestamp = System.currentTimeMillis() / 1000; Map<String, Object> paramMap = new TreeMap<>(); paramMap.put("noncestr", nonceStr); paramMap.put("jsapi_ticket", jsapiTicket); paramMap.put("timestamp", timestamp); paramMap.put("url", url); // 拼接参数为字符串 StringBuilder sb = new StringBuilder(); for (Map.Entry<String, Object> entry : paramMap.entrySet()) { sb.append(entry.getKey()).append("=").append(entry.getValue()).append("&"); } String string1 = sb.substring(0, sb.length() - 1); // 去掉最后一个&符号 // 使用SHA1加密 String signature = SHA1(string1); List<String> jsApiList = new ArrayList<>(); jsApiList.add("jsApiList"); return new WxConfig(true, APP_ID, timestamp, nonceStr, signature, jsApiList); } return null; } // 获取 access_token private static String getAccessToken() { log.info("获取acctoken"); // 检查是否过期 if (accessToken == null || accessTokenLastUpdateTime == null || new Date().getTime() - accessTokenLastUpdateTime.getTime() > EXPIRATION_TIME_MILLIS) { // 过期或者第一次获取,需要更新 accessToken updateAccessToken(); } return accessToken; } // 更新 access_token private static void updateAccessToken() { String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + APP_ID + "&secret=" + APP_SECRET; String result = HttpClientManager.httpGetMethod(url, null); JSONObject jsonObject = JSONObject.parseObject(result); if (!jsonObject.containsKey("errcode")) { accessToken = jsonObject.getString("access_token"); accessTokenLastUpdateTime = new Date(); log.info(accessToken); // 使用 scheduler 定时在7200秒后再次更新 accessToken scheduler.schedule(WeChatUtil::updateAccessToken, EXPIRATION_TIME_MILLIS, TimeUnit.MILLISECONDS); } } // 获取 jsapi_ticket private static String getJsapiTicket(String accessToken) { // 检查是否过期 if (jsapiTicket == null || jsapiTicketLastUpdateTime == null || new Date().getTime() - jsapiTicketLastUpdateTime.getTime() > EXPIRATION_TIME_MILLIS) { // 过期或者第一次获取,需要更新 jsapiTicket updateJsapiTicket(accessToken); } return jsapiTicket; } // 更新 jsapi_ticket private static void updateJsapiTicket(String accessToken) { String url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=" + accessToken + "&type=jsapi"; String result = HttpClientManager.httpGetMethod(url, null); JSONObject jsonObject = JSONObject.parseObject(result); if (jsonObject.getInteger("errcode") == 0) { jsapiTicket = jsonObject.getString("ticket"); jsapiTicketLastUpdateTime = new Date(); // 使用 scheduler 定时在7200秒后再次更新 jsapiTicket scheduler.schedule(() -> updateJsapiTicket(accessToken), EXPIRATION_TIME_MILLIS, TimeUnit.MILLISECONDS); } } // SHA1 加密 private static String SHA1(String str) { try { MessageDigest crypt = MessageDigest.getInstance("SHA-1"); crypt.reset(); crypt.update(str.getBytes("UTF-8")); byte[] digest = crypt.digest(); // 转换为十六进制字符串 Formatter formatter = new Formatter(); for (byte b : digest) { formatter.format("%02x", b); } String result = formatter.toString(); formatter.close(); return result; } catch (NoSuchAlgorithmException | UnsupportedEncodingException e) { throw new RuntimeException(e); } } }
2024年04月26日
101 阅读
0 评论
0 点赞
2019-09-06
微信清理僵尸粉-亲测有效
微信清理僵尸粉软件[reply]下载地址:https://www.lanzous.com/i61h68d[/reply]
2019年09月06日
334 阅读
1 评论
0 点赞