238 lines
6.6 KiB
Go
238 lines
6.6 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
|
|
}
|
|
globals.SugarLogger.Debugf("userParam =============:%s", utils.Format4Output(param, false))
|
|
|
|
// 检查用户是否存在
|
|
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 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].OpenId != openObj.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", "name", "avatar", "last_login_ip", "open_id", "union_id"}); err != nil {
|
|
globals.SugarLogger.Debugf("====err:%s", err.Error())
|
|
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
|
|
}
|
|
|
|
// GetAppJupLink 获取小程序跳转短连接
|
|
func (u *UserLogin) GetAppJupLink() (string, error) {
|
|
return api.WeixinMiniAPI.MiniProgramSortLink()
|
|
}
|