今天有个需求,就是获取微信小程序里面用户的信息
一、首先说下背景知识:
unionid来区分用户的唯一性,在相同微信开放平台帐号下的移动应用、网站应用、小程序、公众号,用户的unionid是唯一的。也就是说,同一用户,对同一个微信开放平台下的不同应用,unionid是相同的。
OpenId是用来区分应用的唯一性,在相同微信开放平台账号下不用的应用,其unionid相同,OpenId而不同,比如说同一个微信开放平台绑定了多个小程序应用,每个应用的OpenId是不相同。
unionid是你的身份证号,openid是你的学号、工号啥的
二、然后通过前端传来的encryptedData、iv、code来获取session_key,再由encryptedData、iv、session_key获取unionid:
func QuestionUser(c *ix.Context) {
encryptedData := c.FormValue("encryptedData")//encryptedData为包括敏感数据在内的完整用户信息的加密数据
iv := c.FormValue("iv")//加密算法的初始向量
code := c.FormValue("code")//js_code 登录时获取的 code
appID:="x"
secret:="x"
url := "https://api.weixin.qq.com/sns/jscode2session?appid="+appID+"&secret="+secret+"&js_code="+key+"&grant_type=authorization_code"
resp, _ := http.Get(url)
defer resp.Body.Close()
body, err1 := ioutil.ReadAll(resp.Body)
if err1 != nil {
c.JSONError(err1)
return
}
m := map[string]string{}
json.Unmarshal(body, &m)
src, err2 := tools.Dncrypt(encryptedData, m["session_key"], iv)
if err2 != nil {
c.JSONError(err2)
return
}
var s = map[string]interface{}{}
json.Unmarshal([]byte(src), &s)
fmt.Println(src)
fmt.Println(s["unionId"])
}
func Dncrypt(rawData, key, iv string) (string, error) {
data, err := base64.StdEncoding.DecodeString(rawData)
key_b, err_1 := base64.StdEncoding.DecodeString(key)
iv_b, _ := base64.StdEncoding.DecodeString(iv)
if err != nil {
return "", err
}
if err_1 != nil {
return "", err_1
}
dnData, err := AesCBCDncrypt(data, key_b, iv_b)
if err != nil {
return "", err
}
return string(dnData), nil
}
// 解密
func AesCBCDncrypt(encryptData, key, iv []byte) ([]byte, error) {
block, err := aes.NewCipher(key)
if err != nil {
panic(err)
}
blockSize := block.BlockSize()
if len(encryptData) < blockSize {
panic("ciphertext too short")
}
if len(encryptData)%blockSize != 0 {
panic("ciphertext is not a multiple of the block size")
}
mode := cipher.NewCBCDecrypter(block, iv)
mode.CryptBlocks(encryptData, encryptData)
// 解填充
encryptData = PKCS7UnPadding(encryptData)
return encryptData, nil
}
//去除填充
func PKCS7UnPadding(origData []byte) []byte {
length := len(origData)
unpadding := int(origData[length-1])
return origData[:(length - unpadding)]
}