V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
工单节点使用指南
• 请用平和的语言准确描述你所遇到的问题
• 厂商的技术支持和你一样也是有喜怒哀乐的普通人类,尊重是相互的
• 如果是关于 V2EX 本身的问题反馈,请使用 反馈 节点
KomeijiSatori
V2EX  ›  全球工单系统

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

  •  
  •   KomeijiSatori · 2018-06-26 18:43:52 +08:00 · 5576 次点击
    这是一个创建于 2102 天前的主题,其中的信息可能已经有所发展或是发生改变。

    根据 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

    6 条回复    2019-01-08 12:01:00 +08:00
    KomeijiSatori
        1
    KomeijiSatori  
    OP
       2018-06-26 18:54:43 +08:00
    sommer
        2
    sommer  
       2018-06-26 19:02:06 +08:00
    解密时用的 session_key 必须是你最新的 session_key。
    你拿到加密数据之后,又调 wx.login 刷新了 session_key,解密不失败才怪...
    KomeijiSatori
        3
    KomeijiSatori  
    OP
       2018-06-26 19:02:51 +08:00
    @sommer 是随机性出现这个问题
    sommer
        4
    sommer  
       2018-06-26 19:03:32 +08:00   ❤️ 1
    我好像没说明白。
    解密时用的 session_key 必须与获取加密数据时的 session_key 一致。

    所以你需要在获取 userinfo 之前,调用 wx.login.
    whitepoppy
        5
    whitepoppy  
       2018-06-27 09:08:48 +08:00
    不会出问题的 不过需要解密 4 次还是 3 次 session_key 也是解密用到的 非常恶心
    vishun
        6
    vishun  
       2019-01-08 12:01:00 +08:00
    我也遇到了,这你妹的微信的这个整个逻辑就是冲突的,正常来说用户点击登陆,然后我通过 wx.login 先获取 openid,然后判定是否可以直接登录,不能的话看能不能有 unionid,如果有,则说明开放平台绑定了账号,合并账号,如果不返回 unionid,则需要解密查看 unionid,但此时由于 wx.login 刷新了 session_key,导致解密失败了。
    这说明微信是要我们在用户点登录按钮前,就需要先请求 wx.login。整个逻辑都要重新修改了,或者在 wx.login 下再次请求 getUserSetting 方法。有些坑爹啊
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5286 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 08:16 · PVG 16:16 · LAX 01:16 · JFK 04:16
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.