zoukankan      html  css  js  c++  java
  • 获取微信签名

    微信开发----配置权限获取签名

    url

    @POST
        @Path("getJsApi")
        public DataCenter<Object> getJsApi(String url){
            DataCenter<Object> netData = new DataCenter<Object>();
            String times = Long.toString(System.currentTimeMillis()/1000);
            String nonceStr = PropertiesUtil.get("weChat.nonceStr");
            String jsapi = WeChatUtil.getJSSignature(nonceStr,times,url);
            int i =jsapi.lastIndexOf("@");
            String signature = jsapi.substring(0, i);
            String timeOut = jsapi.substring(i+1, jsapi.length());
            Map<String,Object> map = new HashMap<>();
            map.put("appId", Constant.WECHAT_APPID);
            map.put("signature", signature);
            map.put("timeOut", timeOut);
            map.put("timestamp", times);
            map.put("nonceStr", nonceStr);
            netData.setData(map);
            return netData;
        }

    获取js签名

     /** 
         * 获得js授权的签名信息 
         * @throws UnsupportedEncodingException 
         *  
         */  
        public static String getJSSignature(String noncestr, String timestamp, String url){  
            StringBuilder content = new StringBuilder();  
            content.append("jsapi_ticket=").append(getJsapiTicket());
            content.append("&noncestr=").append(noncestr);
            content.append("&timestamp=").append(timestamp);
            content.append("&url=").append(url);
            MessageDigest md = null;  
            String tmpStr = null;  
            try(Formatter formatter = new Formatter()){
                md = MessageDigest.getInstance("SHA-1");  
                // 2.将三个参数字符串拼接成一个字符串进行sha1加密
                md.reset();
                md.update(content.toString().getBytes("UTF-8"));
                for (byte b : md.digest()) {
                    formatter.format("%02x", b);
                }
                long tims = JspaiTicket_access - (System.currentTimeMillis()/1000) - 120;
                tmpStr = formatter.toString().concat("@").concat(Long.toString(tims));
            } catch (Exception e) {  
                e.printStackTrace();  
            }
            content = null;
            logger.debug("----------------------分享获取机密串 :【{}】",tmpStr);
            // 3.将sha1加密后的字符串返回
            return tmpStr;  
        }

     

     获取jsapiTickt 和accessToken  (为保证有效性,可采用redis存储/或者采用Map)

    /**
         * 获取 access_token
         * 代码注解见 getJsapiTicket()  本类
         * 两方法类似
         * @return
         */
        public static String getAccessToken(){
            String relust = null;
            long now = AccessToken_access - System.currentTimeMillis();
            if(AccessToken == null || "".equals(AccessToken) || now <= 0){
                try(Jedis jesis = JedisUtil.getJedisConnection(Constant.TICKET_DB)){
                    // 先取redis ,有值则直接返回 
                    long times = jesis.ttl(WeChatUtil.WECHAT_ACCESSTOKEN_LOCKE);
                    if(times > 300){
                        relust = jesis.get(WECHAT_ACCESSTOKEN_KEY);
                        // 设定本地计时比redis 慢60 
                        AccessToken_access = System.currentTimeMillis() + (times - 60) * 1000;
                    }else{
                        String lock = jesis.set(WECHAT_ACCESSTOKEN_LOCKE, "1" ,"nx", "ex",30);
                        if("OK".equals(lock)){
                            relust = HttpConnectionUtil.getString(ACCESSTOKEN_API.replace("APPID", WECHAT_APPID).replace("APPSECRET", WECHAT_SECRETKEY));
                            JSONObject json = JSONObject.parseObject(relust);
                            relust = json.getString("access_token");
                            if(relust!=null && !"".equals(relust)){
                                jesis.del(WECHAT_ACCESSTOKEN_KEY);
                                jesis.set(WECHAT_ACCESSTOKEN_KEY, relust ,"nx", "ex",7150);
                                AccessToken = relust;
                                AccessToken_access = System.currentTimeMillis() + ((7200-360) * 1000);
                            }
                        }
                    }
                } catch (Exception e) {
                    logger.error("--------------------WECHAT_ACCESSTOKEN 获取异常---------------------");
                    return null;
                }
            } 
            logger.debug("--------------------WECHAT_ACCESSTOKEN 获取成功:【{}】---------------------",AccessToken);
            return AccessToken;
        }
        
        /**
         * 获取 jsapi_ticket
         * @return
         */
        public static String getJsapiTicket(){
            String relust = null;
            long now = JspaiTicket_access - System.currentTimeMillis();
            // 判断 ticket 时效性 ,判断 ticket 本地是否有 
            if(JspaiTicket == null || "".equals(JspaiTicket) || now <= 0){
                // 本地没有,则去分布式缓存中取
                try(Jedis jesis = JedisUtil.getJedisConnection(Constant.TICKET_DB)){
                    // 先取redis ,有值则直接返回 
                    long times = jesis.ttl(WeChatUtil.WECHAT_JSAPITICKET_LOCKE);
                    if(times > 300){
                        relust = jesis.get(WECHAT_JSAPITICKET_KEY);
                        // 设定本地计时比redis 慢60 
                        JspaiTicket_access = System.currentTimeMillis() + (times - 60) * 1000;
                    }else{
                        // jsapi 乐观锁 30秒有效
                        String lock = jesis.set(WECHAT_JSAPITICKET_LOCKE, "1" ,"nx", "ex",30);
                        if("OK".equals(lock)){
                            //得锁的线程,进入刷新 jsapi ticket
                            relust = HttpConnectionUtil.getString(WECHAT_GET_JSAPI_API.replace("ACCESS_TOKEN", getAccessToken()));
                            relust = JSONObject.parseObject(relust).getString("ticket");
                            if(relust!=null && !"".equals(relust)){
                                // 刷新 ticket 后保存到本节点,减少 redis 的访问次数
                                jesis.del(WECHAT_JSAPITICKET_KEY);
                                jesis.set(WECHAT_JSAPITICKET_KEY, relust ,"nx", "ex",7150); 
                                JspaiTicket = relust;
                                JspaiTicket_access = System.currentTimeMillis() + ((7200-360) * 1000);
                            }
                        }else{
                            // 没有拿到锁,30秒之后再来的线程从新初始化
                            JspaiTicket_access = JspaiTicket_access + 30;
                        }
                    }
                } catch (Exception e) {
                    logger.error("-------------------- WECHAT_JSAPITICKET 获取异常 ---------------------");
                    return null;
                }
            }
            logger.debug("--------------------WECHAT_JSAPITICKET 获取成功:【{}】---------------------",JspaiTicket);
            return JspaiTicket;
        }
  • 相关阅读:
    Altium Designer如何导出SMT贴片机用的坐标文件
    STM8S003设计注意事项
    Keil4打开KEIL5未响应卡死的问题
    STM32 adc 多通道采集相互串扰问题解决
    STM32 RS485 和串口 只能接收不能发送问题解决
    AD中元器件报警的处理——器件高度报警
    QT乱码解决办法《转》
    STM32下载失败,st-link v2 在线下载sw模式检测不到
    docker部署普罗米修斯监控
    进程管理常用命令
  • 原文地址:https://www.cnblogs.com/zhshto/p/6474116.html
Copyright © 2011-2022 走看看