返回

解决微信 SDK 中的“invalid signature”错误:回归传统方法

前端

问题

在使用微信 SDK 时,你可能会遇到“invalid signature”错误。此错误表示 SDK 无法验证请求的签名,这可能是由于以下原因引起的:

  • 时间戳无效
  • nonce 无效
  • URL 无效
  • token 无效

解决方案:使用废弃方法

为了解决此问题,微信官方建议使用废弃的方法getmpjs。该方法已被弃用,但仍然可以用于生成签名。

步骤指南

  1. 获取 AppId 和 AppSecret :从微信开发者平台获取你的 AppId 和 AppSecret。
  2. 生成时间戳和 nonce :生成一个时间戳(当前时间戳)和一个随机 nonce。
  3. 构造原始字符串 :将以下内容连接成一个字符串:
原始字符串 = "jsapi_ticket=" + jsapi_ticket + "&noncestr=" + nonce + "&timestamp=" + timestamp + "&url=" + url

其中:

  • jsapi_ticket:通过getjsapiticket接口获取的票据
  • nonce:随机生成的字符串
  • timestamp:时间戳
  • url:要签名的 URL
  1. 计算签名 :使用 SHA1 算法对原始字符串进行签名。
  2. 构造数据包 :将以下内容组装成一个 JSON 对象:
数据包 = {
  appId: appId,
  nonceStr: nonce,
  timestamp: timestamp,
  url: url,
  signature: 签名
}
  1. 调用废弃方法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}&timestamp=${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”错误。但是,建议在可能的情况下使用新方法,因为它更加安全且可靠。