开发日记之golang微信小程序获取unionid

今天有个需求,就是获取微信小程序里面用户的信息

一、首先说下背景知识:

  1. session_key(会话密匙)和openid(用户唯一标识)具有一次性

  2. UnionID机制说明

unionid来区分用户的唯一性,在相同微信开放平台帐号下的移动应用、网站应用、小程序、公众号,用户的unionid是唯一的。也就是说,同一用户,对同一个微信开放平台下的不同应用,unionid是相同的。

  1. OpenID机制说明

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)]
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值