微信生成签名

/**
 * 微信授权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<String, String> 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;
    }
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,716评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,558评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,431评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,127评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,511评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,692评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,915评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,664评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,412评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,616评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,105评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,424评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,098评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,096评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,869评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,748评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,641评论 2 271

推荐阅读更多精彩内容