56 lines
1.7 KiB
Go
56 lines
1.7 KiB
Go
package wx
|
||
|
||
import (
|
||
"context"
|
||
"encoding/json"
|
||
"fmt"
|
||
v1 "server/api/wx/v1"
|
||
"server/internal/model"
|
||
"server/utility/ecode"
|
||
|
||
"github.com/gogf/gf/v2/frame/g"
|
||
"github.com/gogf/gf/v2/os/glog"
|
||
)
|
||
|
||
func (c *ControllerV1) WeChatPolling(ctx context.Context, req *v1.WeChatPollingReq) (res *v1.WeChatPollingRes, err error) {
|
||
loginCacheKey := fmt.Sprintf("wx:login:cache:%s", req.SceneId)
|
||
glog.Infof(ctx, "开始处理微信长轮询请求,SceneID: %s", req.SceneId)
|
||
|
||
var loginCache model.LoginCache
|
||
|
||
data, err := g.Redis().Get(ctx, loginCacheKey)
|
||
if err != nil {
|
||
glog.Errorf(ctx, "从 Redis 获取登录缓存失败,SceneID: %s,错误: %v", req.SceneId, err)
|
||
return nil, ecode.Fail.Sub("获取登录状态失败")
|
||
}
|
||
|
||
if data.IsEmpty() {
|
||
glog.Warningf(ctx, "用户尚未扫码登录,SceneID: %s", req.SceneId)
|
||
return nil, ecode.InvalidOperation.Sub("请先调用获取二维码登录")
|
||
}
|
||
|
||
if err = json.Unmarshal(data.Bytes(), &loginCache); err != nil {
|
||
glog.Errorf(ctx, "解析登录状态失败,SceneID: %s,错误: %v", req.SceneId, err)
|
||
return nil, ecode.Fail.Sub("解析登录状态失败")
|
||
}
|
||
|
||
switch loginCache.Status {
|
||
case 0:
|
||
glog.Infof(ctx, "用户尚未扫码登录,SceneID: %s", req.SceneId)
|
||
return &v1.WeChatPollingRes{
|
||
Status: "waiting",
|
||
Token: "",
|
||
}, nil
|
||
case 1:
|
||
// 直接返回缓存的token
|
||
glog.Infof(ctx, "用户扫码登录成功,SceneID: %s,返回缓存Token", req.SceneId)
|
||
return &v1.WeChatPollingRes{
|
||
Status: "success",
|
||
Token: loginCache.Token,
|
||
}, nil
|
||
default:
|
||
glog.Warningf(ctx, "未知登录状态 %d,SceneID: %s", loginCache.Status, req.SceneId)
|
||
return nil, ecode.InvalidOperation.Sub("未知登录状态")
|
||
}
|
||
}
|