微信内H5页面自定义标题分享代码实现(含Java生成JS-SDK权限验证的签名)

  1. 绑定域名。先去公众号-公众号设置-功能设置-里填写 JS接口安全域名。H5页面所在域名。

    图片.png

  2. 后台代码:(先获取token,再获取jsapi_ticket,然后生成JS-SDK权限验证的签名


  3. @Log(title = "获取签名", businessType = BusinessType.INSERT)
    @PostMapping("getSignature")
    @ResponseBody
    public ResultData signature(String url) {
        System.out.println(1111111);
        //从redis内获取  如果空说明第一次获取或已过期
        String token = getAccess_token();
        if(StringUtils.isNotEmpty(token)){
            String ticket = getTicket(token);
            Map<String, String> data = new HashMap<>();
            //生成10位时间戳
            long timestamp = System.currentTimeMillis() / 1000;
            data.put("timestamp", String.valueOf(timestamp) );
            //生成随机字符串
            String nonceStr = UuidUtils.randomUUID(5);
            data.put("noncestr", nonceStr );
            data.put("url", url);
            data.put("jsapi_ticket", ticket);
            String signature = null;
            try {
                signature = generateSignature(data);
            } catch (Exception e) {
                e.printStackTrace();
            }
            //签名算法
            String sha1 = SHA1(signature );
            Map<String, Object> map = new HashMap<>(16);
            map.put("appId", "wxa4b94ac01213902d");
            map.put("timestamp", String.valueOf(timestamp));
            map.put("nonceStr", nonceStr);
            map.put("signature", sha1);
            return ResultData.success(map);
        }
        return ResultData.eoror(1,"获取失败!");
    }
    
    /**
     *
     */
    private String getTicket(String token) {
        //请求接口
        String url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token="+token+"&type=jsapi";
        Map<String, String> param = new HashMap<>(16);
            if (StringUtils.isNotBlank(token)) {
                String sendGet =  new RestTemplate().getForObject(url,String.class);
                JSONObject jsonObject = JSON.parseObject(sendGet);
                int errcode = jsonObject.getInteger("errcode");
                String errmsg = jsonObject.getString("errmsg");
                if (errcode == 0 && "ok".equals(errmsg)) {
                    String ticket = jsonObject.getString("ticket");
                    Integer expiresIn = jsonObject.getInteger("expires_in");
                    return ticket;
                }
            }
        return null;
    }
    
    
    
    /**
     *SHA1签名算法
     */
    public static String SHA1(String decript) {
        try {
            MessageDigest digest = java.security.MessageDigest.getInstance("SHA-1");
            digest.update(decript.getBytes());
            byte messageDigest[] = digest.digest();
            // Create Hex String
            StringBuffer hexString = new StringBuffer();
            // 字节数组转换为 十六进制 数
            for (int i = 0; i < messageDigest.length; i++) {
                String shaHex = Integer.toHexString(messageDigest[i] & 0xFF);
                if (shaHex.length() < 2) {
                    hexString.append(0);
                }
                hexString.append(shaHex);
            }
            return hexString.toString();
    
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return "";
    }
    
    
    /**
     * 生成签名
     *
     * @param data 待签名数据
     * @return 签名
     */
    public static String generateSignature(final Map<String, String> data) throws Exception {
        Set<String> keySet = data.keySet();
        String[] keyArray = keySet.toArray(new String[keySet.size()]);
        Arrays.sort(keyArray);
        StringBuilder sb = new StringBuilder();
        for (String k : keyArray) {
            String value = data.get(k).toString();
            if (k.equals("sign")) {
                continue;
            }
            if (value.trim().length() > 0) // 参数值为空,则不参与签名
            {
                sb.append(k).append("=").append(value.trim()).append("&");
            }
        }
        return sb.toString().substring(0,sb.toString().length()-1);
    }
  4. public String getAccess_token() {
            if(restTemplate==null){
                restTemplate = new RestTemplate();
            }
            String appid= "wxa4b94ac01213902d";
            String appsecret = "cd47f2a27c1bbd3d6bba97ce51089d1d";
    
    //        String appid= "wx87865284c2441b1c";
    //        String appsecret = "7ab8d23eccdd40c3eee3070ecf71afcd";
            //获取access_token
            String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential" +
                    "&appid=" + appid + "&secret=" + appsecret;
            String json = restTemplate.getForObject(url, String.class);
            JSONObject myJson = JSONObject.parseObject(json);
            System.out.println("access_token"+myJson.get("access_token").toString());
            return myJson.get("access_token").toString();
    
        }

  5.      微信 JS 接口签名校验工具,点击检验工具与代码生成的签名比对。(在出现签名错误的情况下可用。不过本代码已排除此问题,可忽略)


  6. 前端代码:

  7. //获取微信权限认证
        function getConfig() {
            _$.post({
                url:"获取Ticket的地址",
                async:false,
                data:{
                    url:"你的url地址"
                },
                success:function (res) {
                    if(res.success){
                        var obj = res.info;
                        wxConfig(obj);
                    }
                }
            })
        }
    
    
        function wxConfig(obj) {
            //配置微信
            wx.config({
                debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
                appId: obj.appId, // 必填,公众号的唯一标识
                timestamp: obj.timestamp, // 必填,生成签名的时间戳
                nonceStr: obj.nonceStr, // 必填,生成签名的随机串
                signature: obj.signature,// 必填,签名
                jsApiList: ["jsApi","chooseWXPay","ready"] // 必填,需要使用的JS接口列表
            });
    
        }

    1.生成签名用的url必须是调用JS接口页面的完整URL。

    2.出于安全考虑,开发者必须在服务器端实现签名的逻辑。

本文由站长原创或收集,不代表本站立场,如若转载,请注明出处:http://www.swzhinan.com/?id=309

本文 暂无 评论

回复给

欢迎点评

联系我们

站长QQ:384827360

站长邮件:384827360@qq.com

工作时间:周一至周五,9:30-15:30,节假日休息

QR code