今天对接公众号,一直提示我签名有问题!但是我的签名和官方生成的签名一致,下面是对应数据比对
我的签名
微信官方提供签名
经过比对,两者是一致的,但是,就是一直提示错误! 后面是解决思路:
1、首先是需要在公众号管理平台配置对应服务器信息,包含白名单,回调地址等等;看图:
说明:这里的.txt文件,如果你的服务重新发布了,然后恰巧你的文件夹被替换掉了,此时需要重新上传一下哦
以上配置完成之后,就是写接口啦;看官方文档就行;
下面是我的后端代码
/** * 获取微信签名 * * @param url * @return */ @GetMapping("getJsSdkSign") public AjaxResult getJsSdkSign(String url) { return wechatOpenService.getJsSdkSign(url); }
/** * 获取微信签名 * * @param url * @return */ @Override public AjaxResult getJsSdkSign(String url) { try { url = new URI(url).getPath(); } catch (URISyntaxException e) { throw new RuntimeException(e); } AjaxResult result = new AjaxResult(); String token = this.getToken(); GetAccreditReq req = new GetAccreditReq(); String nonceStr = UUID.randomUUID().toString(); String timestamp = (System.currentTimeMillis() / 1000) + ""; req.setToken(token); String content = "jsapi_ticket=" + this.getTicket(req) + "&noncestr=" + nonceStr + "×tamp=" + timestamp + "&url=" + url; logger.info(String.format("获取微信签名-加密之前信息:%s", content)); String signature = null; try { MessageDigest md = MessageDigest.getInstance("SHA-1"); byte[] digest = md.digest(content.getBytes()); signature = byteToStr(digest); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } String s = signature.toLowerCase(); result.put("timestamp", timestamp); result.put("nonceStr", nonceStr); result.put("signature", s); result.put("url", url); logger.info(String.format("获取微信签名-加密之后信息:%s", s)); return result; } public static String byteToStr(byte[] byteArray) { String strDigest = ""; for (int i = 0; i < byteArray.length; i++) { strDigest += byteToHexStr(byteArray[i]); } return strDigest; } public static String byteToHexStr(byte mByte) { char[] Digit = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; char[] tempArr = new char[2]; tempArr[0] = Digit[(mByte >>> 4) & 0X0F]; tempArr[1] = Digit[mByte & 0X0F]; String s = new String(tempArr); return s; }
前端代码
import wx from 'weixin-js-sdk' getWeChat() { var url = encodeURIComponent(window.location.href.split("#")[0]); axios.get(process.env.VUE_APP_BASE_API + "/wechatOpen/getJsSdkSign", { params: { url: url } }).then(res => { console.log("/wechatOpen/getJsSdkSign", res) wx.config({ debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId: 'xxxxxxx', // 必填,公众号的唯一标识 timestamp: res.data.timestamp, // 必填,生成签名的时间戳 nonceStr: res.data.nonceStr, // 必填,生成签名的随机串 signature: res.data.signature, // 必填,签名 jsApiList: [ 'closeWindow', 'scanQRCode', 'chooseWXPay', 'openProductSpecificView', 'addCard', 'chooseCard', 'openCard' ] // 必填,需要使用的JS接口列表 这里填写需要用到的微信api openlocation为使用微信内置地图查看位置接口,其中关闭浏览器的接口closeWindow(),也需要写在这个列表里面 }); }) wx.ready(function() { //当页面加载完成时就需要调用的一些api需要写在ready里面,例如addCard,分享等。 console.log("=====ready=====") }); wx.error(function(res) { //微信api调用失败的回调函数 console.log(res); console.log("=====error=====") }); },