调整微信扫码登录相关接口,拆分门店奖励:奖励类型、奖励详情

This commit is contained in:
2025-06-03 11:06:00 +08:00
parent ea87bc829e
commit fdc9cc3463
37 changed files with 698 additions and 189 deletions

View File

@ -2,32 +2,90 @@ package wx
import (
"context"
"github.com/gogf/gf/v2/os/glog"
"fmt"
v1 "server/api/wx/v1"
"server/internal/model"
"server/internal/service"
"strings"
"server/api/auth/v1"
"github.com/gogf/gf/v2/encoding/gjson"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/os/glog"
)
func (c *ControllerV1) WeChatEvent(ctx context.Context, req *v1.WeChatEventReq) (res *v1.WeChatEventRes, err error) {
// 收到微信订阅事件
glog.Infof(ctx,
"微信消息推送:时间=%d, 消息类型=%s, 事件=%s, 事件Key=%s",
req.CreateTime,
req.MsgType,
req.Event,
req.EventKey,
glog.Infof(ctx, "【微信事件】收到事件 | event=%s, msgType=%s, eventKey=%s, fromUserName=%s, toUserName=%s, createTime=%d",
req.Event, req.MsgType, req.EventKey, req.FromUserName, req.ToUserName, req.CreateTime,
)
// 根据事件类型进行不同的处理:
switch req.MsgType {
case "event":
switch req.Event {
case "subscribe":
// 未关注,扫描关注后, 注册账号,关联微信的 open_id
key := strings.TrimPrefix(req.EventKey, "qrscene_")
out, err := service.User().Login(ctx, &model.UserLoginIn{OpenId: req.FromUserName})
if err != nil {
return nil, err
}
if err = updateLoginCache(ctx, key, out.Token); err != nil {
glog.Errorf(ctx, "【微信事件】更新登录缓存失败 | error=%s", err.Error())
}
return nil, nil
case "SCAN":
// 已关注,扫描后,根据 open_id 查找用户生成 token
out, err := service.User().Login(ctx, &model.UserLoginIn{OpenId: req.FromUserName})
if err != nil {
return nil, err
}
if err = updateLoginCache(ctx, req.EventKey, out.Token); err != nil {
glog.Errorf(ctx, "【微信事件】更新登录缓存失败 | error=%s", err.Error())
}
return nil, nil
default:
// 处理其他事件
glog.Infof(ctx, "【微信事件】不支持的事件 | event=%s", req.Event)
return nil, nil
}
default:
glog.Infof(ctx, "【微信事件】不支持的消息类型 | msgType=%s", req.MsgType)
return nil, nil
}
return nil, nil
}
func updateLoginCache(ctx context.Context, key string, token string) error {
loginCacheKey := fmt.Sprintf("wx:login:cache:%s", key)
glog.Infof(ctx, "【微信事件】准备更新登录缓存 | redisKey=%s, token=%s", loginCacheKey, token)
// 获取原缓存
data, err := g.Redis().Get(ctx, loginCacheKey)
if err != nil {
glog.Errorf(ctx, "【微信事件】获取缓存失败 | key=%s, error=%v", loginCacheKey, err)
return err
}
if data.IsEmpty() {
glog.Warningf(ctx, "【微信事件】缓存不存在 | key=%s", loginCacheKey)
return nil // 不是错误,只是二维码超时或错误
}
// 反序列化
var loginCache model.LoginCache
if err := gjson.Unmarshal(data.Bytes(), &loginCache); err != nil {
glog.Errorf(ctx, "【微信事件】反序列化缓存失败 | key=%s, error=%v", loginCacheKey, err)
return err
}
// 更新状态与Token
loginCache.Status = 1
loginCache.Token = token
// 序列化并写回 Redis
newData, err := gjson.Marshal(loginCache)
if err != nil {
glog.Errorf(ctx, "【微信事件】序列化缓存失败 | key=%s, error=%v", loginCacheKey, err)
return err
}
if err := g.Redis().SetEX(ctx, loginCacheKey, newData, 60); err != nil {
glog.Errorf(ctx, "【微信事件】写入缓存失败 | key=%s, error=%v", loginCacheKey, err)
return err
}
glog.Infof(ctx, "【微信事件】缓存更新成功 | key=%s, token=%s", loginCacheKey, token)
return nil
}