Error: Illegal Buffer 微信小程序服务器获取用户信息,encryptedData解密失败​

本文解析了微信小程序中调用wx.login()前调用wx.getUserInfo()导致的session_key更新问题,阐述了前后调用顺序不当如何引发后台解密错误,以及如何避免IllegalBuffer异常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

导致问题的原因是session_key没有及时更新
在调用wx.login()之前调用了wx.getUserInfo(),在调用getUserInfo()时将获取到 iv 和encryptedData 传给后台,而后调用login(),此时的session_key可能会被新的session_key覆盖,就会导致后台在对数据解密时使用新的session_key去解密旧的encryptedData,如此就会Illegal Buffer报错。

### 如何在微信小程序中正确解密用户手机号 为了实现微信小程序中用户手机号的解密,在客户端和服务端均需执行特定的操作。具体而言,当用户同意提供其电话号码时,会触发一系列流程来安全地传输和解码该敏感数据。 #### 客户端操作 在前端部分,开发者应调用微信提供的`getPhoneNumber`接口以发起请求,此过程将返回加密后的字符串给到应用服务器[^2]: ```javascript // 调用获取手机号API wx.getPhoneNumber({ success(res) { console.log('Encrypted Data:', res.encryptedData); console.log('IV:', res.iv); // 将 encryptedData 和 iv 发送到服务端进行解密处理 wx.request({ url: 'https://yourserver.com/decryptPhone', // 替换成实际的服务端地址 method: "POST", data: { encryptedData: res.encryptedData, iv: res.iv }, success(response){ console.log("Decrypted Phone Number:", response.data.phoneNumber); } }); } }); ``` #### 服务端逻辑 对于后端来说,则要利用从微信公众平台获得的应用凭证(appid, appsecret),以及通过上述方法接收到的参数(encrypted_data, iv),再配合官方给出的算法完成最终的信息还原工作。这里展示了一个基于PHP语言的例子: ```php <?php class WXBizDataCrypt { private $sessionKey; public function __construct($appid, $sessionKey) { $this->appid = $appid; $this->sessionKey = $sessionKey; } /** * 检查 AES 密钥长度是否合法. */ private function validateKeyLength() { if (strlen(base64_decode($this->sessionKey)) != 32) { throw new Exception("Illegal Key length"); } } /** * 对称解密. */ public function decryptData($encryptedData, $iv) { try { $this->validateKeyLength(); $aesCipher = base64_decode($encryptedData); $aesKey = base64_decode($this->sessionKey); $aesIv = base64_decode($result = openssl_decrypt( $aesCipher, 'AES-128-CBC', $aesKey, OPENSSL_RAW_DATA, $aesIv ); $dataObj = json_decode($result); if ($dataObj === null || !isset($dataObj->watermark) || $dataObj->watermark->appid !== $this->appid) { return false; } else { return [ 'phoneNumber' => $dataObj->purePhoneNumber ?? '', 'countryCode' => $dataObj->countryCode ?? '' ]; } } catch (\Exception $e) { return false; } } ?> ``` 以上即为完整的微信小程序获取解密用户手机号的过程描述及相应代码片段。值得注意的是,整个过程中涉及到的安全机制非常重要,因此务必严格按照文档指引实施,并妥善保管所有涉及隐私保护的关键资料。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值