不敢标原创,感谢
柳峰老师和另一位dalao(http://my.csdn.net/wgyscsf)
$(function() {
//微信转发
$.ajax({
type : "post",
url : "index_WxZhuanFa",
dataType : "json",
data : {
"url" : location.href.split('#')[0],
},
success : function(data) {
//alert(data.signature)
fx(data.timestamp, data.nonceStr, data.signature);
},
error : function() {
alert("WTF?");
}
});
});
function fx(timestamp, nonceStr, signature) {
//alert(timestamp + '==' + nonceStr + '==' + signature)
wx.config({
debug : false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
appId : '', // 必填,公众号的唯一标识
timestamp : timestamp, // 必填,生成签名的时间戳
nonceStr : nonceStr, // 必填,生成签名的随机串
signature : signature,// 必填,签名,见附录1
jsApiList : [ 'onMenuShareAppMessage', 'onMenuShareTimeline' ]
// 必填,需要使用的JS接口列表,所有JS接口列表见附录2
});
wx.ready(function() {
wx.onMenuShareTimeline({
title : '',// 分享标题
link : '',// 分享链接
imgUrl : '',//分享图标
success : function() {
// 用户确认分享后执行的回调函数
alert('分享到朋友圈成功');
},
cancel : function() {
// 用户取消分享后执行的回调函数
alert('你没有分享到朋友圈');
}
});
wx.onMenuShareAppMessage({
title : '', // 分享标题
desc : '', // 分享描述
link : '', // 分享链接
imgUrl : '', // 分享图标
type : '', // 分享类型,music、video或link,不填默认为link
dataUrl : '', // 如果type是music或video,则要提供数据链接,默认为空
success : function() {
// 用户确认分享后执行的回调函数
alert("分享成功")
},
cancel : function() {
// 用户取消分享后执行的回调函数
alert("分享取消")
}
});
});
}
/** * 微信转发 * * @throws IOException */ public void WxZhuanFa() throws IOException { HttpServletRequest request = ServletActionContext.getRequest(); HttpServletResponse response = ServletActionContext.getResponse(); PrintWriter out = response.getWriter(); String AccessToken = null; try { AccessToken = WxAccessToken.getSavedAccess_token(); } catch (IOException e) { System.out.println("微信转发:AccessToken拿失败"); } String ticket = null; try { ticket = WxJsapi_ticket.getSaveJsapi_ticket(AccessToken); } catch (IOException e) { System.out.println("微信转发:ticket拿失败"); } String jsapi_ticket = ticket; // 注意 URL 一定要动态获取,不能 hardcode String url = request.getParameter("url"); Map<String, String> ret = Sign.sign(jsapi_ticket, url); /*for (Map.Entry entry : ret.entrySet()) { System.out.println(entry.getKey() + ", " + entry.getValue()); }*/ JSONObject jsonObject = JSONObject.fromObject(ret); out.println(jsonObject); out.flush(); out.close(); }
public class WxAccessToken { private static final long MAX_TIME = 7200 * 1000;// 微信允许最长Access_token有效时间(ms) /** * 获取Access_token 保存并且只保存2小时Access_token。如果超过两个小时重新获取;如果没有超过两个小时,直接获取 * 思路:将获取到的Access_token和当前时间存储到file里, * 取出时判断当前时间和存储里面的记录的时间的时间差,如果大于MAX_TIME,重新获取,并且将获取到的存储到file替换原来的内容 * ,如果小于MAX_TIME,直接获取。 * * @throws IOException */ public static String getSavedAccess_token() throws IOException { Gson gson = new Gson(); String mAccess_token = null;// 需要获取的Access_token; File file = new File("temp_access_token.temp");// Access_token保存的位置 // 如果文件不存在,创建 if (!file.exists()) file.createNewFile(); // 如果文件大小等于0,说明第一次使用,存入Access_token if (file.length() == 0) { mAccess_token = getAccessToken(); FileOutputStream fos = new FileOutputStream(file, false);// 不允许追加 Access_token at = new Access_token(); at.setAccess_token(mAccess_token); at.setExpires_in(System.currentTimeMillis() + ""); String json = gson.toJson(at); fos.write((json).getBytes()); fos.close(); } else { // 读取文件内容 FileInputStream fis = new FileInputStream(file); byte[] b = new byte[2048]; int len = fis.read(b); String mJsonAccess_token = new String(b, 0, len);// 读取到的文件内容 Access_token access_token = gson.fromJson(mJsonAccess_token, new Access_token().getClass()); if (access_token.getExpires_in() != null) { long saveTime = Long.parseLong(access_token.getExpires_in()); long nowTime = System.currentTimeMillis(); long remianTime = nowTime - saveTime; //System.out.println(TAG + "时间差:" + remianTime); if (remianTime < MAX_TIME) { Access_token at = gson.fromJson(mJsonAccess_token, new Access_token().getClass()); mAccess_token = at.getAccess_token(); } else { mAccess_token = getAccessToken(); FileOutputStream fos = new FileOutputStream(file, false);// 不允许追加 Access_token at = new Access_token(); at.setAccess_token(mAccess_token); at.setExpires_in(System.currentTimeMillis() + ""); String json = gson.toJson(at); fos.write((json).getBytes()); fos.close(); } } } //System.out.println("获取到的Access_token是:" + mAccess_token); return mAccess_token; } public static String getAccessToken() { String urlString = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + Constant.APPID + "&secret=" + Constant.SERCRET; String reslut = null; try { URL reqURL = new URL(urlString); HttpsURLConnection httpsConn = (HttpsURLConnection) reqURL.openConnection(); InputStreamReader isr = new InputStreamReader(httpsConn.getInputStream()); char[] chars = new char[1024]; reslut = ""; int len; while ((len = isr.read(chars)) != -1) { reslut += new String(chars, 0, len); } isr.close(); } catch (IOException e) { e.printStackTrace(); } Gson gson = new Gson(); Access_token access_token = gson.fromJson(reslut, new Access_token().getClass()); if (access_token.getAccess_token() != null) { return access_token.getAccess_token(); } else { return null; } } }
public class WxJsapi_ticket { private static final long MAX_TIME = 7200 * 1000;// 微信允许最长Jsapi_ticket有效时间(ms) /** * 获取并保存Jsapi_ticket * * @throws IOException */ public static String getSaveJsapi_ticket(String ACCESS_TOKEN) throws IOException { Gson gson = new Gson(); String ticket = null;// 需要获取的 File file = new File("temp_jsapi_ticket.temp");// Access_token保存的位置 // 如果文件不存在,创建 if (!file.exists()) file.createNewFile(); // 如果文件大小等于0,说明第一次使用,存入Access_token if (file.length() == 0) { ticket = getJsapi_ticket(ACCESS_TOKEN); FileOutputStream fos = new FileOutputStream(file, false);// 不允许追加 Jsapi_ticket jt = new Jsapi_ticket(); jt.setTicket(ticket); jt.setExpires_in(System.currentTimeMillis() + ""); String json = gson.toJson(jt); fos.write((json).getBytes()); fos.close(); } else { // 读取文件内容 FileInputStream fis = new FileInputStream(file); byte[] b = new byte[2048]; int len = fis.read(b); String mJsonAccess_token = new String(b, 0, len);// 读取到的文件内容 Jsapi_ticket jsapi_ticket = gson.fromJson(mJsonAccess_token, new Jsapi_ticket().getClass()); if (jsapi_ticket.getExpires_in() != null) { long saveTime = Long.parseLong(jsapi_ticket.getExpires_in()); long nowTime = System.currentTimeMillis(); long remianTime = nowTime - saveTime; // System.out.println(TAG + "时间差:" + remianTime); if (remianTime < MAX_TIME) { Jsapi_ticket jt = gson.fromJson(mJsonAccess_token, new Jsapi_ticket().getClass()); ticket = jt.getTicket(); } else { ticket = getJsapi_ticket(ACCESS_TOKEN); FileOutputStream fos = new FileOutputStream(file, false);// 不允许追加 Jsapi_ticket jt = new Jsapi_ticket(); jt.setTicket(ticket); jt.setExpires_in(System.currentTimeMillis() + ""); String json = gson.toJson(jt); fos.write((json).getBytes()); fos.close(); } } } //System.out.println("获取到的ticket是:" + ticket); return ticket; } public static String getJsapi_ticket(String ACCESS_TOKEN) throws IOException { // String ACCESS_TOKEN=getSavedAccess_token(); // 拼接api要求的httpsurl链接 String urlString = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=" + ACCESS_TOKEN + "&type=jsapi";// ACCESS_TOKEN // 创建一个url URL reqURL = new URL(urlString); // 拿取链接 HttpsURLConnection httpsConn = (HttpsURLConnection) reqURL.openConnection(); // 取得该连接的输入流,以读取响应内容 InputStreamReader isr = new InputStreamReader(httpsConn.getInputStream()); // 读取服务器的响应内容并显示 char[] chars = new char[1024]; String reslut = ""; int len; while ((len = isr.read(chars)) != -1) { reslut += new String(chars, 0, len); } isr.close(); /* * 转化json成javabean。引入了第三方jar:GSON */ Gson gson = new Gson();// 将获取的json转化为java中的bean // 注意:Access_token access_token是一个自己创建的javabean Jsapi_ticket jsapiTicket = gson.fromJson(reslut, new Jsapi_ticket().getClass()); if (jsapiTicket.getTicket() != null) { // System.out.println("获取的Jsapi_ticket是:"+ jsapiTicket.getTicket()); // System.out.println("该Jsapi_ticket的有效时间是:"+ // jsapiTicket.getExpires_in() + "s"); return jsapiTicket.getTicket(); } else { // System.out.println(TAG + "获取Jsapi_ticket失败,请检查"); return null; } } }
public class Sign { public static Map sign(String jsapi_ticket, String url) { Map ret = new HashMap (); 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); 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; } private static String create_nonce_str() { return UUID.randomUUID().toString(); } private static String create_timestamp() { return Long.toString(System.currentTimeMillis() / 1000); } }