package com.ekexiu.portal.service; import java.security.MessageDigest; import java.util.Formatter; import java.util.HashMap; import java.util.Map; import org.jfw.apt.web.annotation.Path; import org.jfw.apt.web.annotation.operate.Get; import org.jfw.util.StringUtil; import org.jfw.util.reflect.TypeReference; import com.ekexiu.portal.util.HttpUtil; @Path("/weixin") public class WeixinService { private String jsApiTicket = null; private String jsApiOauthUrl = "https://api.weixin.qq.com/cgi-bin/token"; private String jsApiTicketUrl = "https://api.weixin.qq.com/cgi-bin/ticket/getticket"; private String jsApiAppId = "wx9803e86056ddbdd5"; private String jsApiAppSecret = "64b88e58a7adef91068b9eb364891dcb"; private String jsApiToken = null; private long delayTime=7200L; public long getDelayTime() { return delayTime; } public void setDelayTime(long delayTime) { this.delayTime = delayTime; } public String getJsApiTicket() { return jsApiTicket; } public void setJsApiTicket(String jsApiTicket) { this.jsApiTicket = jsApiTicket; } public String getJsApiOauthUrl() { return jsApiOauthUrl; } public void setJsApiOauthUrl(String jsApiOauthUrl) { this.jsApiOauthUrl = jsApiOauthUrl; } public String getJsApiTicketUrl() { return jsApiTicketUrl; } public void setJsApiTicketUrl(String jsApiTicketUrl) { this.jsApiTicketUrl = jsApiTicketUrl; } public String getJsApiAppId() { return jsApiAppId; } public void setJsApiAppId(String jsApiAppId) { this.jsApiAppId = jsApiAppId; } public String getJsApiAppSecret() { return jsApiAppSecret; } public void setJsApiAppSecret(String jsApiAppSecret) { this.jsApiAppSecret = jsApiAppSecret; } public String getJsApiToken() { return jsApiToken; } public void setJsApiToken(String jsApiToken) { this.jsApiToken = jsApiToken; } private void refreshToken() { try { String url = jsApiOauthUrl + "?grant_type=client_credential&appid=" + jsApiAppId + "&secret=" + jsApiAppSecret; Map map = HttpUtil.loadJsonObject(url, (new TypeReference>() { }).getType()); this.jsApiToken = (String) map.get("access_token"); if (this.jsApiToken.length() == 0) this.jsApiToken = null; } catch (Exception e) { this.jsApiToken = null; } } private void refreshJsApiTicket() { jsApiTicket = null; if (this.jsApiToken != null) { try { String url = jsApiTicketUrl + "?type=jsapi&access_token=" + this.jsApiToken + "&secret=" + jsApiAppSecret; Map map = HttpUtil.loadJsonObject(url, (new TypeReference>() { }).getType()); this.jsApiTicket = (String) map.get("ticket"); if (this.jsApiTicket.length() == 0) this.jsApiTicket = null; } catch (Exception e) { this.jsApiToken = null; } } } //定时任务,2小时执行一次 public void refresh() { this.refreshToken(); this.refreshJsApiTicket(); } @Get @Path("/jsapiTicket") public Map jsSDK_Sign(String url) throws Exception { if (this.jsApiTicket == null) return null; String noncestr = StringUtil.buildUUID(); String timestamp = "" + System.currentTimeMillis(); String string1 = "jsapi_ticket=" + this.jsApiTicket + "&noncestr=" + noncestr + "×tamp=" + timestamp + "&url=" + url; MessageDigest crypt = MessageDigest.getInstance("SHA-1"); crypt.reset(); crypt.update(string1.getBytes("UTF-8")); String signature = byteToHex(crypt.digest()); Map jssdk = new HashMap(); jssdk.put("appId", this.jsApiAppId); jssdk.put("timestamp", timestamp); jssdk.put("nonceStr", noncestr); jssdk.put("signature", signature); return jssdk; } 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; } }