101 lines
2.6 KiB
Go
101 lines
2.6 KiB
Go
// 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
|
|
}
|