在微信小程序开发中,用户敏感数据(如openid、unionid、手机号等)通常以加密形式返回,开发者需通过后端解密获取明文。本文以C#语言实现微信小程序wx.getUserInfo接口返回的encryptedData解密流程,结合官方加密规范与实际开发经验,提供完整的解决方案。

一、解密核心原理

微信小程序采用AES-128-CBC算法对数据进行加密,关键参数包括:

SessionKey:会话密钥,通过wx.login接口获得临时登录凭证code后调用微信服务器端网址(GET https://api.weixin.qq.com/sns/jscode2session)获取,详细操作请参考官方文档。
IV:初始向量,与加密数据一同返回。
PKCS7填充:数据块不足时填充规则,确保解密后正确去除冗余字节。

二、C#语言版解密代码

以wx.getUserInfo为例,该API可以返回“iv”、“encryptedData”等信息,其中encryptedData为包含有用户openid、unionid等敏感信息的加密数据,也就是需要解密的数据,解密后会返回一个json对象。

/// <summary>解密WxApi获取到的加密数据</summary>
/// <param name="encryptedData">加密数据,如wx.getUserInfo获取的encryptedData对象</param>
/// <param name="iv">加密算法的初始向量,如wx.getUserInfo获取的iv对象</param>
/// <param name="sessionKey">session_key,通过wx.login获取登录凭证后调用微信服务器端网址(GET https://api.weixin.qq.com/sns/jscode2session)获取</param>
/// <returns>文本格式的json对象</returns>

public string DecryptWx(string encryptedData,string iv,string sessionKey) {
    byte[] encryptedDataBytes = Convert.FromBase64String(encryptedData);
    byte[] keyBytes = Convert.FromBase64String(sessionKey);
    byte[] ivBytes = Convert.FromBase64String(iv);
    using (Aes aes = Aes.Create()) {
        aes.Key = keyBytes;
        aes.IV = ivBytes;
        aes.Mode = CipherMode.CBC;
        aes.Padding = PaddingMode.PKCS7;
        using (ICryptoTransform decryptor = aes.CreateDecryptor()) {
            try{
                byte[] decryptedBytes = decryptor.TransformFinalBlock(encryptedDataBytes, 0, encryptedDataBytes.Length);
                return Encoding.UTF8.GetString(decryptedBytes);
            } catch {
                return "";
            }
        }
    }
}

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐