Files
devstar/docs/content/development/wechat-qr-login.zh-cn.md
孟宁 0557a744c0 !52 通过场景码SceneStr区分用户登录不同的部署版本,优化了代码
* 修改了微信公众号关注事件和文本消息的响应
* 通过场景码SceneStr区分用户登录不同的部署版本,优化了代码
* 兼容线上/api/wechat/official-account相关API
* 对第三方依赖中的PowerWeChat和officialAccount等字符串进行了本地化抽象,以Wechat和wechat_sdk命名可读性更好
* Merge branch 'dev' into refactoring-wechat-qr-code
* 梳理了routers到auth_service的代码,wechat_service还需要进一步整理
* 对代码文件目录结构进行了重构,内在逻辑还没有重构
* wechat相关路径中删掉了无意义的official-account字符串
2025-02-14 10:41:45 +00:00

4.3 KiB
Raw Blame History

date, title, slug, sidebar_position, toc, draft, aliases, menu
date title slug sidebar_position toc draft aliases menu
2024-12-22:44:00+01:00 微信二维码登录 wechat-qr-login 42 false false
/zh-cn/wechat-qr-login
sidebar
parent name sidebar_position identifier
development 微信二维码登录 42 /zh-cn/wechat-qr-login

微信二维码登录

Gitea 支持微信二维码登录允许本地部署间接使用devstar.cn完成微信二维码登录也可以本地部署配置自己的微信公众号实现微信二维码登录。

微信二维码服务相关端点和API

Web API URL
Show WeChat QR /user/login/wechat
WeChat QR Login /user/login/wechat/success
带参数临时二维码登录 /api/wechat/login/qr/check-status

routers/web/auth/auth.go

// for `/user/login/wechat` 用于获取临时二维码
func SignInWechatQr(ctx *context.Context) // Show QR Code in WeChat SignIn Page
...
    wechatQrTicket, wechatQrCodeUrl, err := auth_service.GetWechatQRTicket(ctx) // Call WeChat API for Ticket and QR Code URL
...

routers/web/auth/wechat_qr_auth.go

func WechatQrSignInSuccess(ctx *context.Context) // 扫码事件后,完成用户验证和登录
...
    qrStatusVO, err := wechat_service.GetWechatQrStatusByTicket(wechatQrTicket) // 获取扫码状态
    // 查询数据库扫码人信息
	  user, err := wechat_model.QueryUserByOpenid(ctx, qrStatusVO.OpenId)

routers/web/user/setting/wechat.go

func BindWechatQR(ctx *context.Context) {
  qrStatusVO, err := wechat_service.GetWechatQrStatusByTicket(wechatQrTicket)
  _ = wechat_service.DeleteWechatQrByTicket(wechatQrTicket)
  err = wechat_model.UpdateOrCreateWechatUser(ctx, user, qrStatusVO.OpenId)
...
func UnbindWechatQR(ctx *context.Context) {
	_ = wechat_model.DeleteWechatUser(ctx, ctx.Doer)
...

services/auth/wechat_qr.go // auth_service

// Call WeChat API for Ticket and QR Code URL
func GetWechatQRTicket(ctx *context.Context) (wechatQrTicket string, QRImageURL string, errorGenerateQr error)
// Call WeChat API for QR Code Scan Status并保存扫码状态
func checkWechatQrTicketStatus(ctx *context.Context, qrTicket string, quit chan bool) 

wechat_service API

API URL
微信服务器回调接口API Get/Post /api/wechat/callback/message
带参数临时二维码生成 Get /api/wechat/login/qr/generate
带参数临时二维码登录 Get /api/wechat/login/qr/check-status

routers/api/wechat/init-wechat-routes.go

	// 微信服务器回调接口
	wechatWebRouter.Group("/callback", func() {
		wechatWebRouter.Get("/message", wechat_service.CallbackVerifyMessage)
		wechatWebRouter.Post("/message", wechat_service.CallbackNotifyEvents)
	})

	// 微信公众号带参数临时二维码登录
	wechatWebRouter.Group("/login/qr", func() {
		wechatWebRouter.Get("/generate", wechat_service.GenerateWechatQrCode)
		wechatWebRouter.Get("/check-status", wechat_service.QrCheckCodeStatus)
	})

services/wechat/*.go services/auth/wechat_qr.go models/wechat/wechat.go

微信二维码登录开发环境配置方法

app.ini配置文件中的相关配置项

申请测试号https://mp.weixin.qq.com/debug/cgi-bin/sandboxinfo?action=showinfo&t=sandbox/index

appID和appsecret填入app.ini配置文件的对应项中。

[wechat]
ENABLED_WECHAT_QR_SIGNIN = true
WECHAT_QR_SERVICE_DOMAIN_NAME = de694c2.r25.cpolar.top
WECHAT_OFFICIAL_ACCOUNT_TEMP_QR_EXPIRE_SECONDS = 60
WECHAT_OFFICIAL_ACCOUNT_REGISTERATION_EXPIRE_SECONDS = 86400
WECHAT_OFFICIAL_ACCOUNT_APP_ID = wx659ca7ccef87005c
WECHAT_OFFICIAL_ACCOUNT_APP_SECRET = f231dcff9992de1bfb62fdf142cb3832
WECHAT_OFFICIAL_ACCOUNT_REDIS_ADDR = 
WECHAT_OFFICIAL_ACCOUNT_MESSAGE_TOKEN = your-token
WECHAT_OFFICIAL_ACCOUNT_MESSAGE_AES_KEY =

配置内网穿透https://dashboard.cpolar.com/get-started 可以得到类似de694c2.r25.cpolar.top 这样的域名访问内网服务

https://24a099f.r25.cpolar.top/api/wechat/callback/message 回调URL + your-token Token 就可以作为接口信息配置到微信测试号管理界面上。