前言
做微信小程序时,我们需要用户授权登录获取用户的相关数据,如果涉及到隐私数据,需要服务端通过rawData 和 session_key 生成 signature 签名,从而校验数据的准确性
rawData
rawData 由前端传到后端,包含用户的信息等数据
session_key
session_key 是服务器在通过code向微信请求回来的数据,会话密钥 session_key 是对用户数据进行 加密签名 的密钥。为了应用自身的数据安全,开发者服务器不应该把会话密钥下发到小程序,也不应该对外提供这个密钥
signature 签名
signature 签名一个是微信返回前端,一个是后端通过 rawData 和 session_key 生成,通过比对两个signature 签名是否一致从而判定请求是否正确
- 通过调用接口(如 wx.getUserInfo)获取数据时,接口会同时返回 rawData、signature,其中 signature = sha1( rawData + session_key )
- 开发者将 signature、rawData 发送到开发者服务器进行校验。服务器利用用户对应的 session_key 使用相同的算法计算出签名 signature2 ,比对 signature 与 signature2 即可校验数据的完整性。
后端生成 signature 算法如下
1 | public static String getsignature2(String rawData, String sessionKey) throws UnsupportedEncodingException, NoSuchAlgorithmException { |
避坑
上述代码就实现了这个过程,其中有个坑,digest.update(stringASCII.getBytes(“UTF-8”)); 该行代码我们指定了编码格式,这在idea上面运行是没有问题的,因为idea的编码格式我们平时也是指定的utf-8,但是当项目部署到tomcat上后,会出现获取到的 signature 和前端传过来的 signature 不一致,导致数据检验不通过,原因就是tomcat默认的编码格式是GBK,我们需要手动更改tomcat的编码格式
解决办法
打开tomcat里conf 下 的server.xml文件,在 下面图中的位置添加 URIEncoding=”UTF-8” 编码格式即可,如下图
结语
至此,微信小程序生成签名完成