微信openid是表示用户在当前应用中的唯一标识,比如小程序,微信公众号等,这些都算是一个应用。如果有多个应用,同一个用户的openId可能并不相同。
1. 微信小程序登录流程
如下图所示为微信开发者文档中提供的小程序登录流程图

如图中所示,在小程序前端中使用wx.login()获取code后,调用后台程序,由后台再根据appid + appsecret + code继续请求微信接口服务,从而得到openid,并返回给前端。
因为appid和appsecret是小程序的唯一标识,属于绝对私密信息,所以通过后台程序调用微信接口服务就理所应当了。
2. 小程序前端实现
示例
App({
onLaunch: function() {
var self = this;
// 展示本地存储能力
var logs = wx.getStorageSync('logs') || []
logs.unshift(Date.now())
wx.setStorageSync('logs', logs)
// 登录
wx.login({
success: res => {
// 发送 res.code 到后台换取 openId, sessionKey, unionId
var Params = {
code: res.code, //临时登录凭证
};
//生成加密key
wx.request({
url: '', // *********此处填写第三方的接口地址*********
data: '=' + JSON.stringify(Params),
header: {
'content-type': 'application/json'
},
method: 'POST', // OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT
success: function(res) {
var openid = res.data.RntData.openid //返回openid
self.globalData.openid = openid;
console.log(openid);
}
})
}
})
- 调用
wx.login()获取临时登录凭证code,并回传到开发者服务器。 - 接收后台响应结果,并解析获取openid。小程序端与后台交互具体接口可变,此处为一个示例。
3. 小程序后台实现
后台调用auth.code2Session接口,换取用户唯一标识 OpenID、 用户在微信开放平台帐号下的唯一标识UnionID(若当前小程序已绑定到微信开放平台帐号) 和会话密钥 session_key。
查看微信开发者文档中auth.code2Session接口介绍,后台只需要根据appid、appsecret以及前端传入的code组装http get请求访问微信接口服务即可获取openid。
请求url地址:
GET https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code
请求参数
| 属性 | 类型 | 默认值 | 必填 | 说明 |
|---|---|---|---|---|
| appid | string | 是 | 小程序 appId | |
| secret | string | 是 | 小程序 appSecret | |
| js_code | string | 是 | 登录时获取的 code | |
| grant_type | string | 是 | 授权类型,此处只需填写 authorization_code |
返回值
Object类型
返回的 JSON 数据包
| 属性 | 类型 | 说明 |
|---|---|---|
| openid | string | 用户唯一标识 |
| session_key | string | 会话密钥 |
| unionid | string | 用户在开放平台的唯一标识符,若当前小程序已绑定到微信开放平台帐号下会返回,详见 UnionID 机制说明。 |
| errcode | number | 错误码 |
| errmsg | string | 错误信息 |
errcode 的合法值
| 值 | 说明 | 最低版本 |
|---|---|---|
| -1 | 系统繁忙,此时请开发者稍候再试 | |
| 0 | 请求成功 | |
| 40029 | code 无效 | |
| 45011 | 频率限制,每个用户每分钟100次 | |
| 40226 | 高风险等级用户,小程序登录拦截 。风险等级详见用户安全解方案 |
后台具体实现
- 定义微信接口返回数据结构体,用于解析返回
json包
type WxLoginResp struct {
OpenId string `json:"openid,omitempty"`
SessionKey string `json:"session_key,omitempty"`
UnionId string `json:"unionid,omitempty"`
ErrCode int `json:"errcode,omitempty"`
ErrMsg string `json:"errmsg,omitempty"`
}
- 小程序
appid和appsecret属于配置信息,所以定义全局变量保存值,在程序启动时读取配置即可
var (
G_WxliteAppId string
G_WxliteAppSecret string
)
- 获取openid接口具体实现比较简单,按上述请求参数组装发送http get请求
func GetUserWxOpenId(code string) WxLoginResp {
login := WxLoginResp{}
url := "https://api.weixin.qq.com/sns/jscode2session?appid=" + G_WxliteAppId + "&secret=" + G_WxliteAppSecret + "&js_code=" + code + "&grant_type=authorization_code"
resp, err := http.Get(url)
if err != nil {
login.ErrCode = -1
login.ErrMsg = "请求微信失败"
return login
}
defer resp.Body.Close()
content, err := ioutil.ReadAll(resp.Body)
if err != nil {
login.ErrCode = -1
login.ErrMsg = "获取微信应答失败"
return login
}
err = json.Unmarshal(content, &login)
if err != nil {
login.ErrCode = -1
login.ErrMsg = "解析微信应答失败"
return login
}
return login
}
4. 总结
对于微信小程序后台开发,我们首先要参考微信开发者文档服务端相关接口,并按照其提供接口方式对接即可。
获取openid是一个最基础的接口,大部分情况下都会使用,希望本文能给读者起到抛砖引玉作用,谢谢!
本文详细介绍了如何使用Golang开发微信小程序后台,以获取用户唯一标识OpenID。首先,概述了微信小程序的登录流程,接着展示了前端如何获取临时登录凭证code并传递给后台。然后,讲解了后台如何调用微信接口,使用code换取OpenID、session_key及UnionID(如果已绑定微信开放平台)。最后,给出了后台实现的具体步骤,包括请求参数和返回值的解析。通过这个基础教程,有助于理解微信小程序与后台的交互过程。
3万+

被折叠的 条评论
为什么被折叠?



