微信小程序 wx.getUserInfo 接口返回的 encryptData 解密数据有问题

2018-06-26 18:43:52 +08:00
 KomeijiSatori

根据 wx.login 返回的 code 请求到 session_key

和 wx.getUserInfo 返回的 encryptedData 和 iv 进行解密运算之后

openssl_decrypt 返回了 null

请求内容

{
    "code":-5,
    "exception":{
        "wx_response_data":{
            "session_key":"59zDUzb7x6/g1bX80fpvYw==",
            "openid":"oL61M5ck5nx5Qy_utiprs-ctP5Hs"
        },
        "wx_code":"033WNvnZ0VET102msJlZ0VfInZ0WNvnc",
        "raw":{
            "encryptData":"3+1Fs839g3x8TP25KtIoIB1EhyEhx6iGufHdzx6ocxLbxgbbApzsnEVP5eTsVItdMUkdz9PVXJVPTGqf3x6RgLZfZM1jKfgMO6h0PJg7/103ZfwIJbyJosmGtO32lpxu6JwlglYNz+LB+oUHeyYZVWeDIeZlzgcAnDwseuu0wnGnqyKmCxxqKJj2FFZsyLBHvjNsrHEnVM+3sMX1UGatrkpdfcAHg5KvxwV7lXK6H4gMyy6a6vKq7hR8310Rk1AnFCMKDrJkcxTj4fXRXXwp2TZrWQi2WCWBSacqfDWsiCBpLn4oh/CzQDRJa4vNuGCpQz7XKbV3nS/Op4DxWenX453HUKkZBXbdJMMzylKXgR3OnyLv70O06FvKtNH9pRUWOgex7TYhHYSuNhvyrbWOy4TDl9ew4tev5/NAdq/wbYSScfFRCb9v9PO89L/OkTkJCVPMSEStHs1N33RuMmom0UkIaP7cP5QvgMycD9/akSo=",
            "iv":"cs6YpTkzdu+EbLoGOOCxVQ=="
        }
    }
}

解密函数是这样的

public function WXDecrypt($encryptKey, $iv, $encryptStr)  {
        $decryptData = \openssl_decrypt(
            base64_decode($encryptStr),
            'AES-128-CBC',
            base64_decode($encryptKey),
            OPENSSL_RAW_DATA,
            base64_decode($iv)
        );
        return json_decode($decryptData, true);
}

小程序端代码

https://gist.github.com/Caringor/7fdf75db64819bdcef9dab6360e7dada.js

5606 次点击
所在节点    全球工单系统
6 条回复
KomeijiSatori
2018-06-26 18:54:43 +08:00
sommer
2018-06-26 19:02:06 +08:00
解密时用的 session_key 必须是你最新的 session_key。
你拿到加密数据之后,又调 wx.login 刷新了 session_key,解密不失败才怪...
KomeijiSatori
2018-06-26 19:02:51 +08:00
@sommer 是随机性出现这个问题
sommer
2018-06-26 19:03:32 +08:00
我好像没说明白。
解密时用的 session_key 必须与获取加密数据时的 session_key 一致。

所以你需要在获取 userinfo 之前,调用 wx.login.
whitepoppy
2018-06-27 09:08:48 +08:00
不会出问题的 不过需要解密 4 次还是 3 次 session_key 也是解密用到的 非常恶心
vishun
2019-01-08 12:01:00 +08:00
我也遇到了,这你妹的微信的这个整个逻辑就是冲突的,正常来说用户点击登陆,然后我通过 wx.login 先获取 openid,然后判定是否可以直接登录,不能的话看能不能有 unionid,如果有,则说明开放平台绑定了账号,合并账号,如果不返回 unionid,则需要解密查看 unionid,但此时由于 wx.login 刷新了 session_key,导致解密失败了。
这说明微信是要我们在用户点登录按钮前,就需要先请求 wx.login。整个逻辑都要重新修改了,或者在 wx.login 下再次请求 getUserSetting 方法。有些坑爹啊

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/466051

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX