微信公眾號掃一掃后端簽名接口案例


公眾號的一些配置以及前面的域名配置我這里就不說了,我這里只記錄了后端的簽名接口

 

 

controller,就是普通的post請求,這里需要前端把掃一掃的那個頁面url發給你,需要進行轉碼處理的url

    @PostMapping("/wxScan")
    public R wxScan(@RequestBody Map<String,String> map)throws Exception{
        String url = map.get("url");
        if(StrBlankUtils.isBlank(url)){
            return new R(new Exception("url不能為空"));
        }
        return userService.wxScan(map);

    }

service 

    @Override
    public R wxScan(Map<String ,String> map2) {
        Map<String, Object> map = new HashMap<>();
        String accessToken = getAccessToken();
        Object jsApiTicket = getJsApiTicket(accessToken);
        String nonceStr = UUID.randomUUID().toString();
        String timestamp = Long.toString(System.currentTimeMillis() / 1000);
        String string1;
        String signature = "";

        //注意這里參數名必須全部小寫,且必須有序
        string1 = "jsapi_ticket=" + jsApiTicket +
            "&noncestr=" + nonceStr +
            "&timestamp=" + timestamp +
            "&url=" + map2.get("url");
        System.out.println("string1:"+string1);

        try
        {
            MessageDigest crypt = MessageDigest.getInstance("SHA-1");
            crypt.reset();
            crypt.update(string1.getBytes("UTF-8"));
            signature = byteToHex(crypt.digest());
        }
        catch (Exception e) {
            e.printStackTrace();
        }
        map.put("url", map2.get("url"));
        map.put("jsapi_ticket", jsApiTicket);
        map.put("nonceStr", nonceStr);
        map.put("timestamp", timestamp);
        map.put("signature", signature);
        map.put("appId", WechatConstants.PUBLIC_APP_ID);//公眾號的appid
        return new R(map);
    }

 

 

里面用到的方法

 
         
    /**
     * 普通基礎調用所需
     * @return
     */
    public String getAccessToken() {

        Object dhx_accessToken = redisTemplate.opsForValue().get("JFQ_AccessToken");
        if(dhx_accessToken==null||StringUtils.isBlank(dhx_accessToken.toString())){
            try{
                /**
                 *String GET_ACCESS_TOKEN_URL="https://api.weixin.qq.com/cgi-bin/token";
                 */
                String path = WechatConstants.GET_ACCESS_TOKEN_URL+"?"
                    + "appid="+ WechatConstants.PUBLIC_APP_ID     
                    + "&secret="+ WechatConstants.PUBLIC_APP_SECRET
                    + "&grant_type=client_credential";
                Connection connect = Jsoup.connect(path);
                Connection.Response response = connect.method(Connection.Method.GET).ignoreContentType(true).execute();
                String body = response.body();
                log.info(body);
                String access_token = new Gson().fromJson(body, Map.class).get("access_token").toString();
                if(StringUtils.isNotBlank(access_token)){
                    redisTemplate.opsForValue().set("JFQ_AccessToken",access_token,1200, TimeUnit.SECONDS);
                }
                return access_token ;
            }catch (Exception e){
                return "";
            }
        }
        return dhx_accessToken.toString();
    }
    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;
    }

 

    public static String doGet(String url, Map<String, String> param) {

        // 創建Httpclient對象
        CloseableHttpClient httpclient = HttpClients.createDefault();

        String resultString = "";
        CloseableHttpResponse response = null;
        try {
            // 創建uri
            URIBuilder builder = new URIBuilder(url);
            if (param != null) {
                for (String key : param.keySet()) {
                    builder.addParameter(key, param.get(key));
                }
            }
            URI uri = builder.build();

            // 創建http GET請求
            HttpGet httpGet = new HttpGet(uri);

            // 執行請求
            response = httpclient.execute(httpGet);
            // 判斷返回狀態是否為200
            if (response.getStatusLine().getStatusCode() == 200) {
                resultString = EntityUtils.toString(response.getEntity(), "UTF-8");
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (response != null) {
                    response.close();
                }
                httpclient.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return resultString;
    }

    public static String doGet(String url) {
        return doGet(url, null);
    }

 

    public  String getJsApiTicket(String token) {
        Object JsApiTicket = redisTemplate.opsForValue().get("JFQ_JsApiTicket");
        if(JsApiTicket==null){
            //String JSAPI_TICKET = "https://api.weixin.qq.com/cgi-bin/ticket/getticket";
            String url = WechatConstants.JSAPI_TICKET
                + "?access_token=" + token
                + "&type=jsapi";
            String msg = doGet(url);
            if (StringUtils.isBlank(msg)) {
                return null;
            }
            Map map = new Gson().fromJson(msg, Map.class);
            String ticket = String.valueOf(map.get("ticket"));
            redisTemplate.opsForValue().set("JFQ_JsApiTicket",ticket,1200, TimeUnit.SECONDS);
            return ticket;
        }else{
            return JsApiTicket.toString();
        }

    }

 

 

 
        

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM