基于Java spring框架的微信企业号开发中关于js-sdk的配置
在调用js-sdk的第一步,我们需要引入js-sdk的js链接,然后执行wx.config,官方示例如下所示:
wx.config({
debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
appId: '', // 必填,企业号的唯一标识,此处填写企业号corpid
timestamp: , // 必填,生成签名的时间戳
nonceStr: '', // 必填,生成签名的随机串
signature: '',// 必填,签名,见附录1
jsApiList: [] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
});
一、分析参数:
1. appId我们可以通过后端读取配置文件读取出来传递到前端。
2. timestamp是前端生成还是后端生成都OK,我这里是用的异步获取签名等参数,所以我这个案例是使用前端生成时间戳。
3. nonceStr是一个随机串,java中采用UUID来生成这个随机串。
4. signature是一个签名,这个是需要java后端根据以上三个参数来组成一个字符串,然后再对这个字符串进行sha1加密得到的。微信官方还给出了一个用于在线校验签名的工具
二、后端接口部分:
1. 我们需要直接准备的是 appId 、secret、noncestr,appId 在企业号中为 CorpId,这两个参数可以从微信企业号后台得到。noncestr 为随机串,采用UUID生成,方法如下:
public static String create_noncestr() {
return UUID.randomUUID().toString();
}
2. 因为最终需要正确地生成signature签名,而生成签名需要四个参数,即 jsapi_ticket、noncestr、timestamp、url,在这四个参数重,jsapi_ticket是需要获取到的,而获取jsapi_ticket又需要先获取到access_token,所以以下代码就依次获取这些参数来做一个展示:
/**
* 获取access_token
* @param request
* @param response
* @throws Exception
*/
@RequestMapping("/getAccessToken")
public void getAccessToken(HttpServletRequest request, HttpServletResponse response) throws Exception {
String urlStr = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid="+CORPID+"&corpsecret="+CORPSECRET;
processUrl(response, urlStr);
} /**
* 获取jsapi_ticket
* @param request
* @param response
* @throws Exception
*/
@RequestMapping("/getJsapiTicket")
public void getJsapiTicket(HttpServletRequest request, HttpServletResponse response) throws Exception {
String access_token = request.getParameter("access_token");
String urlStr = "https://qyapi.weixin.qq.com/cgi-bin/get_jsapi_ticket?access_token="+access_token;
processUrl(response, urlStr);
} /**
* 获取签名signature
* @param request
* @param response
* @throws Exception
*/
@RequestMapping("/getJsSdkSign")
public void getJsSdkSign(HttpServletRequest request, HttpServletResponse response) throws Exception {
String noncestr = request.getParameter("noncestr");
String tsapiTicket = request.getParameter("jsapi_ticket");
String timestamp = request.getParameter("timestamp");
String url = request.getParameter("url");
String jsSdkSign = getJsSdkSign(noncestr, tsapiTicket, timestamp, url);
PrintWriter out = response.getWriter();
out.print(jsSdkSign);
} private void processUrl(HttpServletResponse response, String urlStr) {
URL url;
try {
url = new URL(urlStr);
URLConnection URLconnection = url.openConnection();
HttpURLConnection httpConnection = (HttpURLConnection)URLconnection;
int responseCode = httpConnection.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_OK) {
InputStream urlStream = httpConnection.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(urlStream));
String sCurrentLine = "";
String sTotalString = "";
while ((sCurrentLine = bufferedReader.readLine()) != null) {
sTotalString += sCurrentLine;
}
PrintWriter out = response.getWriter();
out.print(sTotalString);
}else{
System.err.println("失败");
}
} catch (Exception e) {
e.printStackTrace();
}
} /**
* 获得加密后的签名
* @param noncestr
* @param tsapiTicket
* @param timestamp
* @param url
* @return
*/
public static String getJsSdkSign(String noncestr,String tsapiTicket,String timestamp,String url){
String content="jsapi_ticket="+tsapiTicket+"&noncestr="+noncestr+"×tamp="+timestamp+"&url="+url;
String ciphertext=getSha1(content); return ciphertext;
} /**
* 进行sha1加密
* @param str
* @return
*/
public static String getSha1(String str){
if(str==null||str.length()==0){
return null;
}
char hexDigits[] = {'0','1','2','3','4','5','6','7','8','9',
'a','b','c','d','e','f'};
try {
MessageDigest mdTemp = MessageDigest.getInstance("SHA1");
mdTemp.update(str.getBytes("UTF-8")); byte[] md = mdTemp.digest();
int j = md.length;
char buf[] = new char[j*2];
int k = 0;
for (int i = 0; i < j; i++) {
byte byte0 = md[i];
buf[k++] = hexDigits[byte0 >>> 4 & 0xf];
buf[k++] = hexDigits[byte0 & 0xf];
}
return new String(buf);
} catch (Exception e) {
// TODO: handle exception
return null;
}
} /**
* 获得随机串
* @return
*/
public static String create_noncestr() {
return UUID.randomUUID().toString();
}
三、前端请求部分:
var weixin = false;
$.ajax({
dataType:"json",
url: "${ctx.contextPath}/wechat/getAccessToken",
success: function(data){
$.getJSON("${ctx.contextPath}/wechat/getJsapiTicket",
{
access_token:data.access_token //获取的access_token
},
function(result){
var time=parseInt((new Date().getTime())/1000);
$.get("${ctx.contextPath}/wechat/getJsSdkSign",
{
noncestr:"${noncestr!""}",
jsapi_ticket:result.ticket,//获取的jsapi_ticket
timestamp:time,
url:location.href.split('#')[0]
},
function(sign){
wx.config({
debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
appId: '${appId!""}', // 必填,企业号的唯一标识,此处填写企业号corpid
timestamp: time, // 必填,生成签名的时间戳
nonceStr: '${noncestr!""}', // 必填,生成签名的随机串
signature: sign,// 必填,签名,见附录1
jsApiList: ['uploadImage', 'chooseImage'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
});
}
);
}
);
},
error:function(XMLHttpRequest, textStatus, errorThrown){
}
});
wx.ready(function(){
weixin = true;
});
ps:案例仅供参考,接口因人而异。谢谢大家~
fullStack.yang
2016-12-26于成都高新区天府软件园
基于Java spring框架的微信企业号开发中关于js-sdk的配置的更多相关文章
- 基于java spring框架开发部标1078视频监控平台精华文章索引
部标1078视频监控平台,是一个庞杂的工程,涵盖了多层协议,部标jt808,jt809,jt1078,苏标Adas协议等,多个平台功能标准,部标796标准,部标1077标准和苏标主动安全标准,视频方面 ...
- 基于Java Mina框架的部标808服务器设计和开发
在开发部标GPS平台中,部标808GPS服务器是系统的核心关键,决定了部标平台的稳定性和行那个.Linux服务器是首选,为了跨平台,开发语言选择Java自不待言. 我们为客户开发的部标服务器基于Min ...
- 基于Java Mina框架的部标jt808服务器设计和开发
在开发部标GPS平台中,部标jt808GPS服务器是系统的核心关键,决定了部标平台的稳定性和行那个.Linux服务器是首选,为了跨平台,开发语言选择Java自不待言.需要购买jt808GPS服务器源码 ...
- 微信公众号开发系列-13、基于RDIFramework.NET框架整合微信开发应用效果展示
1.前言 通过前面一系列文章的学习,我们对微信公众号开发已经有了一个比较深入和全面的了解. 微信公众号开发为企业解决那些问题呢? 我们经常看到微信公众号定制开发.微信公众平台定制开发,都不知道这些能给 ...
- 微信企业号开发入门(回调模式)java
最近在开发微信企业号,刚接触时云里雾里的,在摸索过程中终于清晰了一点. 刚开始我以为订阅号.服务号.企业号的接口差不多,就一直用订阅号的教程来入门,后来才发现差的挺多的. 首先,微信企业号不像订阅号和 ...
- 基于Java Netty框架构建高性能的部标808协议的GPS服务器
使用Java语言开发一个高质量和高性能的jt808 协议的GPS通信服务器,并不是一件简单容易的事情,开发出来一段程序和能够承受数十万台车载接入是两码事,除去开发部标808协议的固有复杂性和几个月长周 ...
- 微信企业号开发之-如何获取secret 序列号
最近有项目基于微信企业号开发,简单记录下如何查看企业号secert 工具/原料 微信企业号 方法/步骤 用管理员的帐号登录后,选择[设置]-[权限管理]进入管理组设置界面 在左边点击[ ...
- .net之微信企业号开发(三) 回调模式的接口开发
一.前言 微信企业号应用中,有两种模式,一种是普通模式,这种模式只能进行简单网页链接,以及发送固定的消息.为了可以让企业号的用户更好的与应用交互,微信提供了回调模式,这种回调模式的可以将用户发送给微信 ...
- .net之微信企业号开发(二) 企业号人员身份认证与开发
前言 这里完全可以链接一个登录页面,让用户输入用户名密码进行登录的...2333 但是,这样所就完全失去了微信企业号的意义,本来进入微信企业号的时候,就已经对人员身份进行认证了,你这里再让别人登录,不 ...
随机推荐
- vsftp 虚拟用户+MySQL认证独立家目录
centos7 系统 安装包 yum -y install mariadb vsftpd openssl-devel mysql-devel pam-devel yum -y groupinsta ...
- BZOJ1878: [SDOI2009]HH的项链[树状数组+离线 | 主席树]
题意: 询问区间不同种类颜色数 [2016-11-15] 离线好厉害 对于每一个区间询问,一个数只考虑一次,那么考虑他最后出现的一次 将询问按r排序 从1到n扫描,用树状数组维护一个位置应不应该考虑( ...
- CF597C Subsequences 树状数组 + 动态规划
设$f(i, j)$表示以$i$结尾的,长为$j$的上升子序列的数量 转移时用树状数组维护即可 复杂度为$O(kn \log n)$ 注:特判0 #include <cstdio> #in ...
- BZOJ.3771.Triple(母函数 FFT 容斥)
题目链接 \(Description\) 有\(n\)个物品(斧头),每个物品价值不同且只有一件,问取出一件.两件.三件物品,所有可能得到的价值和及其方案数.\((a,b),(b,a)\)算作一种方案 ...
- 浅谈期望的线性性(可加性)【CodeForces280c】【bzoj3036】【bzoj3143】
[pixiv] https://www.pixiv.net/member_illust.php?mode=medium&illust_id=63399955 向大(hei)佬(e)势力学(di ...
- 基于直接最小二乘的椭圆拟合(Direct Least Squares Fitting of Ellipses)
算法思想: 算法通过最小化约束条件4ac-b^2 = 1,最小化距离误差.利用最小二乘法进行求解,首先引入拉格朗日乘子算法获得等式组,然后求解等式组得到最优的拟合椭圆. 算法的优点: a.椭圆的特异性 ...
- spring---transaction(4)---源代码分析(事务的状态TransactionStatus)
写在前面 TransactionStatus表示一个具体的事务状态(这里应用到了Java的一个多继承,接口允许多继承) TransactionStatus它继承了SavepointManager接口, ...
- 利用Everything开启http服务测试移动端浏览器环境
一.Everything 简介 Everything本身是一款小巧的文件搜索神器,可以快速的搜索电脑中的文件,速度非常快. 二.使用Everything的http服务 在做移动端浏览器页面时,有时需要 ...
- Knockout官网实例在MVC下的实现-02,实现计次
本篇使用Knockout在MVC下实现"Hello World",对应的官网实例在这里. 当次数达到3: View视图 页面包含三个部分:1.显示点击按钮的次数2.button按钮 ...
- Linux 防火墙 iptables基本操作
1:临时性关闭开启防火墙,重启后失效开启service iptables start关闭service iptables stop/etc/rc.d/init.d/iptables stop 2:永久 ...