美文网首页
微信生成签名

微信生成签名

作者: 魏立廷 | 来源:发表于2017-12-15 12:53 被阅读0次
    /**
     * 微信授权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;
        }
    

    相关文章

      网友评论

          本文标题:微信生成签名

          本文链接:https://www.haomeiwen.com/subject/kparwxtx.html