二维码扫码后得到一个base64编码后的buffer,按base64解码后的二进制数据定义如下:
1 Byte | 1 Byte | 8 Bytes | 1 Byte | state_len(0~16) Bytes | 64 Bytes |
---|---|---|---|---|---|
version | type | openvid | state_len | state | sign |
参数说明:
参数名 | 含义 |
---|---|
version | 数据格式版本号,目前固定是0x01 |
type | 签名类型, 0表示是员工, 1表示是访客, 访客二维码固定为 1 |
openvid | 成员id,为64位无符号整数, 唯一代表一个访客,设备通过“拉取访客列表”获取访客数据时包含该id |
state_len | state参数的长度, 最长为16字节 |
state | 透传参数, 可以由应用方通过获取访客签名指定 |
sign | 签名 |
签名算法暂定用椭圆曲线非对称加密算法(ECDSA),选取的椭圆曲线为NID_X9_62_prime256v1。
包体签名:
Sign = ECDSA(SHA256(join(version,type,openvid,state_len,state)))
私钥由企业微信保管,设备使用公钥(全量拉取用户数据或增量拉取用户数据的pub_key)验证即可。
注:
1、 join的含义是将version,type,openvid,state_len,state(如有)对应的数值依次拼接在一起。
2、 SHA256,ECDSA分别是一种哈希算法和非对称加密算法,实现方可以根据自己开发语言找一下现有的成熟算法库。
3、验证签名时,先对签名使用公钥解密,随后计算SHA256摘要是否一致。