1.参考微信开发文档
https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html
步骤一:绑定域名
先登录微信公众平台进入“公众号设置”的“功能设置”里填写“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接口注入权限验证配置
所有需要使用JS-SDK的页面必须先注入配置信息,否则将无法调用(同一个url仅需调用一次,对于变化url的SPA的web
app可在每次url变化时进行调用,目前Android微信客户端不支持pushState的H5新特性,所以使用pushState来实现web
app的页面会导致签名失败,此问题会在Android6.2中修复)。
wx.config({
debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
appId: '', // 必填,公众号的唯一标识
timestamp: , // 必填,生成签名的时间戳
nonceStr: '', // 必填,生成签名的随机串
signature: '',// 必填,签名
jsApiList: [] // 必填,需要使用的JS接口列表
});
2.服务端获取参数返回前台(java)
- 直接上代码
/**
* 获取jssdk签名
* @param request
* @return
*/
@GetMapping(value = "/signature",produces = "text/html;charset=utf-8")
public String getSignature(String url, HttpServletRequest request){
Map<String,String> result = null;
try {
String wyJsapi_ticket = WeixinSign.getWyJsapi_ticket();
result = WeixinSign.sign(wyJsapi_ticket, url);
} catch (Exception e) {
e.printStackTrace();
}
return resultSuccess(result);
}
- WeixinSign工具类
public class WeixinSign {
/**
* 小程序
*/
private static String appid = "wx-appId";
private static String secret = "wx-secret";
/**
* 网页
*/
public static String wy_appid = "wx-wy-appId";
public static String wy_secret = "wx-wy-secret";
protected static int secCount=0;
// private static String access_token = "";
// public static void main(String[] args) {
// String jsapi_ticket = getJsapi_ticket();
//
// // 注意 URL 一定要动态获取,不能 hardcode
// String url = "http://i.91sjyx.com/pc";
// Map<String, String> ret = sign(jsapi_ticket, url);
// for (Map.Entry entry : ret.entrySet()) {
// System.out.println(entry.getKey() + ", " + entry.getValue());
// }
// };
public static Map<String, String> sign(String jsapi_ticket, String url) {
Map<String, String> ret = new HashMap<String, String>();
String nonce_str = create_nonce_str();
String timestamp = create_timestamp();
String string1;
String signature = "";
// 注意这里参数名必须全部小写,且必须有序
string1 = "jsapi_ticket=" + jsapi_ticket + "&noncestr=" + nonce_str + "×tamp=" + timestamp + "&url=" + url;
System.out.println(string1);
try {
MessageDigest crypt = MessageDigest.getInstance("SHA-1");
crypt.reset();
crypt.update(string1.getBytes("UTF-8"));
signature = byteToHex(crypt.digest());
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
ret.put("url", url);
ret.put("jsapi_ticket", jsapi_ticket);
ret.put("nonceStr", nonce_str);
ret.put("timestamp", timestamp);
ret.put("signature", signature);
ret.put("appid",wy_appid);
return ret;
}
private static String byteToHex(final byte[] hash) {
Formatter formatter = new Formatter();
for (byte b : hash) {
formatter.format("%02x", b);
}
String result = formatter.toString();
formatter.close();
return result;
}
public static String getJsapi_ticket() {
String requestUrl = "https://api.weixin.qq.com/cgi-bin/token?";
String params = "grant_type=client_credential&appid=" + appid + "&secret=" + secret + "";
String result = HttpRequestUtil.httpGet(requestUrl + params);
String access_token = JSONObject.parseObject(result).getString("access_token");
requestUrl = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?";
params = "access_token=" + access_token + "&type=jsapi";
result = HttpRequestUtil.httpGet(requestUrl + params);
String jsapi_ticket = JSONObject.parseObject(result).getString("ticket");
return jsapi_ticket;
}
}