思路:调用微信的 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();
}
}
}