微信生成签名

/** * 微信授权access_token * @author wangcl * */ public class AccessToken { private String access_token; private int expires_in; private long expires_time; private String jsapi_ticket; public String getAccess_token() { return access_token; }public void setAccess_token(String access_token) { this.access_token = access_token; }public int getExpires_in() { return expires_in; }public void setExpires_in(int expires_in) { this.expires_in = expires_in; }public long getExpires_time() { return expires_time; }public void setExpires_time(long expires_time) { this.expires_time = expires_time; }public AccessToken( ) { }public AccessToken(String access_token, int expires_in,String jsapi_ticket) { this.access_token = access_token; this.expires_in = expires_in; this.expires_time = System.currentTimeMillis() / 1000; this.jsapi_ticket = jsapi_ticket; }public boolean isExpires() { if (access_token != null && expires_in > 0) { long currentTime = System.currentTimeMillis() / 1000; if (expires_in > (currentTime - expires_time + 30)) { return true; } }return false; }public String getJsapi_ticket() { return jsapi_ticket; }public void setJsapi_ticket(String jsapi_ticket) { this.jsapi_ticket = jsapi_ticket; }}

//加密 public class MD5Util {private static String byteArrayToHexString(byte b[]) { StringBuffer resultSb = new StringBuffer(); for (int i = 0; i < b.length; i++) resultSb.append(byteToHexString(b[i])); return resultSb.toString(); }private static String byteToHexString(byte b) { int n = b; if (n < 0) n += 256; int d1 = n / 16; int d2 = n % 16; return hexDigits[d1] + hexDigits[d2]; }public static String MD5Encode(String origin, String charsetname) { String resultString = null; try { resultString = new String(origin); MessageDigest md = MessageDigest.getInstance("MD5"); if (charsetname == null || "".equals(charsetname)) resultString = byteArrayToHexString(md.digest(resultString .getBytes())); else resultString = byteArrayToHexString(md.digest(resultString .getBytes(charsetname))); } catch (Exception exception) { } return resultString; }private static final String hexDigits[] = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f" }; }

/* '============================================================================ 'api说明: 'createSHA1Sign创建签名SHA1 'getSha1()Sha1签名 '============================================================================ '*/ public class Sha1Util {public static String getNonceStr() { Random random = new Random(); return MD5Util.MD5Encode(String.valueOf(random.nextInt(10000)), "UTF-8"); } public static String getTimeStamp() { return String.valueOf(System.currentTimeMillis() / 1000); }//创建签名SHA1 public static String createSHA1Sign(SortedMap signParams) throws Exception { StringBuffer sb = new StringBuffer(); Set es = signParams.entrySet(); Iterator it = es.iterator(); while (it.hasNext()) { Map.Entry entry = (Map.Entry) it.next(); String k = (String) entry.getKey(); String v = (String) entry.getValue(); sb.append(k + "=" + v + "&"); //要采用URLENCODER的原始值! } String params = sb.substring(0, sb.lastIndexOf("&")); //System.out.println("sha1之前:" + params); //System.out.println("SHA1签名为:"+getSha1(params)); return getSha1(params); } //Sha1签名 public static String getSha1(String str) { if (str == null || str.length() == 0) { return null; } char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; try { MessageDigest mdTemp = MessageDigest.getInstance("SHA1"); mdTemp.update(str.getBytes("UTF-8")); byte[] md = mdTemp.digest(); int j = md.length; char buf[] = new char[j * 2]; int k = 0; for (int i = 0; i < j; i++) { byte byte0 = md[i]; buf[k++] = hexDigits[byte0 >>> 4 & 0xf]; buf[k++] = hexDigits[byte0 & 0xf]; } return new String(buf); } catch (Exception e) { return null; } } }

public class WxAuth {HttpServletRequest request; HttpServletResponse response; String openId, accessToken,nickname,headimgurl; String unionId, code = null; public WxAuth(HttpServletRequest request, HttpServletResponse response) { this.request = request; this.response = response; }public String wxAuth() { code = request.getParameter("code"); String openId = request.getParameter("openid"); //System.out.println("In wxAuth.............:code="+code); if (!CommonUtils.isEmptyString(code)) { if (getAccessToken(code)) { //System.out.println("In wxAuth.............:getAccesstoke:code="+code); if (!CommonUtils.isEmptyString(openId)) { return openId; } } } reAuth(); return null; }/** * 根据code获取accesstoken * @param code * @return */ private boolean getAccessToken(String code) { openId = null; accessToken = null; unionId = null; // 不管如何先清空数据 String accessUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + Consts.APPID + "&secret=" + Consts.APPSECRET + "&code=" + code + "&grant_type=authorization_code"; JSONObject jsonObject = CommonUtils.httpsRequest(accessUrl, "GET", null); if (null != jsonObject) { try { openId = jsonObject.getString("openid"); accessToken = jsonObject.getString("access_token"); unionId = jsonObject.getString("unionid"); } catch (Exception e) { } } if (!CommonUtils.isEmptyString(openId)) { request.getSession().setAttribute(Consts.SESSION_OPENID, openId); String UnionURL = "https://api.weixin.qq.com/sns/userinfo?lang=zh_CN&openid=" + openId + "&access_token=" + accessToken; JSONObject jsonObject2 = CommonUtils.httpsRequest(UnionURL, "GET", null); //System.out.println("In WxAuth.........:getUserInfo"); if (null != jsonObject2) { try { nickname = jsonObject2.getString("nickname"); headimgurl = jsonObject2.getString("headimgurl"); System.out.println("In WxAuth.........:getUserInfo: nickname = "+nickname+".....headimgurl = "+headimgurl); } catch (Exception e) { } } return true; } return false; }/** * 跳转微信授权 */ public void reAuth() { // 清空session,重新获取授权 request.getSession().setAttribute(Consts.SESSION_OPENID, ""); request.getSession().setAttribute("accesstoken", ""); request.getSession().setAttribute("wxauth", 1); try { response.sendRedirect("./wxsq?reurl=" + CommonUtils.getFullURLWithParam(request)); // 返回到配置文件中定义的路径 } catch (IOException e) { e.printStackTrace(); } } }

public class WeiXinEntity {// 获取access_token的接口地址(GET) 限200(次/天) public final static String access_token_url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET"; //微信模板消息发送 public final static String template_url = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=ACCESS_TOKEN"; // 获取jsapi_ticket_url的接口地址(GET) 限200(次/天) public final static String jsapi_ticket_url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi"; public static AccessToken accessToken; //微信模板消息发送 public int sendTemplate(String jsonmsg){ int result = -1; AccessToken token = getAccessToken(); if (accessToken != null && accessToken.isExpires()) { // 拼装url String url = template_url.replace("ACCESS_TOKEN", token.getAccess_token()); // 调用接口创建菜单 JsonObject jsonObject = CommonUtils.httpRequest(url, "POST", jsonmsg); // 请求成功 if (null != jsonObject) { result = jsonObject.get("errcode").getAsInt(); } } return result; }/** * 取得微信access_token * * @return */ public AccessToken getAccessToken() { if (accessToken != null && accessToken.isExpires()) { return this.accessToken; } String requestUrl = access_token_url.replace("APPID", Consts.APPID).replace("APPSECRET", Consts.APPSECRET); JsonObject jsonObject = CommonUtils.httpRequest(requestUrl, "GET", null); // 请求成功 if (null != jsonObject) { try { String access_token = jsonObject.get("access_token").getAsString(); String jsapi_ticketurl = jsapi_ticket_url.replace("ACCESS_TOKEN", access_token); JsonObject tickObject = CommonUtils.httpRequest(jsapi_ticketurl, "GET", null); String jsapi_ticke = tickObject.get("ticket").getAsString(); accessToken = new AccessToken(jsonObject.get("access_token").getAsString(), jsonObject.get("expires_in").getAsInt(),jsapi_ticke); } catch (Exception e) { accessToken = null; } } return this.accessToken; }public String getJsTicket() { AccessToken token = getAccessToken(); if (accessToken != null && accessToken.isExpires()) { return token.getJsapi_ticket(); } return null; }}

/** * 发送https请求 * * @param requestUrl 请求地址 * @param requestMethod 请求方式(GET、POST) * @param outputStr 提交的数据 * @return JSONObject(通过JSONObject.get(key)的方式获取json对象的属性值) */ public static JSONObject httpsRequest(String requestUrl, String requestMethod, String outputStr) { JSONObject jsonObject = null; try { // 创建SSLContext对象,并使用我们指定的信任管理器初始化 TrustManager[] tm = { new MyX509TrustManager() }; SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE"); sslContext.init(null, tm, new java.security.SecureRandom()); // 从上述SSLContext对象中得到SSLSocketFactory对象 SSLSocketFactory ssf = sslContext.getSocketFactory(); URL url = new URL(requestUrl); HttpsURLConnection conn = (HttpsURLConnection) url.openConnection(); conn.setSSLSocketFactory(ssf); conn.setDoOutput(true); conn.setDoInput(true); conn.setUseCaches(false); // 设置请求方式(GET/POST) conn.setRequestMethod(requestMethod); // 当outputStr不为null时向输出流写数据 if (null != outputStr) { OutputStream outputStream = conn.getOutputStream(); // 注意编码格式 outputStream.write(outputStr.getBytes("UTF-8")); outputStream.close(); }// 从输入流读取返回内容 InputStream inputStream = conn.getInputStream(); InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8"); BufferedReader bufferedReader = new BufferedReader(inputStreamReader); String str = null; StringBuffer buffer = new StringBuffer(); while ((str = bufferedReader.readLine()) != null) { buffer.append(str); }// 释放资源 bufferedReader.close(); inputStreamReader.close(); inputStream.close(); inputStream = null; conn.disconnect(); jsonObject = JSONObject.fromObject(buffer.toString()); } catch (ConnectException ce) { } catch (Exception e) { } return jsonObject; }

/** * 获取当前时间 yyyyMMddHHmmss * @return String */ public static String getCurrTime() { Date now = new Date(); SimpleDateFormat outFormat = new SimpleDateFormat("yyyyMMddHHmmss"); String s = outFormat.format(now); return s; }/** * 取出一个指定长度大小的随机正整数. * * @param length *int 设定所取出随机数的长度。length小于11 * @return int 返回生成的随机数。 */ public static int buildRandom(int length) { int num = 1; double random = Math.random(); if (random < 0.1) { random = random + 0.1; } for (int i = 0; i < length; i++) { num = num * 10; } return (int) ((random * num)); }

/** * 发起https请求 * * @param requestUrl *请求地址 * @param requestMethod *请求方式(GET、POST) * @param outputStr *提交的数据 * @return JSONObject(通过JSONObject.get(key)的方式获取json对象的属性值) */ public static JsonObject httpRequest(String requestUrl, String requestMethod, String outputStr) { JsonObject jsonObject = null; StringBuffer buffer = new StringBuffer(); try { // 创建SSLContext对象 TrustManager[] tm = { (TrustManager) new MyX509TrustManager() }; SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE"); sslContext.init(null, tm, new java.security.SecureRandom()); // 从上述SSLContext对象中得到SSLSocketFactory对象 SSLSocketFactory ssf = sslContext.getSocketFactory(); URL url = new URL(requestUrl); HttpsURLConnection httpUrlConn = (HttpsURLConnection) url.openConnection(); httpUrlConn.setSSLSocketFactory(ssf); httpUrlConn.setDoOutput(true); httpUrlConn.setDoInput(true); httpUrlConn.setUseCaches(false); // 设置请求方式(GET/POST) httpUrlConn.setRequestMethod(requestMethod); if ("GET".equalsIgnoreCase(requestMethod)) httpUrlConn.connect(); // 当有数据需要提交时 if (null != outputStr) { OutputStream outputStream = httpUrlConn.getOutputStream(); // 编码格式 outputStream.write(outputStr.getBytes("UTF-8")); outputStream.close(); } // 将返回的输入流转换成字符串 InputStream inputStream = httpUrlConn.getInputStream(); InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8"); BufferedReader bufferedReader = new BufferedReader(inputStreamReader); String str = null; while ((str = bufferedReader.readLine()) != null) { buffer.append(str); } bufferedReader.close(); inputStreamReader.close(); // 释放资源 inputStream.close(); inputStream = null; httpUrlConn.disconnect(); JsonParser jp = new JsonParser(); jsonObject = (JsonObject) jp.parse(buffer.toString()); } catch (Exception e) { e.printStackTrace(); } return jsonObject; }

    推荐阅读