鼓捣了一整天获取用户encryptKey(getUserEncryptKey)这个接口,期间遇到了特别多的问题,官方的文档写的非常的不明不白……
第一个坑:
“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 也不行!如果加上了诸如 {} 之类的内容,不管你的签名对不对,这个接口都会报这个错误,可以说是非常的误导人了……