image.png

1.小程序=>wx.login()获取code

  1. wx.login({
  2. success (res) {
  3. if (res.code) {
  4. //发起网络请求
  5. wx.request({
  6. url: 'https://example.com/onLogin',
  7. data: {
  8. code: res.code
  9. }
  10. })
  11. } else {
  12. console.log('登录失败!' + res.errMsg)
  13. }
  14. }
  15. })

2.gin服务器后端
GET https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code

func WxLogin(c *gin.Context) {
    code := c.Param("code")
    rs, err := utils.New(url+code, "POST").Request()
    if err != nil {
        log.Fatal(err)
    }
    log.Println("----->>>查找用户表-用户数据")
    user := db.First(&user, "openId = ?", rs.openId)
    if user != nil {
        log.Println("----->>>返回前端-openId+用户信息(昵称,头像,手机号码)")    
        // 设置cookie,保存登陆状态
        c.SetCookie("gin_cookie", "test", 3600, "/", "localhost", false, true)
    }
       log.Println("----->>>返回前端-只有openId")    
}

返回值是

openid 用户唯一标识
session_key 会话密钥

3.小程序获取到上一步结果

wx.request({
  url: 'https://example.com/onLogin',
  data: {
    code: res.code
  },
  success: function (res) {
    // 如果没有手机号,则跳转到登录页面,注册用户
    if (res.mobile) {
      wx.navigator({ 
        url: '/pages/login/index'
      })
    }
  }
})

4.小程序登录页面

image.png
用户主动点击按钮(微信一键登录)

image.png

参考链接

auth.code2Session
小程序登录