java怎么接入微信JS-SDK
发表于:2025-02-19 作者:千家信息网编辑
千家信息网最后更新 2025年02月19日,本文小编为大家详细介绍"java怎么接入微信JS-SDK",内容详细,步骤清晰,细节处理妥当,希望这篇"java怎么接入微信JS-SDK"文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习
千家信息网最后更新 2025年02月19日java怎么接入微信JS-SDK
本文小编为大家详细介绍"java怎么接入微信JS-SDK",内容详细,步骤清晰,细节处理妥当,希望这篇"java怎么接入微信JS-SDK"文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。
第一步:绑定域名
先登录微信公众平台进入"公众号设置"的"功能设置"里填写"JS接口安全域名"。
备注:登录后可在"开发者中心"查看对应的接口权限。
第二步:引入JS文件
在需要调用JS接口的页面引入如下JS文件,(支持https):http://res.wx.qq.com/open/js/jweixin-1.4.0.js
如需进一步提升服务稳定性,当上述资源不可访问时,可改访问:http://res2.wx.qq.com/open/js/jweixin-1.4.0.js (支持https)。
备注:支持使用 AMD/CMD 标准模块加载方法加载
第三步:通过config接口注入权限验证配置
wx.config({ debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId: '', // 必填,公众号的唯一标识 timestamp: , // 必填,生成签名的时间戳 nonceStr: '', // 必填,生成签名的随机串 signature: '',// 必填,签名 jsApiList: [] // 必填,需要使用的JS接口列表});
当你完成上面三个步骤时,就可以使用微信JS-SDK的功能了,上面的步骤设置都简单,就是config签名的信息获取有点麻烦,这里主要说明下签名的获取,权限签名算法在api有简单说明,这里简单说明下签名规则。签名生成规则如下:参与签名的字段包括noncestr(随机字符串), 有效的jsapi_ticket, timestamp(时间戳), url(当前网页的URL,不包含#及其后面部分),其中noncestr可以通过生成随机uuid,时间戳可以直接获取当前时间的时间,这些实现没用任何难度,接下来比较复杂的是jsapi_ticket的获取。jsapi_ticket是公众号用于调用微信JS接口的临时票据。正常情况下,jsapi_ticket的有效期为7200秒,通过access_token来获取。access_token一般都是设置全局缓存的,在access_token有效期内可以继续使用,本实例中我们通过单例模式实现access_token的全局缓存,这个只适合单实例的服务,如果是多实例请自行修改成数据库或redies等方式进行全局缓存。当noncestr、jsapi_ticket、timestamp、url等数据获取完成后,按照noncestr=Wm3WZYTPz0wzccnW&jsapi_ticket=sM4AOVdWfPE4DxkXGEs8VMCPGGVi4C3VM0P37wVUCFvkVAy_90u5h9nbSlYy3-Sl-HhTdfl2fzFy1AOcHKP7qg×tamp=14145874577&url=http://mp.weixin.qq.com?params=value 进行url拼接,然后进行SHA1既可以获取到签名。
代码示例:
1.承装access_token的实体类,因为access_token的有效期是7200秒,
1 import java.util.*; 2 3 public class Singleton { 4 //缓存accessToken 的Map ,map中包含 一个accessToken 和 缓存的时间戳 5 //当然也可以分开成两个属性咯 6 private Mapmap = new HashMap<>(); 7 8 private Singleton() { 9 }10 11 private static Singleton single = null;12 13 // 静态工厂方法14 public static Singleton getInstance() {15 if (single == null) {16 single = new Singleton();17 }18 return single;19 }20 21 public Map getMap() {22 return map;23 }24 25 public void setMap(Map map) {26 this.map = map;27 }28 29 public static Singleton getSingle() {30 return single;31 }32 33 public static void setSingle(Singleton single) {34 Singleton.single = single;35 }36 }
获取 jsapi_ticket以及生成签名
public class WxUtils { public static String appId = "微信公众号appid"; public static String appSecret = "微信公众号appSecret "; //获取access_token的url public final static String js_api_ticket_url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi"; /** * 获取access_token * * @return */ private static String getAccessToken() { String rel = ""; Singleton singleton = Singleton.getInstance(); Mapmap = singleton.getMap(); String time = map.get("access_token_time"); String accessToken = map.get("access_token"); Long nowDate = new Date().getTime(); //这里设置过期时间 3000*1000就好了 if (accessToken != null && time != null && nowDate - Long.parseLong(time) < 7200 * 1000) { rel = accessToken; } else { String url = String.format("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s", appId, appSecret); String result = HttpUtils.defaultGetMethod(url); if (StringUtils.isBlank(result)) { return null; } JsonObject responseJsonObject = GsonUtils.parseToJsonObj(result); map.put("access_token_time", nowDate + ""); map.put("access_token", GsonUtils.getString(responseJsonObject, "access_token")); rel = GsonUtils.getString(responseJsonObject, "access_token"); } return rel; } private static String getJsapiTicket(String accessToken) { String rel = ""; Singleton singleton = Singleton.getInstance(); Map map = singleton.getMap(); String js_api_ticketn_time = map.get("js_api_ticketn_time"); String ticket = map.get("ticket"); Long nowDate = new Date().getTime(); if (ticket != null && js_api_ticketn_time != null && nowDate - Long.parseLong(js_api_ticketn_time) < 7200 * 1000) { rel = ticket; } else { String url = js_api_ticket_url.replace("ACCESS_TOKEN", accessToken); String result = HttpUtils.defaultGetMethod(url); if (StringUtils.isBlank(result)) { return null; } JsonObject responseJsonObject = GsonUtils.parseToJsonObj(result); map.put("js_api_ticketn_time", nowDate + ""); map.put("ticket", GsonUtils.getString(responseJsonObject, "ticket")); rel = GsonUtils.getString(responseJsonObject, "ticket"); } return rel; } public static Map getConfig(String url) { String accessToken = getAccessToken(); String ticket = getJsapiTicket(accessToken); String nonceStr = create_nonce_str(); String timestamp = create_timestamp(); String string1 = "jsapi_ticket=" + ticket + "&noncestr=" + nonceStr + "×tamp=" + timestamp + "&url=" + url; Map map = new HashMap<>(); map.put("appId", appId); map.put("timestamp", timestamp); map.put("nonceStr", nonceStr); map.put("signature", SHA1.encode(string1)); return map; } private static String create_nonce_str() { return UUID.randomUUID().toString(); } private static String create_timestamp() { return Long.toString(System.currentTimeMillis() / 1000); }}
SHA1签名
/* * 微信公众平台(JAVA) SDK * * Copyright (c) 2016, Ansitech Network Technology Co.,Ltd All rights reserved. * http://www.ansitech.com/weixin/sdk/ * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */import java.security.MessageDigest;/** *Title: SHA1算法
* * @author levi */public final class SHA1 { private static final char[] HEX_DIGITS = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}; /** * Takes the raw bytes from the digest and formats them correct. * * @param bytes the raw bytes from the digest. * @return the formatted bytes. */ private static String getFormattedText(byte[] bytes) { int len = bytes.length; StringBuilder buf = new StringBuilder(len * 2); // 把密文转换成十六进制的字符串形式 for (int j = 0; j < len; j++) { buf.append(HEX_DIGITS[(bytes[j] >> 4) & 0x0f]); buf.append(HEX_DIGITS[bytes[j] & 0x0f]); } return buf.toString(); } public static String encode(String str) { if (str == null) { return null; } try { MessageDigest messageDigest = MessageDigest.getInstance("SHA1"); messageDigest.update(str.getBytes()); return getFormattedText(messageDigest.digest()); } catch (Exception e) { throw new RuntimeException(e); } }}
通过上面的方法,我们已经准备好了接入微信JS-SDK的所有材料,那么怎么在前端那边使用,我们只需要请求到后台获取到config的相关数据就可以了。初次接入建议打开debug为调试模式,在debug调试模式打开的情况下接入成功会弹出成功提示。
1 $(function () { 2 wxConfig();//接入微信jssdk 3 }) 4 5 //请求后台获取wxconfig需要的信息 6 function wxConfig() { 7 $.ajax({ 8 url: '/pvmap-web/getData/wxConfig', 9 type: 'get',10 data: {url: _window.location.href},11 dataType: 'json',12 success: function (data) {13 // console.log(data)14 if (data.data != null || data.data != "") {15 wx.config({16 debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。17 appId: data.data.appId, // 必填,公众号的唯一标识18 timestamp: data.data.timestamp, // 必填,生成签名的时间戳19 nonceStr: data.data.nonceStr, // 必填,生成签名的随机串20 signature: data.data.signature,// 必填,签名21 jsApiList: ['openLocation'] // 必填,需要使用的JS接口列表22 });23 }24 },25 erroe: function (e) {26 console.log(e)27 }28 })29 }
读到这里,这篇"java怎么接入微信JS-SDK"文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注行业资讯频道。
公众
时间
接入
接口
生成
模式
缓存
有效
信息
参数
全局
实例
数据
文章
方法
有效期
权限
步骤
支持
成功
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
关于网络安全防范zhu
服务器端口哪里查看
苏州手机软件开发公司有哪些
计算机软件开发需要的计量器具
喜迎20大网络安全征文
吉林省网络安全宣传周活动启动
株洲java软件开发培训
网络安全教育知识内概括
主根服务器中国以前有么
苏州软件开发培训机构
全基因单核苷酸变异数据库
数据库修改某字段保留两个小数
软件服务费和软件开发费用
江苏碧玉互联网科技
数据库中的表怎么分离
c 交换输入的两个数据库
服务器登录不了无线网络
网络安全知识教育二年级
做软件开发需要哪些职位
数据库表多个主键
数据库表中的层次结构
烟火人间服务器
计算机软件开发需要的计量器具
数据库多语句查询语句
数据库外键怎么设置mysql
数据库常见面试题100道
网络安全法 处罚案例
计算机网络安全经典教材
pg数据库密码保存在哪
开封软件开发税务筹划怎么进行