* 修改了微信公众号关注事件和文本消息的响应 * 通过场景码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字符串
4.3 KiB
4.3 KiB
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 |
|
|
微信二维码登录
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 就可以作为接口信息配置到微信测试号管理界面上。