zoukankan      html  css  js  c++  java
  • JSAPI_Ticket签名

    1、微信 JS 接口签名校验工具

    2、具体开发

    2.1 获取access_token,然后jsapi_ticket

    /**
         * 获取access_token,然后jsapi_ticket
         */
        private String getAccessToken_ticket(String path) {
            String access_token = null; // access_token
            String atime = null;// 获取时间
            String a_expires_in = null;// 有效时间(s)
            String ticket = null;// jsapi_ticket
            String ttime = null;// 得到时间
            String t_expires_in = null;// 有效时间(s)
            String access_tokenStr = TUtils.getAccessToken(APPID,
                    API_KEY);
            if (access_tokenStr != null
                    && access_tokenStr.indexOf("access_token") != -1) {
                try {
                    JSONObject jsonObject = new JSONObject(access_tokenStr);
                    access_token = jsonObject.getString("access_token");
                    a_expires_in = jsonObject.getString("expires_in");
                    atime = getCurrentDateStr();
                } catch (JSONException e) {
                    // e.printStackTrace();
                }
            }
            if (access_token != null && !access_token.equals("")) {
                String ticketStr = TicketUtils.getJSAPITicket(access_token);
                // System.out.println("ticketStr:" + ticketStr);
                if (ticketStr != null && ticketStr.indexOf("ticket") != -1) {
                    try {
                        JSONObject jsonObject = new JSONObject(ticketStr);
                        ticket = jsonObject.getString("ticket");
                        t_expires_in = jsonObject.getString("expires_in");
                        ttime = getCurrentDateStr();
                    } catch (JSONException e) {
                        // e.printStackTrace();
                    }
                }
            }
            String result = null;
            if (ticket != null && !ticket.equals("")) {
                result = "{"access_token":"" + access_token
                        + "","a_expires_in":"" + a_expires_in
                        + "","atime":"" + atime + "","ticket":"" + ticket
                        + "","t_expires_in":"" + t_expires_in
                        + "","ttime":"" + ttime + ""}";
                if (MyFileUtils.writeIntoText(path, result)) {
                    // System.out.println("写入文件成功");
                    // System.out.println(result);
                } else {
                    System.out.println("写入微信签名文件失败");
                }
            }
            return result;
        }
    public static String getAccessToken(String APPID, String APPSECRET) {
    
    String url = "https://api.weixin.qq.com/cgi-bin/token";
            String params = "grant_type=client_credential&appid=" + APPID
                    + "&secret=" + APPSECRET;
    String resultStr = HttpRequest.sendGet(url, params);
    // sendGet:用get方法获取数据 ,具体请参考之间的关于微信的文章 http://www.cnblogs.com/jiduoduo/p/5749363.html
    return resultStr; }
    /**
         * 根据access_token获取ticket { "errcode":0, "errmsg":"ok", "ticket":
         * "bxLdikRXVbTPdHSM05e5u5sUoXNKd8-41ZO3MhKoyN5OfkWITDGgnr2fwJ0m9E8NYzWKVZvdVtaUgWvsdshFKA"
         * , "expires_in":7200 }
         * 
         * @param access_token
         * @return
         */
        public static String getJSAPITicket(String access_token) {
            String url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket";
            String params = "type=jsapi&access_token=" + access_token;
            String resultStr = HttpRequest.sendGet(url, params);
    
            return resultStr;
        }

    2.2具体生成签名signature

    public String Wx_Signature() {
            String path = ServletActionContext.getServletContext().getRealPath(
                    "/wx/");
            // System.out.println(path);
            try {
                String tokenJSON = MyFileUtils.readText(path);
                // String access_token = null; // access_token
                String atime = null;// 获取时间
                String a_expires_in = null;// 有效时间(s)
                String ticket = null;// jsapi_ticket
                // String ttime = null;// 得到时间
                // String t_expires_in = null;// 有效时间(s)
                String result = tokenJSON;
                if (result == null || result.equals("")) {
                    tokenJSON = getAccessToken_ticket(path);
                }
                // System.out.println(result);
                if (tokenJSON != null && !tokenJSON.equals("")
                        && tokenJSON.indexOf("access_token") != -1) {
                    try {
                        JSONObject jsonObject = new JSONObject(tokenJSON);
                        // access_token = jsonObject.getString("access_token");//
                        // access_token
                        atime = jsonObject.getString("atime");// 开始时间
                        a_expires_in = jsonObject.getString("a_expires_in");// 有效时间
                        ticket = jsonObject.getString("ticket");// jsapi_ticket
                        // System.out.println(ticket);
                        // ttime = jsonObject.getString("ttime");// 开始时间
                        // t_expires_in = jsonObject.getString("t_expires_in");//
                        // 有效时间
                        String t1 = getCurrentDateStr();
                        String t2 = atime;
                        // System.out.println(atime);
                        // System.out.println(a_expires_in);
                        // System.out.println(TimeInterval.getInterval(t2, t1));
                        long end_time = Long.parseLong(a_expires_in) - 60;
                        if (TimeInterval.getInterval(t2, t1) > end_time) {
                            ticket = getAccessToken_ticket(path);
                        }
                    } catch (JSONException e) {
                        msg = e.getMessage();
                    }
                } else {
    
                }
                // System.out.println(ticket);
                String url = getParameter("url");
                String noncestr = TUtils.getRandomString(16);
                String timestamp = System.currentTimeMillis() + "";
                timestamp = timestamp.substring(0, 10);
                String data = "jsapi_ticket=" + ticket + "&noncestr=" + noncestr
                        + "&timestamp=" + timestamp + "&url=" + url;
                String digest = new SHA1().getDigestOfString(data.getBytes());
                String signature = digest.toLowerCase();// signature
                result = "{"noncestr":"" + noncestr + "","timestamp":""
                        + timestamp + "","url":"" + url + "","signature":""
                        + signature + "" ,"ticket":"" + ticket + ""}";
            msg = result;
            } catch (IOException e) {
                msg = e.getMessage();
            }
            return msg 
        }

    说明:签名是有调用次数,需要将其cache到服务器的文件中。

  • 相关阅读:
    spark定制之五:使用说明
    ElasticSearch-5.0安装head插件
    安卓真机或者模拟器运行安装应用时提示 Failure [INSTALL_FAILED_NO_MATCHING_ABIS: Failed to extract native libraries, res=-113]解决办法
    Elasticsearch介绍和安装与使用
    AndroidFine Error:Annotation processors must be explicitly declared now.
    Retrofit全攻略——进阶篇
    WCF基础教程之开篇:创建、测试和调用WCF
    SoapUI简介和入门实例解析
    postman的使用方法详解!最全面的教程
    Postman使用详解
  • 原文地址:https://www.cnblogs.com/jiduoduo/p/6136567.html
Copyright © 2011-2022 走看看