1:在需要调用JS接口的页面引入如下JS文件,(支持https):http://res.wx.qq.com/open/js/jweixin-1.4.0.js
2:通过config接口注入权限验证配置
//将公众号的唯一标识,生成签名的时间戳 ,生成签名的随机串 ,签名,传给微信服务器以便校验配置
wx.config({
debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以 在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
appId: $("#appId").val(), // 必填,公众号的唯一标识
timestamp:$("#timestamp").val(),// 必填,生成签名的时间戳
nonceStr: $("#nonceStr").val(),// 必填,生成签名的随机串
signature: $("#signature").val(),// 必填,签名
jsApiList: [ 'checkJsApi', 'openLocation','getLocation'] // 必填,需要使用的JS接口列表,所有JS接口列表
//在这个网址的最下面https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115
});
3:获取2中需要必填数据的思路,整理如下:
3.1 :获取access_token
3.2:获取jsapi_ticket。
备注jsapi_ticket是公众号用于调用微信JS接口的临时票据,效期7200秒。由于获取jsapi_ticket的api调 用次数非常有 限,频 繁刷新jsapi_ticket会导致api调用受限,影响自身业务,根据需要开发者必须在自己的服务全局缓存 jsapi_ticket 。
3.3 生成签名
签名生成规则如下:参与签名的字段包括noncestr(随机字符串), 有效的jsapi_ticket, timestamp(时间戳), url(当前网页的 URL,不包含#及其后面部分) 。对所有待签名参数按照字段名的ASCII 码从小到大排序(字典序)后,使用URL键值对的格 式(即key1=value1&key2=value2…)拼接成字符串string1。这里需要注意的是所有参数名均为小写字符。对string1作sha1加 密,字段名和字段值都采用原始值,不进行URL 转义。生成签名之前必须先了解一下jsapi_ticket,jsapi_ticket是公众号用于调 用微信JS接口的临时票据。
4:生成签名的算法,完整代码如下:
4.1 获取获取access_token
public class GetAccessTokenUtil {
// 网页授权接口
public final static String GetPageAccessTokenUrl = "https://api.weixin.qq.com/cgi-bin/token? grant_type=client_credential&appid=APPID&secret=SECRET";
public static Map
String requestUrl = GetPageAccessTokenUrl.replace("APPID", appid).replace("SECRET", appsecret);
HttpClient client = null;
Map
String accessToken = null;
try {
client = new DefaultHttpClient();
HttpGet httpget = new HttpGet(requestUrl);
ResponseHandler
String response = client.execute(httpget, responseHandler);
JSONObject OpenidJSONO = JSONObject.fromObject(response);
accessToken = String.valueOf(OpenidJSONO.get("access_token"));
result.put("accessToken", accessToken);
} catch (Exception e) {
e.printStackTrace();
} finally {
client.getConnectionManager().shutdown();
}
return result;
}
}
4.2:获取jsapi_ticket。
public class JsapiTicketUtil {
// 网页授权接口
public final static String GetPageAccessTokenUrl = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi";
public static Map
String requestUrl = GetPageAccessTokenUrl.replace("ACCESS_TOKEN", accessToken);
HttpClient client = null;
Map
try {
client = new DefaultHttpClient();
HttpGet httpget = new HttpGet(requestUrl);
ResponseHandler
String response = client.execute(httpget, responseHandler);
JSONObject OpenidJSONO = JSONObject.fromObject(response);
String errcode = String.valueOf(OpenidJSONO.get("errcode"));
String errmsg = String.valueOf(OpenidJSONO.get("errmsg"));
String ticket = String.valueOf(OpenidJSONO.get("ticket"));
String expires_in = String.valueOf(OpenidJSONO.get("expires_in"));
result.put("errcode", errcode);
result.put("errmsg", errmsg);
result.put("ticket", ticket);
result.put("expires_in", expires_in);
} catch (Exception e) {
e.printStackTrace();
} finally {
client.getConnectionManager().shutdown();
}
return result;
}
}
4.3:生成签名
public class SignatureUtil {
public final static String Url = "xxxxxxx/sosHelp.html"; //你所在引入微信js的界面,或者说开发的界面
public static Map
Map
String nonce_str = create_nonce_str();
String timestamp = create_timestamp();
// 注意这里参数名必须全部小写,且必须有序
String str = "jsapi_ticket="+jsapi_ticket+"&noncestr="+nonce_str+"×tamp="+timestamp+"&url="+Url;
String signature = DigestUtils.sha1Hex(str);
result.put("url", Url);
result.put("jsapi_ticket", jsapi_ticket);
result.put("nonceStr", nonce_str);
result.put("timestamp", timestamp);
result.put("signature", signature);
return result;
}
public static String create_nonce_str() {
return UUID.randomUUID().toString();
}
public static String create_timestamp() {
return Long.toString(System.currentTimeMillis() / 1000);
}
}
4.4 调用
@RequestMapping(value = "/getConfig", method = RequestMethod.GET, produces = "application/json;charset=UTF-8")
public Map
//获取token appid是微信公众号的AppID,appsecret是公众号的appsecret
Map
//获取jsapiTicket
Map
//获取签名
Map
sign.put("appid", appid);
System.out.println(accessToken.toString());
System.out.println(jsapiTicket.toString());
System.out.println(sign.toString());
return sign;
}