一、出错说明
错误内容: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#调用微信内容安全接口
来源:oschina
链接:https://my.oschina.net/tianma3798/blog/3194792