小程序获取授权手机号错误,无法被移除错误 Padding is invalid and cannot be removed

原创
2020/03/14 15:10
阅读数 1.5K

一、出错说明

错误内容:Padding is invalid and cannot be removed

其次说一下为什么会第一次或间断性解密失败?

我开始的微信小程序代码 button 点击 -> 得到 iv,encryptedData -> wx.login -> 得到 code -> code,iv,encryptedData 发送服务器 -> 然后 code 得到 session_key  然后解密,

问题出在哪里呢,就出在点击 button 的地方,没有 wx.login 得到code 的时候,iv和encryptedData 就已存在一个session_key ,和之后得到的session_key 就不同了,

所以

在点击“获取信息”按钮 之前就应该先使用wx.login 得到code或者session_key,然后 点击 按钮 ,所以 在 onload 或者 onshow 里面 就应该 wx.login 得到 code或者 session_key

 

二、获取手机号接口调用解决方案:

1.在小程序 onload中 使用wx.login 获取code

2.在getphonenumber 事件中 获取iv,encryptedData 以及 code 的值去后台调用解密处理

3.在 后台相应成功后,调用 wx.login刷新code

小程序端代码:

1.onload 中

      wx.login({
        success(res) {
          _this.data.loginCode = res.code;
        }
      })

2. getphonenumber事件

  // 授权电话
  getPhoneNumber: function (e) {
    var _this = this;
    var encryptedData = e.detail.encryptedData;
    var iv = e.detail.iv;
    account.getPhone(_this.data.loginCode, encryptedData, iv, data => {
      if (data.length == 11) {
        _this.setData({
          ['info.mobile']: data
        })
      } else {
        wx.showToast({
          title: '手机号有误',
        })
      }
      wx.login({
        success(res) {
          _this.data.loginCode = res.code;
        }
      })
    })
  },

后台解密代码: 

/// <summary>
/// 解密手机号
/// </summary>
/// <returns></returns>
public string GetPhone(string code,
    string encryptedData, string iv)
{
    try
    {
        ConfigInfo info = ConfigInfo.GetConfig();
        string url = string.Format($"https://api.weixin.qq.com/sns/jscode2session?appid={info.AppID}&secret={info.AppSecret}&js_code={code}&grant_type=authorization_code");
        string str = NetHelper.Get(url);
        if (str.Contains("invalid code"))
            throw new Exception("code失效");

        JObject jobj = JObject.Parse(str);
        string sessionKey = jobj.SelectToken("session_key").ToString();
        if (string.IsNullOrEmpty(sessionKey))
            throw new Exception("获取session_key失败");
        AESHelper.AesIV = iv;
        AESHelper.AesKey = sessionKey;

        string result = AESHelper.AESDecrypt(encryptedData);
        //解析修改会员的手机号
        JObject json = JObject.Parse(result);
        string pureNumber = json.SelectToken("purePhoneNumber").ToString();
        //return result;
        return pureNumber;
    }
    catch (Exception ex)
    {
        return "授权失败:" + ex.Message;
    }
}

 

三、C# DES解密处理参考:

https://blog.csdn.net/u011127019/article/details/79638279

 

更多:

C# 调用imgSecCheck示例/ C#调用微信内容安全接口

微信小程序判断消息是否已经订阅?订阅消息使用

微信小程序播放视频卡顿问题

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部