记录一下go语言微信小程序登录

我这边主要是已有账号跟微信账号去进行绑定的一个流程
思路:
1、小程序通过code调用接口获取token。
2、如果是第一次登录,那么通过入参已有账号、密码、code,通过第三方接口得到OpenId进行绑定并且返回token。

  • golang端
//小程序登录传入的数据
type ConfirmLoginDto struct {Iv        string `json:"iv"`WxCode    string `json:"wx_code"`Token     string `json:"token"`    //账号登录认证Nickname  string `json:"nickname"`  //微信昵称Headimage string `json:"headimage"` //微信头像User      string `json:"user"`      //账号Passwd    string `json:"passwd"`    //密码
}
//账号信息
type User struct {这里自己去写
}
/*微信小程序登录 返回值*/
type WXLoginResp struct {OpenId     string `json:"openid"`SessionKey string `json:"session_key"`UnionId    string `json:"unionid"`ErrCode    int    `json:"errcode"`ErrMsg     string `json:"errmsg"`Token      string `json:"token"`Auth       uint32 `json:"auth"`Name       string `json:"name"`Phone      string `json:"phone"`Nickname   string `json:"nickname"`  //微信昵称Headimage  string `json:"headimage"` //微信头像
}func wxLoginHandler(ctx iris.Context) {var user ConfirmLoginDtovar err error// user.Token = ctx.GetHeader("token")if err = ctx.ReadJSON(&user); err != nil {ctx.StatusCode(iris.StatusBadRequest)} else if user.WxCode == "" {err = errors.New("code值不能为空")}if err != nil {ctx.JSON(iris.Map{"result_code": 500, "result_msg": err.Error()})return}users, err := wxLogin(&user)if err == nil {ctx.JSON(iris.Map{"result_code": 200, "result_msg": "success", "data": users})} else {ctx.JSON(iris.Map{"result_code": 500, "result_msg": err.Error()})}
}/*根据wx_code返回token ...*/
func wxLogin(user *ConfirmLoginDto) (*WXLoginResp, error) {session := GetConnection()defer session.Close()url := "https://api.weixin.qq.com/sns/jscode2session?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code"// 合成url, 这里的appId和secret是在微信公众平台上获取的url = fmt.Sprintf(url, "填你的appid", "填secret", user.WxCode)// 创建http get请求resp, err := http.Get(url)if err != nil {return nil, err}defer resp.Body.Close()// 解析http请求中body 数据到我们定义的结构体中wxResp := WXLoginResp{}decoder := json.NewDecoder(resp.Body)if err := decoder.Decode(&wxResp); err != nil {return nil, err}// 判断微信接口返回的是否是一个异常情况if wxResp.ErrCode != 0 {return nil, errors.New(fmt.Sprintf("ErrCode:%s  ErrMsg:%s", wxResp.ErrCode, wxResp.ErrMsg))}var userInfo Usersession, err := mgo.Dial("mongodb://账号:密码@ip:端口/名称") //要连接的服务器和端口if err != nil {panic(err)}c := session.DB("名称").C("user_info")err = c.Find(bson.M{"open_id": wxResp.OpenId}).One(&userInfo)if user.User != "" && user.Passwd != "" { //账号绑定微信,更新err := c.Find(bson.M{"user": user.User}).One(&userInfo)if err != nil {return nil, errors.New("该账号不存在")} else if userInfo.Passwd != user.Passwd {return nil, errors.New("密码错误")} else {userInfo.Open_id = wxResp.OpenIduserInfo.Nickname = user.NicknameuserInfo.Headimage = user.Headimagec.Update(bson.M{"token": userInfo.Token}, userInfo)}} else if err != nil {return nil, errors.New("请先登录")}wxResp.Auth = userInfo.AuthwxResp.Token = userInfo.TokenwxResp.Name = userInfo.NamewxResp.Phone = userInfo.PhonewxResp.Nickname = userInfo.NicknamewxResp.Headimage = userInfo.HeadimagewxResp.OpenId = ""wxResp.SessionKey = ""return &wxResp, nil
}
  • 小程序

config.js 用来存放公共数据

var config = {token:"",name:"",//账号昵称auth:null,//账号权限 0:管理员  1:打工人userInfo:null,//微信账号信息
}module.exports = config;

app.js

// 登录var http = require('./utils/request.js'); var config = require('./config');wx.login({success: res => {// console.log('登陆login',res)// 发送 res.code 到后台换取 openId, sessionKey, unionIdvar params = {//请求参数wx_code: res.code,//用户登录凭证(有效期五分钟)}http.postRequest("user/wxlogin", params, res => {console.log("code登录接口");if(res.result_msg== "请先登录"){//第一次进入小程序,那么我们去登录页// wx.reLaunch({//   url: '../../login/login'// })var pages = getCurrentPages() //获取加载的页面var currentPage = pages[pages.length-1] //获取当前页面的对象var url = currentPage.route //当前页面url   var skipUrl = ""for(let I = 1; I < url.split("/").length-1; I++){skipUrl = skipUrl + '../'}wx.reLaunch({url: skipUrl+'login/login'})}else{//存起来config.name = res.data.nameconfig.auth = res.data.authconfig.token = res.data.tokenconfig.userInfo = {nickname:res.data.nickname,headimage:res.data.headimage}}console.log(res,config);}, res => {console.log("请求失败了傻瓜")})}})

pages/login/login.js

var http = require('../../utils/request.js');
var config = require('../../config');
Page({data() {return {username: '',password: '',};},onChange1(event) {// event.detail 为当前输入的值console.log(event.detail);this.setData({ username: event.detail })},onChange2(event) {// event.detail 为当前输入的值console.log(event.detail);this.setData({ password: event.detail })},login(){if(config.userInfo){this.postLogin()}else{wx.getUserProfile({desc: '用于完善会员资料', // 声明获取用户个人信息后的用途,后续会展示在弹窗中,请谨慎填写success: (res) => {console.log(res.userInfo)let userInfo = res.userInfoconfig.userInfo = userInfothis.postLogin()}})}},postLogin(){wx.login({success: res => {// console.log('登陆login',res)// 发送 res.code 到后台换取 openId, sessionKey, unionIdvar params = {//请求参数wx_code: res.code,//用户登录凭证(有效期五分钟)user:this.data.username,passwd:this.data.password,nickname:config.userInfo.nickName,headimage:config.userInfo.avatarUrl}http.postRequest("user/wxlogin", params, res => {console.log("登录接口");console.log(res);if(res.result_code == 200){config.name = res.data.nameconfig.auth = res.data.authconfig.token = res.data.tokenwx.reLaunch({url: '../indexs/my'})}}, res => {console.log("请求登录失败了")})}})},
})//附带一下login.wxml<van-fieldvalue="{{ username }}"placeholder="请输入用户名"border="{{ false }}"bind:change="onChange1"/><van-fieldvalue="{{ password }}"placeholder="请输入密码"border="{{ false }}"bind:change="onChange2"/><van-button type="primary" bindtap="login">登录</van-button>

utils/request.js

var app = getApp(); //获取小程序全局唯一app实例
var config = require('../config');// 非开发环境的服务器域名
let host = 'http://xiaohongdechuanr.com:8001/'; //接口地址
// platform 用来判断是否是开发环境
const {platform} = wx.getSystemInfoSync()
// 开发环境的服务器域名
if(platform === 'devtools'){host = 'http://190.161.8.9:8001/';//小红的本地
}
//url:接口
//postData:参数
//doSuccess:成功的回调函数
//doFail:失败的回调函数//POST请求
function post(url, postData, doSuccess, doFail) {request(url, postData, "POST", doSuccess, doFail);
}//GET请求
function get(url, postData, doSuccess, doFail) {request(url, postData, "GET", doSuccess, doFail);
}function request(url, postData, method, doSuccess, doFail) {wx.showLoading({title: "正在加载中...",})wx.request({url: host + url, //请求地址method: method, //请求方法header: { //请求头"Content-Type": "application/json;charset=UTF-8","token":config.token},data: postData, //请求参数    dataType: 'json', //返回数据格式responseType: 'text', //响应的数据类型success: function(res) {// console.log(res)wx.hideLoading();if(res.data.result_code == 200){//成功执行方法,参数值为res.data,直接将返回的数据传入doSuccess(res.data);}else{wx.showToast({title: res.data.result_msg,icon:'error'})doSuccess(res.data);}},fail: function() {wx.hideLoading();//失败执行方法doFail();},})
}
//module.exports用来导出代码
//js文件中通过var http = require("../../util/request.js")加载
module.exports = {postRequest: post,getRequest: get,
}// 使用实例
// var http = require('../../utils/request.js'); //相对路径
// var params = {//请求参数
//   aid: this.optionaid, //id
//   aname: this.data.receiving, //收货人
//   atell: this.data.tell, //联系方式
//   adetailed: this.data.detailed, //详细地址
// }
// http.postRequest("EditAddress/EditAddressInfo", params, function(res) {//   console.log("修改成功!");
//   wx.navigateTo({//     url: '/pages/address/address',
//   })
// }, function(res) {//   console.log("修改失败!!!")
// })

golang 微信小程序登录相关推荐

  1. Golang 微信小程序加密数据解密算法实现

    Go 语言 微信小程序加密数据解密算法实现 代码实现 本实现参考官方PHP例程实现,Go代码实现如下: func DecryptData (app_id, session_key, iv, encry ...

  2. access突然需要登录_早知道早好,微信小程序登录开发需要注意的事项

    最近公司要做一个企业微信的小程序,方便企业内的成员来登录,以便一些公司内的业务,只限于公司内的成员来操作,因为有微信小程序的开发经验,所以先当作微信小程序来开发了! 首先来讲一下这个企业微信小程序与微 ...

  3. Taro -- 微信小程序登录

    Taro微信小程序登录 1.调用Taro.login()获取登录凭证code: 2.调用Taro.request()将code传到服务器: 3.服务器端调用微信登录校验接口(appid+appsecr ...

  4. 微信小程序登录-利用Oenid实现白名单和黑名单

    微信小程序登录-利用Oenid实现白名单和黑名单 1.通过获取openid 存储到数据库中 2.结合数据库中额用户资料实现白名单和黑名单.

  5. Spring Boot + 微信小程序——登录凭证校验DEMO

    基本概念 微信小程序-登录凭证校验:通过 wx.login 接口获得临时登录凭证 code 后传到开发者服务器调用此接口完成登录流程. 微信小程序API https://developers.weix ...

  6. sessionkey 微信小程序获取_微信小程序登录,获取code,获取openid,获取session_key...

    微信小程序登录 wx.login(Object object) 调用接口获取登录凭证(code).通过凭证进而换取用户登录态信息,包括用户的唯一标识(openid)及本次登录的会话密钥(session ...

  7. uni-app微信小程序登录授权

    uni-app微信小程序登录授权 首先是需要用到一个授权按钮来触发获取用户信息授权: 关键在于 open-type 为 getUserInfo , 然后有个@getuserinfo的事件,把获取授权接 ...

  8. php与ipa接口登录验证失败,thinkPHP5.0开发微信小程序登录接口signature验证失败

    我用TP5开发微信小程序登录接口的时候,在校验签名signature那遇到了个坑,一直校验失败,找了很久才发现 原因是:tp的input方法会自动转移html字符,比如'"'转成了 & ...

  9. 小程序 微信统计表格_微信小程序登录机制

    " 不是0,也不是1,有0也有1 " 总有一个瞬间,你想记录当下的一些事情,所以有了这篇文章,不会口吐芬芳,我直接开门了,但愿能让你见山. 1. 背景 21 届的校园招聘已经打响了 ...

  10. 微信小程序登录 返回 -41003

    微信小程序登录解密失败 小程序登录的时候,通过客户端获取的code等加密的信息,传给后端解密,可是后端解密返回 -41003 问题踩坑过程 复现流程: 用户点击授权按钮.通过 按钮绑定 getUser ...

最新文章

  1. 家人介绍的91年程序员月薪15k,已秃头!女孩不乐意,妈妈却说往后你只会越找越差!...
  2. HDU 4286 Data Handler [栈,双端队列]
  3. 【学习笔记】 Javascript定时器
  4. 【Linux】一步一步学Linux——ping命令(150)
  5. 【网络知识点】防火墙主备冗余技术
  6. matlab内置函数fitgeotrans与transformPointsForward解析
  7. [原创]浅谈移动互联网App兼容性测试
  8. spark-sql createOrReplaceTempView 和createGlobalTempView区别
  9. Spark之Task原理分析
  10. eventemitter_节点JS事件模块和EventEmitter
  11. cetos7 网卡名字命名规则_Linux 中如何启用和禁用网卡?
  12. mysql 测试数据生成器_8个免费的测试数据/样本数据生成器
  13. STM32F072 NUCLEO笔记1-驱动安装以及第一个工程(mbed版)
  14. arduino SIM868发送post请求到服务器,解决只能成功发送一次的问题
  15. 判断图同构大杀器---nauty算法
  16. 三大门户二十年,中国互联网踏上新征程
  17. memset使用最详细细节
  18. 微信接入机器人实现对别人消息和群at消息的自动回复
  19. Java容器深度总结:Java容器整体结构
  20. Polygon zkEVM——Hermez 2.0简介

热门文章

  1. (转载)重新编译SJF2410以适应NM9805并口卡(PCMICIA接口)
  2. Laravel5.8调试消息队列RabbitMQ
  3. CMake中链接库的顺序问题
  4. 4.7 使用色相/饱和度命令调整图像的色彩 [原创Ps教程]
  5. AWS - VPC Peering
  6. 按键精灵定时后台点击
  7. Apache ShenYu(原 soul) 网关 整合 nacos
  8. 小米路由器青春版开启SSH刷入Padavan固件
  9. 浙江大学计算机答辩模板,浙江大学 答辩通用模板
  10. rpm的安装与卸载,常用命令记载