今天对接公众号,一直提示我签名有问题!但是我的签名和官方生成的签名一致,下面是对应数据比对
我的签名
微信官方提供签名
经过比对,两者是一致的,但是,就是一直提示错误! 后面是解决思路:
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=====")
});
},