小程序登录解密用户数据encryptedData -41001: encodingAesKey 非法

做小程序微信授权登录遇到的坑,困扰终于解决了

现在分享一下,问题解决思路。

问题:

做小程序微信授权登录,先获取code,然后去获取到session_key和open_id,再拿到encryptedData,传到服务器去解密拿到用户信息,但是有时成功,有时返回-41001错误, 观察日志,都有获取到session_key,这是什么原因造成的,应该怎么去解决呢?

解决方法:

刚开始考虑的方向一直是session_key过期之类的,因为不知道session_key的过期,后经多次试验知道不是此原因导致

然后开始翻阅各种相关博客及搜索相关问题,终没有找到解决方案,可能是出现的这个问题太不应该了,所以这方面的问题并不多

最后开始翻看解密的SDK源码,然后发现-41001是的原因 是验证了session_key的长度

if (strlen($this->sessionKey) != 24) {
 	return ErrorCode::$IllegalAesKey;
}
//public static $IllegalAesKey = -41001;
//>-41001: encodingAesKey 非法

最后又细细去看日志(之前也有详细对比session_key,只是看有值,一大串字符,也不懂其中的深意,就知道有的成功,有的失败,根本找不到规律),留意session_key长度,才看出来其中的猫腻

PHP的json字符串有时候加上反斜杠”\”来转义,PHP处理时需要先去掉反斜杠,然后再json_decode

$str = stripslashes($json); 
$arr = json_decode($str,true);

使用stripslashes()函数,问题解决!

*本是一个小问题,记录下,给自己长个记性

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
由于您没有提供更具体的信息,我无法提供完整的解密代码。但是,以下是一个基本的字节跳动小程序接入示例代码: ```php <?php // 小程序 appid 和 secret $appid = 'your_appid'; $secret = 'your_secret'; // 从前端获取的加密数据和加密向量 $encryptedData = $_POST['encryptedData']; $iv = $_POST['iv']; // 获取 access_token $url = 'https://developer.toutiao.com/api/apps/token'; $params = [ 'appid' => $appid, 'secret' => $secret, 'grant_type' => 'client_credential', ]; $response = json_decode(httpGet($url, $params)); $accessToken = $response->access_token; // 解密数据 $url = 'https://developer.toutiao.com/api/apps/jscode2session'; $params = [ 'appid' => $appid, 'secret' => $secret, 'code' => $_POST['code'], ]; $response = json_decode(httpGet($url, $params)); $sessionKey = $response->session_key; $pc = new Prpcrypt($sessionKey); $result = $pc->decryptData($encryptedData, $iv); $data = json_decode($result); // 处理解密后的数据 // ... // httpGet 函数用于发送 GET 请求 function httpGet($url, $params) { $url .= '?' . http_build_query($params); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($ch); curl_close($ch); return $response; } // Prpcrypt 类用于解密数据 class Prpcrypt { private $key; public function __construct($key) { $this->key = base64_decode($key . '='); } public function decryptData($encryptedData, $iv) { $decrypted = openssl_decrypt( base64_decode($encryptedData), 'AES-128-CBC', $this->key, OPENSSL_RAW_DATA, base64_decode($iv) ); return $decrypted; } } ``` 请注意,上述代码仅用于演示目的,您需要根据自己的实际情况进行调整和修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值