思路:调用微信的 js-sdk 接口最重要的是要实现 config 接口 。并且持久化配置如下三个参数
timestamp: , //必填,生成签名的时间戳 nonceStr: '', // 必填,生成签名的随机串 signature: '',// 必填,签名,见附录1
wx.config({ debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId: '', // 必填,企业号的唯一标识,此处填写企业号corpid timestamp: , // 必填,生成签名的时间戳 nonceStr: '', // 必填,生成签名的随机串 signature: '',// 必填,签名,见附录1 jsApiList: [] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2});
另外,借用
weixin-java-tools
这个开源项目。做开发
一、按照面向对象将这些参数持久化
WxJsapiSignature
package me.chanjar.weixin.common.bean;import java.io.Serializable;/** * jspai signature * 说明:这里借用Chanjar 开源企业号开发的方法。http://www.oschina.net/p/weixin-java-tools */public class WxJsapiSignature implements Serializable { private String noncestr; private String jsapiTicket; private long timestamp; private String url; private String signature; public String getSignature() { return signature; } public void setSignature(String signature) { this.signature = signature; } public String getNoncestr() { return noncestr; } public void setNoncestr(String noncestr) { this.noncestr = noncestr; } public String getJsapiTicket() { return jsapiTicket; } public void setJsapiTicket(String jsapiTicket) { this.jsapiTicket = jsapiTicket; } public long getTimestamp() { return timestamp; } public void setTimestamp(long timestamp) { this.timestamp = timestamp; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; }}
二、根据微信提供方法生成 signature
2.1生成随机字符串
package me.chanjar.weixin.common.util;/**说明:这里借用Chanjar 开源企业号开发的方法。http://www.oschina.net/p/weixin-java-tools*/public class RandomUtils { private static final String RANDOM_STR = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; private static final java.util.Random RANDOM = new java.util.Random(); public static String getRandomStr() { StringBuilder sb = new StringBuilder(); for (int i = 0; i < 16; i++) { sb.append(RANDOM_STR.charAt(RANDOM.nextInt(RANDOM_STR.length()))); } return sb.toString(); }}
/*** * 用于获得调用微信js api 接口生成签名准备 * 说明:这里借用Chanjar 开源企业号开发的方法。http://www.oschina.net/p/weixin-java-tools * ***/ public WxJsapiSignature createJsapiSignature(String url) throws WxErrorException { long timestamp = System.currentTimeMillis() / 1000; String noncestr = RandomUtils.getRandomStr(); String jsapiTicket = getJsapiTicket(false); try { String signature = SHA1.genWithAmple( "jsapi_ticket=" + jsapiTicket, "noncestr=" + noncestr, "timestamp=" + timestamp, "url=" + url ); WxJsapiSignature jsapiSignature = new WxJsapiSignature(); jsapiSignature.setTimestamp(timestamp); jsapiSignature.setNoncestr(noncestr); jsapiSignature.setUrl(url); jsapiSignature.setSignature(signature); return jsapiSignature; } catch (NoSuchAlgorithmException e) { throw new RuntimeException(e); } }
/*** * 用于获得调用微信js api 接口生成签名准备 * 说明:这里借用Chanjar 开源企业号开发的方法。http://www.oschina.net/p/weixin-java-tools * ***/ public String getJsapiTicket(boolean forceRefresh) throws WxErrorException { if (forceRefresh) { wxCpConfigStorage.expireJsapiTicket();// wxCpConfigStorage 这个类,主要用于存储一些重要的需要被共享或者同步更新的参数。expireJsapiTicket()这个方法就是将参数的有效期时间更新为0或者负数 } if (wxCpConfigStorage.isJsapiTicketExpired()) { synchronized (globalJsapiTicketRefreshLock) {//申明一个对象用于同步锁用。 protected final Object globalJsapiTicketRefreshLock = new Object(); if (wxCpConfigStorage.isJsapiTicketExpired()) { String url = "https://qyapi.weixin.qq.com/cgi-bin/get_jsapi_ticket"; String responseContent = execute(new SimpleGetRequestExecutor(), url, null); JsonElement tmpJsonElement = Streams.parse(new JsonReader(new StringReader(responseContent)));//返回数据json化 JsonObject tmpJsonObject = tmpJsonElement.getAsJsonObject(); String jsapiTicket = tmpJsonObject.get("ticket").getAsString(); int expiresInSeconds = tmpJsonObject.get("expires_in").getAsInt(); wxCpConfigStorage.updateJsapiTicket(jsapiTicket, expiresInSeconds); } } } return wxCpConfigStorage.getJsapiTicket(); }
三、根据访问的URL 动态生成签名
备注:这里才有spring框架,也可以不用。
/** * 微信js-api 用于获得jsticket ** js url 是用于生成调用js api的签名的url*/ @RequestMapping(value = "/wechat.do") public void JsApiGet(@RequestParam String url,HttpServletResponse response) {// 用于ajax 请求的时候获得相关数据,url 为需要生成签名的。 // 异构的时候返回jsticket Writelog.writetolog("进来wechat.do:"+url); if (null != url && !url.equals("")) {// 如果获取加密的URL 不为空 try { Writelog.writetolog("jsurl:"+url);// 获取连接的url WxJsapiSignature wxjssignature = wxserv .createJsapiSignature(url);// 根据添加的url 生成signature Gson gson=new Gson();//实例化 Gson 对象,借用Google 的json jar包 String signatureString=gson.toJson(wxjssignature); Writelog.writetolog("signatureString:"+signatureString);// 获取连接的url PrintWriter out = response.getWriter();//输出数据到response里面 out.write(signatureString); //返回 json 化的对象的数据 } catch (WxErrorException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }