Files
jx-print/services/print_server/app_server/wx_login.go
邹宗楠 5f755c01df 1
2022-09-21 10:32:41 +08:00

234 lines
6.4 KiB
Go

package app_server
import (
"encoding/json"
"errors"
"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"
wxLogin "git.rosy.net.cn/jx-print/model/app_model"
"git.rosy.net.cn/jx-print/services/api"
"github.com/gin-gonic/gin"
"io/ioutil"
"net/http"
"net/url"
"strconv"
"strings"
"time"
)
type UserLogin struct {
}
// WxLogin 授权登录
func (u *UserLogin) WxLogin(ctx *gin.Context, param *wxLogin.WxLoginReq) (*model.User, error) {
openObj, err := api.WeixinMiniAPI.SNSCode2Session(param.Code)
if err != nil {
return nil, err
}
// 检查用户是否存在
users, err := dao.GetUsers(globals.GetDB(), "", "", param.Phone, openObj.OpenID)
if err != nil {
return nil, err
}
if len(users) > 1 {
return nil, errors.New("数据异常,用户电话不唯一,联系管理员")
}
var userObj *model.User
timeNow := time.Now()
switch len(users) {
case 0:
// 用户不存在,创建并返回用户
userBase := &model.User{
CreatedAt: &timeNow,
UpdatedAt: &timeNow,
LastOperator: "系统新增",
DeletedAt: &utils.DefaultTimeValue,
UserID: utils.GetUUID(),
Password: "",
Name: param.NickName,
Mobile: param.Phone,
Email: "",
Avatar: param.HeadUrl,
Status: 1,
Type: 1,
Company: "",
CityCode: 0,
DistrictCode: 0,
Address: "",
IDCardNo: "",
Remark: "",
LastLoginAt: &timeNow,
LastLoginIP: ctx.ClientIP(),
LastLoginType: model.OrderOriginWxMini,
OpenId: openObj.OpenID,
UnionId: openObj.UnionID,
}
if err := dao.CreateUserWx(userBase); err != nil {
return nil, err
}
userObj = userBase
case 1:
// 用户使用电话号码登录,未使用微信登录
if users[0].OpenId == "" {
users[0].Name = param.NickName
users[0].Avatar = param.HeadUrl
users[0].OpenId = openObj.OpenID
users[0].UnionId = openObj.UnionID
// 用户存在,判断用户
users[0].UpdatedAt = &timeNow
users[0].LastOperator = users[0].Name
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 {
return nil, err
}
} else {
// 用户存在,判断用户
users[0].UpdatedAt = &timeNow
users[0].LastOperator = users[0].Name
users[0].LastLoginIP = ctx.ClientIP()
if err := dao.UpdateUserWx(users[0], []string{"updated_at", "last_operator", "last_login_ip"}); err != nil {
return nil, err
}
}
userObj = users[0]
}
return userObj, err
}
// MobileLogin 短信验证登录
func (u *UserLogin) MobileLogin(ctx *gin.Context, param *wxLogin.MobileLogin) (*model.User, error) {
// 校验用户信息
isHave, err := SendVerifyCodeServer.VerifySecret(param.Phone, param.BizId, param.Code)
if err != nil {
return nil, err
}
if !isHave {
return nil, errors.New("验证码错误")
}
// 检查用户是否存在
users, err := dao.GetUsers(globals.GetDB(), "", "", param.Phone, "")
if err != nil {
return nil, err
}
var userObj *model.User
timeNow := time.Now()
switch len(users) {
case 1: // 用户存在
userObj = users[0]
case 0: // 用户不存在
// 用户不存在,创建并返回用户
userBase := &model.User{
CreatedAt: &timeNow,
UpdatedAt: &timeNow,
LastOperator: "系统新增",
DeletedAt: &utils.DefaultTimeValue,
UserID: utils.GetUUID(),
Password: "",
Name: "手机用户_" + param.Phone,
Mobile: param.Phone,
Email: "",
Avatar: "",
Status: 1,
Type: 1,
Company: "",
CityCode: 0,
DistrictCode: 0,
Address: "",
IDCardNo: "",
Remark: "",
LastLoginAt: &timeNow,
LastLoginIP: ctx.ClientIP(),
LastLoginType: model.OrderOriginMobile,
OpenId: param.Phone + param.Code,
UnionId: param.Phone + param.Code,
}
if err := dao.CreateUserWx(userBase); err != nil {
return nil, err
}
userObj = userBase
}
return userObj, nil
}
// GetUserPhoneNum 解密用户手机号
func (u *UserLogin) GetUserPhoneNum(param *wxLogin.WeChatPhoneNumberParam) (string, bool, error) {
phone, err := api.WeixinMiniAPI.SNSGetUserPhone(param.Code)
if err != nil {
if strings.Contains(err.Error(), "access_token expired") || strings.Contains(err.Error(), "42001") {
api.WeixinMiniAPI.CBSetToken("")
u.GetUserPhoneNum(param)
} else {
return "", false, err
}
}
// 检查用户是否存在
users, err := dao.GetUsers(globals.GetDB(), "", "", phone, "")
if err != nil {
return "", false, err
}
if len(users) != 1 {
return phone, false, nil
}
isRegion := false
if users[0].OpenId != "" {
isRegion = true
}
return phone, isRegion, nil
}
// Jxc4UserToken 全局变量,缓存菜市管理系统token
var Jxc4UserToken = map[string]string{"token": "", "expirationTime": ""}
// GetJxc4Token 获取京西菜市token
func (u *UserLogin) GetJxc4Token() (string, error) {
if Jxc4UserToken["token"] != "" && Jxc4UserToken["expirationTime"] != "" {
timeBegin, _ := strconv.ParseInt(Jxc4UserToken["expirationTime"], 10, 64)
timeNow := time.Now().Unix()
if timeBegin-timeNow > 0 { // 没过期
return Jxc4UserToken["token"], nil
}
}
//TODO 参数为登录菜市管理系统的管理员用户账号:目前账号为 15141938808 密码111111
params := map[string]interface{}{"authType": "localpass", "authIDType": "mobile", "authID": "15141938808", "authSecret": "96e79218965eb72c92a549dd5a330112"}
retVal := make(url.Values)
for k, v := range params {
retVal.Set(k, fmt.Sprint(v))
}
strings.NewReader(utils.Map2URLValues(params).Encode())
resp, err := http.Post("https://www.jxc4.com/v2/auth2/Login", "application/x-www-form-urlencoded", strings.NewReader(retVal.Encode()))
if err != nil {
return "", err
}
defer resp.Body.Close()
bodyResp, err := ioutil.ReadAll(resp.Body)
if err != nil {
return "", err
}
jxc4User := &model.CallBack{}
fmt.Println("=============", string(bodyResp))
if err := json.Unmarshal(bodyResp, jxc4User); err != nil {
return "", err
}
user := &model.Jxc4UserData{}
if err := json.Unmarshal([]byte(jxc4User.Data), user); err != nil {
return "", err
}
Jxc4UserToken["token"] = user.Token
Jxc4UserToken["expirationTime"] = utils.Int64ToStr(time.Now().Unix() + 5*24*60*60)
return user.Token, nil
}