返回
解决微信 SDK 中的“invalid signature”错误:回归传统方法
前端
2024-02-15 17:47:51
问题
在使用微信 SDK 时,你可能会遇到“invalid signature”错误。此错误表示 SDK 无法验证请求的签名,这可能是由于以下原因引起的:
- 时间戳无效
- nonce 无效
- URL 无效
- token 无效
解决方案:使用废弃方法
为了解决此问题,微信官方建议使用废弃的方法getmpjs
。该方法已被弃用,但仍然可以用于生成签名。
步骤指南
- 获取 AppId 和 AppSecret :从微信开发者平台获取你的 AppId 和 AppSecret。
- 生成时间戳和 nonce :生成一个时间戳(当前时间戳)和一个随机 nonce。
- 构造原始字符串 :将以下内容连接成一个字符串:
原始字符串 = "jsapi_ticket=" + jsapi_ticket + "&noncestr=" + nonce + "×tamp=" + timestamp + "&url=" + url
其中:
jsapi_ticket
:通过getjsapiticket
接口获取的票据nonce
:随机生成的字符串timestamp
:时间戳url
:要签名的 URL
- 计算签名 :使用 SHA1 算法对原始字符串进行签名。
- 构造数据包 :将以下内容组装成一个 JSON 对象:
数据包 = {
appId: appId,
nonceStr: nonce,
timestamp: timestamp,
url: url,
signature: 签名
}
- 调用废弃方法
getmpjs
:使用getmpjs
方法来生成配置签名。
wx.config(dataPackage);
示例代码
// 获取 AppId 和 AppSecret
const appId = '你的 AppId';
const appSecret = '你的 AppSecret';
// 获取 jsapi_ticket
const jsapi_ticket = await getjsapiticket(appId, appSecret);
// 生成时间戳和 nonce
const timestamp = new Date().getTime();
const nonce = createNonceStr();
// 构造原始字符串
const rawString = `jsapi_ticket=${jsapi_ticket}&noncestr=${nonce}×tamp=${timestamp}&url=${window.location.href}`;
// 计算签名
const signature = sha1(rawString);
// 构造数据包
const dataPackage = {
appId,
nonceStr: nonce,
timestamp,
url: window.location.href,
signature
};
// 调用废弃方法 getmpjs
wx.config(dataPackage);
注意:
- 确保使用正确的
jsapi_ticket
,它应该每隔一段时间就更新一次。 - 使用
getmpjs
方法可能会导致安全性问题,因为它不再受微信官方支持。
结论
使用废弃方法getmpjs
可以解决微信 SDK 中的“invalid signature”错误。但是,建议在可能的情况下使用新方法,因为它更加安全且可靠。