获取用户encryptKey(getUserEncryptKey)接口调试心得
发布于 2 年前 作者 yonghe 4109 次浏览 来自 分享

鼓捣了一整天获取用户encryptKey(getUserEncryptKey)这个接口,期间遇到了特别多的问题,官方的文档写的非常的不明不白……

官方文档:https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/user-info/internet/getUserEncryptKey.html

第一个坑:

 “errcode”: 40003,“errmsg”: “invalid openid”

出现这个坑,主要就是这个接口,它的所有参数都是写在 query 上的,也就是说所有参数都是 URL 参数,非 Body 参数!

虽然它是 POST 请求,但是构造请求的时候要按照 GET 请求的方式构造。

其实官方的另一篇文章也提到了这一点,只是一般情况下我们都不会看它:https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/user-encryptkey.html

服务端调用示例

curl -X POST "https://api.weixin.qq.com/wxa/business/getuserencryptkey?access_token=ACCESS_TOKEN&openid=OPENID&signature=SIGNATURE&sig_method=hmac_sha256"

这里已经提示了如何发送这个请求。

第二个坑:

怎么签名?

官方文档上是这么说的:

用sessionkey对空字符串签名得到的结果。session_key可通过code2Session接口获得

也就是说,我们需要通过code2session这个接口,拿到session_key之后,用HmacSHA256方法,以session_key为key,对空字符串进行签名后,以Hex字符串(大小写均可)的形式输出。

例如下面这个Node.JS示例:

crypto.createHmac('sha256', session_key).update('').digest('hex')

第三个坑:

“errcode”: 87009,“errmsg”: “invalid signature”

确认下session_key有没有过期,如果没有过期的话,那可能就是我碰到的坑了。

这个接口虽然是 POST 请求,但是不能够带任何 Body 参数!哪怕是空的 JSON 也不行!如果加上了诸如 {} 之类的内容,不管你的签名对不对,这个接口都会报这个错误,可以说是非常的误导人了……

回到顶部