微信小程序登录后端开发流程(附go后端实现代码)

参考:
微信官方文档 * 小程序登录流程
微信官方文档 * 小程序

本文参考以上文档, 加上自己理解整合写出.

登录流程

  1. 前端调用wx.login() 获取 临时登录凭证code ,并回传到开发者服务器。
  2. 后端调用 auth.code2Session 接口,换取 用户唯一标识OpenID会话密钥 session_key
  3. 开发者服务器可以根据用户标识来生成自定义登录态,用于后续业务逻辑中前后端交互时识别用户身份。
    在这里插入图片描述
    上图就是小程序登录的基本流程.

作为一个后端开发人员, 看完上述描述后, 内心是这样的:

在这里插入图片描述
嗯, 道理我都懂, 代码怎么写?

接下来我们用go实现这个流程:

首先code是前端获取传到后端的, 我们不用管, 只要在HTTP请求种拿到这个参数即可.
ok, 第一步的code已经拿到.

然后第二步, 利用code获取openIDsession_key, 这里我们看微信官方文档给的接口:

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

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
到这里有接口. 有返回值, 我们就可以通过HTTP请求获取openIDsession_key了.

现在开始写代码实现, 我使用的是go语言, 其实道理都是一样的.

定义返回值数据结构:

type WXLoginResp struct {
	OpenId string			`json:"openid"`
	SessionKey string		`json:"session_key"`
	UnionId string			`json:"unionid"`
	ErrCode int				`json:"errcode"`
	ErrMsg string 			`json:"errmsg"`
}

定义实现函数:

// 这个函数以 code 作为输入, 返回调用微信接口得到的对象指针和异常情况
func WXLogin(code string) (*WXLoginResp, error) {
	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, code)  

	// 创建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))
	}

	return &wxResp, nil
}

ok, 到这里, 我们已经获得了openidsession_key .

接下来实现第三步, 这一步比较灵活, 根据自己的需求生成自定义登录态, 并返回前端;

这里我们用gin框架实现一个路由接口, 将上面的内容串联起来, 形成一个完整的流程;下面的代码仅供参考

// /wechat/applet_login?code=xxx [get]  路由
// 微信小程序登录
func AppletWeChatLogin(c *gin.Context) {
	code := c.Query("code")     //  获取code
	// 根据code获取 openID 和 session_key
	wxLoginResp,err := models.WXLogin(code)
	if err != nil {
		c.JSON(400, util.Fail(err.Error()))
		return
	}
	// 保存登录态
	session := sessions.Default(c)
	session.Set("openid", wxLoginResp.OpenId)
	session.Set("sessionKey", wxLoginResp.SessionKey )
	
	// 这里用openid和sessionkey的串接 进行MD5之后作为该用户的自定义登录态
	mySession := GetMD5Encode(wxLoginResp.OpenId + wxLoginResp.SessionKey)
	// 接下来可以将openid 和 sessionkey, mySession 存储到数据库中, 
	// 但这里要保证mySession 唯一, 以便于用mySession去索引openid 和sessionkey
	c.String(200, mySession)
	
}
// 将一个字符串进行MD5加密后返回加密后的字符串
func GetMD5Encode(data string) string {
	h := md5.New()
	h.Write([]byte(data))
	return hex.EncodeToString(h.Sum(nil))
}

可能代码部分不太能看懂, 这里再用文字解释一下:

  1. 获取路由中的code 参数
  2. 利用code调用我们之前写好的函数获取openidsession_key
  3. 利用得到的 openidsession_key 生成我们自定义的登录态(这里方式有很多, 保证生成的值全局唯一即可, 这里我们简单化了, 直接利用openidsession_key进行MD5加密, 将得到的字符串作为我们的登录态(这里登录态理解为索引即可, 本质是一个字符串))
  4. 最后将我们定义的登录态以及openidsession_key存储到数据库中, 并且保证能用自定义的登录态唯一查询到该用户的openidsession_key. 以便我们后期用到的时候可以查询到.

到这里微信小程序登录已经基本完成了.

这里, 微信官方还提供了一个校验接口, 用于校验小程序端获取的用户信息是否完整,这个也是我们之前获得的session_key的意义,

这里可以参考: 微信官方文档 * 后台校验与解密数据

我们也给出校验代码, 非常简单:
实际上就是将前端提供的微信原始数据和我们之前获取的session_key进行MD5加密, 得到signature2, 与微信加密的结果进行比较, 相同即为没有改变, 不同即是原始数据发生了改变.

// 校验微信返回的用户数据
func ValidateUserInfo(rawData, sessionKey, signature string) bool {
	signature2 := GetSha1(rawData + sessionKey)
	return signature == signature2
}
// SHA-1 加密
func GetSha1(str string) string {
	data := []byte(str)
	has := sha1.Sum(data)
	res := fmt.Sprintf("%x", has) //将[]byte转成16进制
	return res
}

以上就是微信小程序登录, 后台涉及到的所有操作.

<think>嗯,用户想了解微信小程序开发的后端技术选择。我需要先回顾一下常见的后端技术栈,然后结合微信小程序的特点来推荐合适的选项。 首先,微信小程序后端主要负责处理业务逻辑、数据存储、用户认证、接口提供等。常用的后端语言有Node.js、Python、Java、Go、PHP等。每种语言都有其适用的场景和框架,比如Node.js的Express、Koa,Python的Django、Flask,Java的Spring Boot,PHP的Laravel等。需要比较它们的优缺点,以及在小程序开发中的实际应用情况。 用户提供的引用中提到了PHP和腾讯云托管。引用[2]提到PHP后端开发实例,说明PHP是一个可行的选择,尤其是配合一些框架如Laravel或ThinkPHP。不过PHP可能在处理高并发时不如其他语言高效,但对于小型项目来说足够使用。 另外,引用[1]提到了部署到腾讯云托管,可能涉及到云服务的选择,比如云函数、容器服务等。腾讯云的Serverless架构可能适合轻量级后端,减少运维成本。比如使用云开发(TCB)可以集成数据库、存储和云函数,方便快速开发。 Node.js也是一个热门选择,特别是对于全栈开发者,可以使用JavaScript统一前后端语言,提高开发效率。结合Express或Koa框架,可以快速搭建RESTful API。同时,Node.js的非阻塞IO适合处理大量并发请求,适合实时应用。 Java的Spring Boot适合大型企业级应用,有较强的生态系统和稳定性,但学习曲线较陡,适合团队中有Java经验的开发者。 Python的Django和Flask框架灵活,适合快速开发,尤其在数据处理和AI集成方面有优势,但性能可能不如Go或Java。 Go语言近年来因其高性能和简洁的语法受到关注,适合需要高并发的后端服务,比如使用Gin框架。但社区资源可能不如其他语言丰富。 还需要考虑数据库的选择,比如MySQL、MongoDB等,根据项目需求决定关系型或非关系型数据库。同时,云服务商提供的数据库服务(如腾讯云的TencentDB)可能更便于集成和运维。 用户身份认证方面,微信小程序通常使用微信登录后端需要对接微信的API,获取用户openid和session_key,处理会话管理。OAuth2.0和JWT是常用的认证机制,需要后端实现。 部署方面,腾讯云托管支持容器化部署,可以结合Docker和Kubernetes,或者使用Serverless部署,减少服务器管理负担。云开发(TCB)提供了全托管的后端服务,适合快速上线。 综合来看,技术栈的选择需要根据项目规模、团队熟悉度、性能需求和扩展性来决定。对于初创项目或小型应用,Node.js或PHP配合云开发可能更高效;中大型项目则可能倾向Java或Go,以保证性能和可维护性。</think>### 适合微信小程序开发的后端技术栈选择 微信小程序后端开发需要满足接口响应、数据存储、用户认证等核心需求。以下是主流后端技术栈的分析与推荐: #### 1. **Node.js(推荐轻量级或全栈团队)** - **框架选择**:Express、Koa、NestJS - Express/Koa 适合快速搭建 RESTful API,代码简洁。 - NestJS 提供模块化结构,适合中大型项目。 - **优势**: - 异步非阻塞,适合高并发场景。 - 前后端统一使用 JavaScript,降低学习成本。 - **适用场景**:中小型项目、实时应用(如聊天功能)。 - **腾讯云集成**:可通过云函数(SCF)部署,结合 API 网关实现低成本运维[^1]。 #### 2. **Java(适合企业级应用)** - **框架选择**:Spring Boot、MyBatis - Spring Boot 提供完善的生态(如 Spring Security、Spring Data JPA)。 - **优势**: - 高稳定性,适合复杂业务逻辑。 - 强类型语言,减少运行时错误。 - **适用场景**:金融、电商等对安全性和稳定性要求高的场景。 - **部署**:可打包为 Docker 镜像部署到腾讯云容器服务(TKE)。 #### 3. **Python(快速开发与数据驱动型应用)** - **框架选择**:Django、Flask - Django 自带 ORM 和 Admin 面板,适合快速迭代。 - Flask 轻量灵活,适合微服务架构。 - **优势**: - 开发效率高,适合 AI/ML 集成。 - **适用场景**:数据分析类小程序、原型验证。 #### 4. **PHP(传统 Web 开发延续)** - **框架选择**:Laravel、ThinkPHP - Laravel 提供 Eloquent ORM 和 Blade 模板引擎。 - **优势**: - 学习成本低,社区资源丰富[^2]。 - **适用场景**:内容管理系统(CMS)、小型电商后端。 #### 5. **Go(高性能与高并发场景)** - **框架选择**:Gin、Echo - Gin 以高性能著称,适合微服务架构。 - **优势**: - 编译型语言,执行效率接近 C++。 - 协程(Goroutine)支持高并发。 - **适用场景**:实时推送、物联网(IoT)后端。 #### 6. **云开发(Tencent CloudBase,推荐初创团队)** - **集成服务**:云数据库、云存储、云函数 - **优势**: - 无需管理服务器,直接通过 SDK 调用能力。 - 内置微信登录、支付等扩展能力。 - **适用场景**:快速上线、MVP 验证。 --- ### **技术选型建议** - **小型项目/个人开发**:Node.js + 云开发(低成本、快速部署)。 - **企业级复杂系统**:Java(Spring Boot) + 腾讯云容器服务。 - **数据驱动/AI 集成**:Python(Django/Flask) + 腾讯云 AI 服务。 - **高并发实时场景**:GoGin) + 腾讯云微服务架构。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值