GO 实现小程序登陆授权流程

前记

最近在用 gin 开发一款小程序后端需要用到小程序登陆授权,看看如何实现

小程序登陆流程图

核心代码

核心代码实现,这里主要是利用了 silenceper/wechat

InitWechat 函数主要是初始化 Wechat 同时去设置缓存

MiniProgramLogin 函数主要是去调用 Code2Session 进行授权,同时将 code 换成 session

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
package utils

import (
"github.com/gin-gonic/gin"
"github.com/silenceper/wechat/v2"
"github.com/silenceper/wechat/v2/cache"
miniConfig "github.com/silenceper/wechat/v2/miniprogram/config"
)

func InitWechat(c *gin.Context) *wechat.Wechat {
wc := wechat.NewWechat()
redisOpts := &cache.RedisOpts{
Host: "127.0.0.1:3306",
Database: 0, // redis db
MaxActive: 10, // 连接池最大活跃连接数
MaxIdle: 10, //连接池最大空闲连接数
IdleTimeout: 60, //空闲连接超时时间,单位:second

}
redisCache := cache.NewRedis(c, redisOpts)
wc.SetCache(redisCache)
return wc
}

func MiniProgramLogin(c *gin.Context, code string) (map[string]interface{}, error) {
wc := InitWechat(c)
cfg := &miniConfig.Config{
AppID: "APPID",
AppSecret: "APPSECRET",
}
miniprogram := wc.GetMiniProgram(cfg)
auth := miniprogram.GetAuth()
session, err := auth.Code2Session(code)

result := map[string]interface{}{}
if err != nil {
return result, err
}
result["openid"] = session.OpenID
result["session_key"] = session.SessionKey
result["unionid"] = session.UnionID
return result, nil
}

小程序

小程序需要调用 wx.login 获取到 code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
App({
globalData: {},
onLaunch: function () {
var token = wx.getStorageSync('token'); // 获取本地缓存
if (!token) {
wx.login({
success: function (_a) {
var code = _a.code; // 获取到登陆code
if (code) {
console.log(code);
// 在这里请求API进行登陆
}
}
});
return;
}
}
});

调用

1
utils.MiniProgramLogin(c, code)

cgin 上下文对象 *gin.Context

code 为前端传入小程序 wx.login 获取到的 code


纵有千古,横有八荒;前途似海,来日方长。