根据 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
1
KomeijiSatori OP |
2
sommer 2018-06-26 19:02:06 +08:00
解密时用的 session_key 必须是你最新的 session_key。
你拿到加密数据之后,又调 wx.login 刷新了 session_key,解密不失败才怪... |
3
KomeijiSatori OP @sommer 是随机性出现这个问题
|
4
sommer 2018-06-26 19:03:32 +08:00 1
我好像没说明白。
解密时用的 session_key 必须与获取加密数据时的 session_key 一致。 所以你需要在获取 userinfo 之前,调用 wx.login. |
5
whitepoppy 2018-06-27 09:08:48 +08:00
不会出问题的 不过需要解密 4 次还是 3 次 session_key 也是解密用到的 非常恶心
|
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 方法。有些坑爹啊 |