This commit is contained in:
邹宗楠
2022-07-27 15:30:48 +08:00
parent aee8a1961b
commit ecf2f761c8

View File

@@ -7,17 +7,10 @@ import (
"encoding/json" "encoding/json"
"errors" "errors"
"fmt" "fmt"
"git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-print/dao"
"git.rosy.net.cn/jx-print/globals"
"git.rosy.net.cn/jx-print/model" "git.rosy.net.cn/jx-print/model"
wxLogin "git.rosy.net.cn/jx-print/model/app_model" wxLogin "git.rosy.net.cn/jx-print/model/app_model"
"git.rosy.net.cn/jx-print/services/api"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
xaes "github.com/go-pay/gopay/pkg/aes"
"github.com/go-pay/gopay/wechat"
"reflect" "reflect"
"time"
) )
type UserLogin struct { type UserLogin struct {
@@ -25,98 +18,100 @@ type UserLogin struct {
// WxLogin 授权登录 // WxLogin 授权登录
func (u *UserLogin) WxLogin(ctx *gin.Context, code, phone string) (*model.User, error) { func (u *UserLogin) WxLogin(ctx *gin.Context, code, phone string) (*model.User, error) {
// 生成openId //// 生成openId
openObj, err := wechat.GetOauth2AccessToken(ctx, wxLogin.WeChatAPPID, wxLogin.WeChatAPPSecret, code) //openObj, err := wechat.GetOauth2AccessToken(ctx, wxLogin.WeChatAPPID, wxLogin.WeChatAPPSecret, code)
if err != nil { //if err != nil {
return nil, err // return nil, err
} //}
//
if openObj.Errcode != 0 { //if openObj.Errcode != 0 {
return nil, errors.New(openObj.Errmsg) // return nil, errors.New(openObj.Errmsg)
} //}
//
// 检查用户是否存在 //// 检查用户是否存在
users, err := dao.GetUsers(globals.GetDB(), "", "", phone, "") //users, err := dao.GetUsers(globals.GetDB(), "", "", phone, "")
if err != nil { //if err != nil {
return nil, err // return nil, err
} //}
if len(users) > 1 { //if len(users) > 1 {
return nil, errors.New("数据异常,用户电话不唯一,联系管理员") // return nil, errors.New("数据异常,用户电话不唯一,联系管理员")
} //}
//
// 获取用户信息,是否注册 //// 获取用户信息,是否注册
userInfo, err := wechat.GetOauth2UserInfo(ctx, openObj.AccessToken, openObj.Openid) //userInfo, err := wechat.GetOauth2UserInfo(ctx, openObj.AccessToken, openObj.Openid)
if err != nil { //if err != nil {
return nil, err // return nil, err
} //}
//
var userObj *model.User //var userObj *model.User
timeNow := time.Now() //timeNow := time.Now()
switch len(users) { //switch len(users) {
case 0: //case 0:
// 用户不存在,创建并返回用户 // // 用户不存在,创建并返回用户
userBase := &model.User{ // userBase := &model.User{
CreatedAt: &timeNow, // CreatedAt: &timeNow,
UpdatedAt: &timeNow, // UpdatedAt: &timeNow,
LastOperator: "系统新增", // LastOperator: "系统新增",
DeletedAt: &utils.DefaultTimeValue, // DeletedAt: &utils.DefaultTimeValue,
UserID: utils.GetUUID(), // UserID: utils.GetUUID(),
Password: "", // Password: "",
Name: userInfo.Nickname, // Name: userInfo.Nickname,
Mobile: phone, // Mobile: phone,
Email: "", // Email: "",
Avatar: userInfo.Headimgurl, // Avatar: userInfo.Headimgurl,
Status: 1, // Status: 1,
Type: 1, // Type: 1,
Company: "", // Company: "",
CityCode: 0, // CityCode: 0,
DistrictCode: 0, // DistrictCode: 0,
Address: "", // Address: "",
IDCardNo: "", // IDCardNo: "",
Remark: "", // Remark: "",
LastLoginAt: &timeNow, // LastLoginAt: &timeNow,
LastLoginIP: ctx.ClientIP(), // LastLoginIP: ctx.ClientIP(),
LastLoginType: model.OrderOriginWxMini, // LastLoginType: model.OrderOriginWxMini,
OpenId: userInfo.Openid, // OpenId: userInfo.Openid,
UnionId: userInfo.Unionid, // UnionId: userInfo.Unionid,
} // }
if err := dao.CreateUserWx(userBase); err != nil { // if err := dao.CreateUserWx(userBase); err != nil {
return nil, err // return nil, err
} // }
userObj = userBase // userObj = userBase
case 1: //case 1:
// 用户使用电话号码登录,未使用微信登录 // // 用户使用电话号码登录,未使用微信登录
if users[0].OpenId == "" { // if users[0].OpenId == "" {
users[0].Name = userInfo.Nickname // users[0].Name = userInfo.Nickname
users[0].Avatar = userInfo.Headimgurl // users[0].Avatar = userInfo.Headimgurl
users[0].OpenId = userInfo.Openid // users[0].OpenId = userInfo.Openid
users[0].UnionId = userInfo.Unionid // users[0].UnionId = userInfo.Unionid
} // }
// 用户存在,判断用户 // // 用户存在,判断用户
users[0].UpdatedAt = &timeNow // users[0].UpdatedAt = &timeNow
users[0].LastOperator = users[0].Name // users[0].LastOperator = users[0].Name
users[0].LastLoginIP = ctx.ClientIP() // users[0].LastLoginIP = ctx.ClientIP()
if err := dao.UpdateUserWx(users[0], []string{"updated_at", "last_operator", "last_login_ip", "name", "avatar", "open_id", "union_id"}); err != nil { // if err := dao.UpdateUserWx(users[0], []string{"updated_at", "last_operator", "last_login_ip", "name", "avatar", "open_id", "union_id"}); err != nil {
return nil, err // return nil, err
} // }
userObj = users[0] // userObj = users[0]
} //}
//
return userObj, err //return userObj, err
return nil, nil
} }
// GetUserPhoneNum 解密用户手机号 // GetUserPhoneNum 解密用户手机号
func (u *UserLogin) GetUserPhoneNum(param *wxLogin.WeChatPhoneNumberParam) (string, error) { func (u *UserLogin) GetUserPhoneNum(param *wxLogin.WeChatPhoneNumberParam) (string, error) {
sessionInfo, err := api.WeixinMiniAPI.SNSCode2Session(param.Code) //sessionInfo, err := api.WeixinMiniAPI.SNSCode2Session(param.Code)
if err != nil { //if err != nil {
return "", err // return "", err
} //}
//
weChatLogin := new(wechat.UserPhone) //weChatLogin := new(wechat.UserPhone)
if err := DecryptOpenDataToStruct(param.EncryptedData, param.IV, sessionInfo.SessionKey, weChatLogin); err != nil { //if err := DecryptOpenDataToStruct(param.EncryptedData, param.IV, sessionInfo.SessionKey, weChatLogin); err != nil {
return "", err // return "", err
} //}
return weChatLogin.PhoneNumber, nil //return weChatLogin.PhoneNumber, nil
return "", nil
} }
// DecryptOpenDataToStruct 解密开放数据到结构体 // DecryptOpenDataToStruct 解密开放数据到结构体
@@ -153,9 +148,9 @@ func DecryptOpenDataToStruct(encryptedData, iv, sessionKey string, beanPtr inter
blockMode = cipher.NewCBCDecrypter(block, ivKey) blockMode = cipher.NewCBCDecrypter(block, ivKey)
plainText = make([]byte, len(cipherText)) plainText = make([]byte, len(cipherText))
blockMode.CryptBlocks(plainText, cipherText) blockMode.CryptBlocks(plainText, cipherText)
if len(plainText) > 0 { //if len(plainText) > 0 {
plainText = xaes.PKCS7UnPadding(plainText) // plainText = xaes.PKCS7UnPadding(plainText)
} //}
if err = json.Unmarshal(plainText, beanPtr); err != nil { if err = json.Unmarshal(plainText, beanPtr); err != nil {
return fmt.Errorf("json.Marshal(%s)%w", string(plainText), err) return fmt.Errorf("json.Marshal(%s)%w", string(plainText), err)
} }