绑定域名。先去公众号-公众号设置-功能设置-里填写 JS接口安全域名。H5页面所在域名。
后台代码:(先获取token,再获取jsapi_ticket,然后生成JS-SDK权限验证的签名)
@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); }
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(); }
微信 JS 接口签名校验工具,点击检验工具与代码生成的签名比对。(在出现签名错误的情况下可用。不过本代码已排除此问题,可忽略)
前端代码:
//获取微信权限认证 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
本文 暂无 评论