// Code scaffolded by goctl. Safe to edit. // goctl 1.10.1 package auth import ( "context" "encoding/json" "fmt" "io" "net/http" "net/url" "time" "sundynix-micro-go/app/user/api/internal/svc" "sundynix-micro-go/app/user/api/internal/types" "sundynix-micro-go/app/user/rpc/user" jwtUtil "sundynix-micro-go/common/utils/jwt" jwtv5 "github.com/golang-jwt/jwt/v5" "github.com/zeromicro/go-zero/core/logx" ) type LoginByPhoneLogic struct { logx.Logger ctx context.Context svcCtx *svc.ServiceContext } func NewLoginByPhoneLogic(ctx context.Context, svcCtx *svc.ServiceContext) *LoginByPhoneLogic { return &LoginByPhoneLogic{ Logger: logx.WithContext(ctx), ctx: ctx, svcCtx: svcCtx, } } func (l *LoginByPhoneLogic) LoginByPhone(req *types.LoginByPhoneReq) (resp *types.LoginResp, err error) { // 1. 调用微信接口获取手机号 // TODO: 从配置中获取access_token accessToken := "" // 需要通过微信API获取 apiURL := "https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=" + accessToken data := map[string]interface{}{"code": req.Code} jsonData, _ := json.Marshal(data) httpResp, err := http.Post(apiURL, "application/json", nil) if err != nil { l.Errorf("获取手机号失败: %v", err) return nil, fmt.Errorf("获取手机号失败") } defer httpResp.Body.Close() body, _ := io.ReadAll(httpResp.Body) var dataMap map[string]interface{} _ = json.Unmarshal(body, &dataMap) _ = jsonData _ = url.Values{} // 2. 通过 user-rpc 查询用户 userResp, err := l.svcCtx.UserRpc.GetUserByOpenId(l.ctx, &user.GetUserByOpenIdReq{ OpenId: req.OpenId, }) if err != nil { return nil, fmt.Errorf("用户不存在") } // 3. 如果需要更新手机号 phoneInfo, ok := dataMap["phone_info"].(map[string]interface{}) if ok { phoneNumber, _ := phoneInfo["phoneNumber"].(string) if phoneNumber != "" && userResp.User.Phone == "" { _, _ = l.svcCtx.UserRpc.UpdateUser(l.ctx, &user.UpdateUserReq{ Id: userResp.User.Id, Phone: phoneNumber, }) userResp.User.Phone = phoneNumber } } // 4. 生成Token j := jwtUtil.NewJWT(l.svcCtx.Config.Auth.AccessSecret) claims := jwtUtil.CustomClaims{ BaseClaims: jwtUtil.BaseClaims{ ID: userResp.User.Id, Account: userResp.User.Account, }, BufferTime: 3600, RegisteredClaims: jwtv5.RegisteredClaims{ ExpiresAt: jwtv5.NewNumericDate(time.Now().Add(time.Duration(l.svcCtx.Config.Auth.AccessExpire) * time.Second)), Issuer: "sundynix", }, } token, _ := j.CreateToken(claims) return &types.LoginResp{ Token: token, UserInfo: userResp.User, }, nil }