当前位置 主页 > 网站技术 > 代码类 >

    .Net之微信小程序获取用户UnionID的实现(2)

    栏目:代码类 时间:2019-09-11 14:31

    .Net WebApi 解密数据接口:

    /// <summary>  /// 解密微信对称加密数据,获取用户联合运营编号  /// </summary>  /// <param name="sessionKey">临时会话秘钥</param>  /// <param name="encryptedData">微信用户敏感加密数据</param>  /// <param name="iv">解密初始向量</param>  /// <returns></returns>  [HttpGet]  public IHttpActionResult DecryptSensitiveData(string sessionKey,string encryptedData,string iv)  {   try   {    var getUnionId=DecryptByAesBytes(encryptedData, sessionKey, iv);    return Json(new { code =1, msg="解密成功",result= getUnionId });   }   catch (Exception ex)   {    return Json(new { code = 0, msg = "解密失败,原因:"+ex.Message });   }  }  #region AES对称解密  /// <summary>  /// AES解密  /// </summary>  /// <param name="encryptedData">待解密的字节数组</param>  /// <param name="sessionKey">解密密钥字节数组</param>  /// <param name="iv">IV初始化向量字节数组</param>  /// <param name="cipher">运算模式</param>  /// <param name="padding">填充模式</param>  /// <returns></returns>  private static string DecryptByAesBytes(string encryptedData, string sessionKey, string iv)  {   try   {    //非空验证    if (!string.IsNullOrWhiteSpace(encryptedData) && !string.IsNullOrWhiteSpace(sessionKey) && !string.IsNullOrWhiteSpace(iv))    {     var decryptBytes = Convert.FromBase64String(encryptedData.Replace(' ', '+'));     var keyBytes = Convert.FromBase64String(sessionKey.Replace(' ', '+'));     var ivBytes = Convert.FromBase64String(iv.Replace(' ', '+'));     var aes = new AesCryptoServiceProvider     {      Key = keyBytes,      IV = ivBytes,      Mode = CipherMode.CBC,      Padding = PaddingMode.PKCS7     };     var outputBytes = aes.CreateDecryptor().TransformFinalBlock(decryptBytes, 0, decryptBytes.Length);     var decryptResult = Encoding.UTF8.GetString(outputBytes);     dynamic decryptData = JsonConvert.DeserializeObject(decryptResult, new { unionid = "" }.GetType());     JJHL.Utility.Loghelper.WriteLog("AES对称解密结果为:" + decryptResult);     return decryptData.unionid;    }    else    {     return "";    }   }   catch (Exception e)   {    JJHL.Utility.Loghelper.WriteLog("AES对称解密失败原因:" + e.Message);    return "";   }  }  #endregion

    所遇异常:参数使用Convert.FromBase64String转化时,提示“Base-64字符数组的无效长度” 的问题:

    原因:加密参数中的"+"通过地址栏传过来时,后台会解析为空格(遇到的概率比较小)。

    解决:最好的做法是 使用encryptedData.Replace("+", "%2B")先将空格编码,然后再作为参数传给另一页面传递,这样页面在提取参数时才会将“%2B”解码为加号.但这儿为了简化,将空格直接还原为"+"或者是直接在后台将空格替换为“+”encryptedData.Replace(' ', '+');

    直接通过wx.login+code2Session获取到该用户 UnionID:

    其实这个方式就是实现了小程序的登录流程,微信官方详细说明:

    https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html