用AI赚第一桶💰低成本搭建一套AI赚钱工具,源码可二开。 广告
``` https://www.imooc.com/wenda/detail/518810 借鉴该讲解 ``` ``` 偶尔失败的情况,很大可能是wx.getUserInfo和wx.login的顺序弄错了。 正常的流程,wx.login拿到code =》 wx.getUserInfo拿到iv和encryptedData =》 发送给服务器解密 很容易错写成在wx.getUserInfo的回调里再调wx.login拿code再发送给服务器,这样,getUserInfo里的data加密用的session\_key就有可能跟解密的时候的session\_key不一致,因为wx.login有可能会刷新了session\_key 解决: 保证userinfo总是在最后的一次login之后发起 ``` ``` bindGetUserInfo: function(n) { console.log(n) wx.showLoading({ title: "加载中" }), wx.login({ success: function(i) { console.log(i) app.network.request1({ url: "wxapp/login", method: "POST", data: { code: i.code, }, success: function(i) { console.log(i) if (i.data.error == 0) { wx.getUserInfo({ success: (ress) => { app.network.request1({ url: "wxapp/auth", method: "GET", data: { data: ress.encryptedData, iv: ress.iv, sessionKey: i.data.session_key }, success: function(res) { console.log(res) if (res.data.error == 0) { wx.setStorageSync('userinfo_openid', i.data.openid); wx.setStorageSync('login_session_key', i.data.session_key); wx.setStorageSync('userinfo_id', res.data.id) wx.navigateBack({ delta: 0, }) } else { wx.showToast({ icon: "none", title: res.data.message, }) } } }) } }) } else { wx.showToast({ icon: "none", title: "获取用户登录态失败", }) } } }) }, fail: function() { o.alert("获取用户信息失败!"); }, complete: function() { wx.hideLoading(); } }); }, ``` ![](https://img.kancloud.cn/fb/5f/fb5fdfc23dca8b566a9693b2bd7a44e5_500x413.jpg) 后端就使用官方的解密就行 ``` <?php require_once EWEI_SHOPV2_PLUGIN . "app/core/wxapp/pkcs7Encoder.php"; /** * 对微信小程序用户加密数据的解密示例代码. * * @copyright Copyright (c) 1998-2014 Tencent Inc. */ class WXBizDataCrypt { private $appid = NULL; private $sessionKey = NULL; /** * 构造函数 * @param $sessionKey string 用户在小程序登录后获取的会话密钥 * @param $appid string 小程序的appid */ public function WXBizDataCrypt($appid, $sessionKey) { $this->sessionKey = $sessionKey; $this->appid = $appid; } /** * 解密处理 * @param $encryptedData * @param $iv * @param $data * @return int|string */ public function decryptData( $encryptedData, $iv, &$data ) { if (strlen($this->sessionKey) != 24) { return ErrorCode::$IllegalAesKey; } $aesKey = base64_decode($this->sessionKey); if (strlen($iv) != 24) { return ErrorCode::$IllegalIv; } $aesIV = base64_decode($iv); $aesCipher = base64_decode($encryptedData); $result=openssl_decrypt( $aesCipher, "AES-128-CBC", $aesKey, 1, $aesIV); $dataObj=json_decode($result); if ($dataObj == NULL) { return ErrorCode::$IllegalBuffer; } if ($dataObj->watermark->appid != $this->appid) { return ErrorCode::$IllegalBuffer; } $data = $result; return ErrorCode::$OK; } } ?> ```