golang开发微信小程序后台获取openid

本文详细介绍了如何使用Golang开发微信小程序后台,以获取用户唯一标识OpenID。首先,概述了微信小程序的登录流程,接着展示了前端如何获取临时登录凭证code并传递给后台。然后,讲解了后台如何调用微信接口,使用code换取OpenID、session_key及UnionID(如果已绑定微信开放平台)。最后,给出了后台实现的具体步骤,包括请求参数和返回值的解析。通过这个基础教程,有助于理解微信小程序与后台的交互过程。

微信openid是表示用户在当前应用中的唯一标识,比如小程序,微信公众号等,这些都算是一个应用。如果有多个应用,同一个用户的openId可能并不相同。

1. 微信小程序登录流程

如下图所示为微信开发者文档中提供的小程序登录流程图
小程序登录流程

如图中所示,在小程序前端中使用wx.login()获取code后,调用后台程序,由后台再根据appid + appsecret + code继续请求微信接口服务,从而得到openid,并返回给前端。

因为appidappsecret是小程序的唯一标识,属于绝对私密信息,所以通过后台程序调用微信接口服务就理所应当了。

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接口介绍,后台只需要根据appidappsecret以及前端传入的code组装http get请求访问微信接口服务即可获取openid

请求url地址

GET https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code

请求参数

属性类型默认值必填说明
appidstring小程序 appId
secretstring小程序 appSecret
js_codestring登录时获取的 code
grant_typestring授权类型,此处只需填写 authorization_code

返回值

Object类型

返回的 JSON 数据包

属性类型说明
openidstring用户唯一标识
session_keystring会话密钥
unionidstring用户在开放平台的唯一标识符,若当前小程序已绑定到微信开放平台帐号下会返回,详见 UnionID 机制说明。
errcodenumber错误码
errmsgstring错误信息

errcode 的合法值

说明最低版本
-1系统繁忙,此时请开发者稍候再试
0请求成功
40029code 无效
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"`
}
  • 小程序appidappsecret属于配置信息,所以定义全局变量保存值,在程序启动时读取配置即可
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是一个最基础的接口,大部分情况下都会使用,希望本文能给读者起到抛砖引玉作用,谢谢!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

togolife

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值