Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Q
qk_backend
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
quanku
qk_backend
Commits
915d3a55
Commit
915d3a55
authored
Aug 08, 2023
by
muhong
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
修改 小程序登录接口
parent
0747b6a3
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
120 additions
and
100 deletions
+120
-100
ch-core/src/main/resources/application-dev.yml
ch-core/src/main/resources/application-dev.yml
+4
-2
ch-core/src/main/resources/application-prod.yml
ch-core/src/main/resources/application-prod.yml
+4
-2
ch-wx-api/src/main/java/com/wwdz/ch/wx/impl/UserServiceImpl.java
...pi/src/main/java/com/wwdz/ch/wx/impl/UserServiceImpl.java
+60
-96
ch-wx-api/src/main/java/com/wwdz/ch/wx/impl/WxLoginServiceImpl.java
...src/main/java/com/wwdz/ch/wx/impl/WxLoginServiceImpl.java
+47
-0
ch-wx-api/src/main/java/com/wwdz/ch/wx/service/WxLoginService.java
.../src/main/java/com/wwdz/ch/wx/service/WxLoginService.java
+5
-0
No files found.
ch-core/src/main/resources/application-dev.yml
View file @
915d3a55
...
...
@@ -2,7 +2,7 @@ dts:
# 开发者应该设置成自己的wx相关信息
wx
:
app-id
:
wx3618eab6c8b144af
app-secret
:
788559035a21b8a75b0c03f9281d5c0a
app-secret
:
6fee0d7b2197845fed0a3fe8f5a9bd66
mch-id
:
1538666666
mch-key
:
1538xxxxxx-1538xxxxxx-1538xxxxxx
notify-url
:
https://test.dtsshop.com/demo/order/dtsNotify
...
...
@@ -169,4 +169,6 @@ spring:
server
:
servlet
:
session
:
timeout
:
720
\ No newline at end of file
timeout
:
720
avatar-url
:
https://cdn.wanwudezhi.com/static/web-static/image/b888cc6cb9c004dc342f573653e38ebd_690x690.png
\ No newline at end of file
ch-core/src/main/resources/application-prod.yml
View file @
915d3a55
...
...
@@ -2,7 +2,7 @@ dts:
# 开发者应该设置成自己的wx相关信息
wx
:
app-id
:
wx3618eab6c8b144af
app-secret
:
1a6e073ad84a1a44b6e882f3995bc400
app-secret
:
6fee0d7b2197845fed0a3fe8f5a9bd66
mch-id
:
1538666666
mch-key
:
1538xxxxxx-1538xxxxxx-1538xxxxxx
notify-url
:
https://test.dtsshop.com/demo/order/dtsNotify
...
...
@@ -167,4 +167,6 @@ spring:
server
:
servlet
:
session
:
timeout
:
720
\ No newline at end of file
timeout
:
720
avatar-url
:
https://cdn.wanwudezhi.com/static/web-static/image/b888cc6cb9c004dc342f573653e38ebd_690x690.png
\ No newline at end of file
ch-wx-api/src/main/java/com/wwdz/ch/wx/impl/UserServiceImpl.java
View file @
915d3a55
package
com.wwdz.ch.wx.impl
;
import
cn.binarywang.wx.miniapp.api.WxMaService
;
import
cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult
;
import
cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo
;
import
com.alibaba.fastjson.JSONObject
;
import
com.wwdz.ch.core.captcha.CaptchaCodeManager
;
import
com.wwdz.ch.core.notify.NotifyService
;
...
...
@@ -12,6 +9,8 @@ import com.wwdz.ch.core.type.Result;
import
com.wwdz.ch.core.type.UserTypeEnum
;
import
com.wwdz.ch.core.util.CharUtil
;
import
com.wwdz.ch.core.util.RegexUtil
;
import
com.wwdz.ch.core.util.UUID
;
import
com.wwdz.ch.core.util.bcrypt.BCryptPasswordEncoder
;
import
com.wwdz.ch.db.dao.UserDao
;
import
com.wwdz.ch.db.domain.User
;
import
com.wwdz.ch.wx.constant.CacheCodeEnum
;
...
...
@@ -22,6 +21,7 @@ import com.wwdz.ch.wx.entity.request.UserRequestDto;
import
com.wwdz.ch.wx.service.FavoritesService
;
import
com.wwdz.ch.wx.service.UserService
;
import
com.wwdz.ch.wx.service.UserTokenManager
;
import
com.wwdz.ch.wx.service.WxLoginService
;
import
com.wwdz.ch.wx.util.IpUtil
;
import
com.wwdz.ch.wx.util.StringUtil
;
import
com.wwdz.ch.wx.util.WxResponseCode
;
...
...
@@ -29,6 +29,7 @@ import org.apache.commons.lang3.StringUtils;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.context.ApplicationContext
;
import
org.springframework.stereotype.Service
;
import
org.springframework.transaction.annotation.Transactional
;
...
...
@@ -47,8 +48,6 @@ public class UserServiceImpl implements UserService {
@Autowired
private
UserDao
userDao
;
@Autowired
private
WxMaService
wxMaService
;
@Autowired
private
UserTokenManager
userTokenManager
;
@Autowired
private
NotifyService
notifyService
;
...
...
@@ -56,54 +55,45 @@ public class UserServiceImpl implements UserService {
private
ApplicationContext
applicationContext
;
@Autowired
private
FavoritesService
favoritesService
;
@Autowired
private
WxLoginService
wxLoginService
;
@Transactional
(
rollbackFor
=
Exception
.
class
)
@Value
(
"${avatar-url}"
)
private
String
avatarUrl
;
@Transactional
@Override
public
Result
loginByWx
(
UserRequestDto
dto
,
HttpServletRequest
request
)
{
try
{
String
code
=
dto
.
getCode
();
// 获取微信用户的sessionKey和openId
String
sessionKey
=
null
;
String
openId
=
null
;
String
mobile
=
""
;
try
{
WxMaJscode2SessionResult
result
=
wxMaService
.
getUserService
().
getSessionInfo
(
code
);
sessionKey
=
result
.
getSessionKey
();
openId
=
result
.
getOpenid
();
mobile
=
wxLoginService
.
getPhone
(
dto
.
getCode
());
}
catch
(
Exception
e
)
{
logger
.
error
(
"
微信登录,调用官方接口失败:{}"
,
code
,
e
);
return
Result
.
failed
(
"
微信登录失败,获取openid
失败"
);
logger
.
error
(
"
获取微信用户手机号失败"
,
e
);
return
Result
.
failed
(
"
获取微信用户手机号
失败"
);
}
if
(
sessionKey
==
null
||
openId
==
null
)
{
logger
.
error
(
"
微信登录,调用官方接口失败:{}"
,
code
);
return
Result
.
failed
(
"
微信登录失败,获取openid
失败"
);
if
(
StringUtils
.
isBlank
(
mobile
)
)
{
logger
.
error
(
"
获取微信用户手机号失败"
);
return
Result
.
failed
(
"
获取微信用户手机号
失败"
);
}
// 获取用户微信绑定的手机号
String
mobile
=
""
;
if
(
StringUtils
.
isNotBlank
(
dto
.
getEncryptedData
())
&&
StringUtils
.
isNotBlank
(
dto
.
getIv
()))
{
try
{
WxMaPhoneNumberInfo
wxMaPhoneNumberInfo
=
wxMaService
.
getUserService
().
getPhoneNoInfo
(
sessionKey
,
dto
.
getEncryptedData
(),
dto
.
getIv
());
mobile
=
wxMaPhoneNumberInfo
.
getPhoneNumber
();
}
catch
(
Exception
e
)
{
logger
.
error
(
"微信登录,调用官方获取手机号接口失败:{}"
,
code
,
e
);
}
}
User
user
=
userDao
.
queryByOid
(
openId
);
if
(
user
==
null
)
{
User
user
=
userDao
.
queryByMobile
(
mobile
);
if
(
Objects
.
isNull
(
user
))
{
user
=
new
User
();
user
.
setUsername
(
openId
);
user
.
setPassword
(
openId
);
user
.
setWeixinOpenid
(
openId
);
user
.
setAvatar
(
dto
.
getAvatarUrl
());
user
.
setNickname
(
"微信用户"
+
StringUtil
.
generateRandomString
(
10
));
user
.
setUsername
(
"user"
+
mobile
);
BCryptPasswordEncoder
bCryptPasswordEncoder
=
new
BCryptPasswordEncoder
();
user
.
setPassword
(
bCryptPasswordEncoder
.
encode
(
"Aa123456"
));
user
.
setWeixinOpenid
(
""
);
user
.
setMobile
(
mobile
);
user
.
setAvatar
(
avatarUrl
);
user
.
setNickname
(
"收藏家"
+
StringUtil
.
generateRandomString
(
10
));
user
.
setGender
((
byte
)
0
);
user
.
setUserLevel
((
byte
)
0
);
user
.
setStatus
((
byte
)
0
);
user
.
setLastLoginTime
(
new
Date
());
user
.
setLastLoginIp
(
IpUtil
.
client
(
request
));
user
.
setShareUserId
(
dto
.
getShareUserId
());
user
.
setMobile
(
mobile
);
userDao
.
insert
(
user
);
FavoritesRequestDto
favoritesRequestDto
=
new
FavoritesRequestDto
();
...
...
@@ -113,7 +103,7 @@ public class UserServiceImpl implements UserService {
user
.
setLastLoginTime
(
new
Date
());
user
.
setLastLoginIp
(
IpUtil
.
client
(
request
));
if
(
userDao
.
updateById
(
user
)
==
0
)
{
return
Result
.
failed
(
505
,
"更新用户数据
失败"
);
logger
.
error
(
"更新用户最后登录信息
失败"
);
}
}
...
...
@@ -122,20 +112,21 @@ public class UserServiceImpl implements UserService {
try
{
userToken
=
userTokenManager
.
generateToken
(
user
.
getId
());
}
catch
(
Exception
e
)
{
logger
.
error
(
"微信登录失败,生成token失败:{}"
,
user
.
getId
(),
e
);
return
Result
.
failed
(
"微信登录失败,生成token失败"
);
logger
.
error
(
"微信
快捷
登录失败,生成token失败:{}"
,
user
.
getId
(),
e
);
return
Result
.
failed
(
"微信
快捷
登录失败,生成token失败"
);
}
userToken
.
setSessionKey
(
sessionKey
);
userToken
.
setSessionKey
(
UUID
.
randomUUID
().
toString
().
replace
(
"-"
,
""
)
);
UserInfo
userInfo
=
new
UserInfo
();
Map
<
Object
,
Object
>
result
=
new
HashMap
<
Object
,
Object
>();
result
.
put
(
"token"
,
userToken
.
getToken
());
result
.
put
(
"tokenExpire"
,
userToken
.
getExpireTime
().
toString
());
UserInfo
userInfo
=
new
UserInfo
();
userInfo
.
setUserId
(
user
.
getId
());
userInfo
.
setPhone
(
user
.
getMobile
());
userInfo
.
setAvatarUrl
(
user
.
getAvatar
());
userInfo
.
setGender
(
user
.
getGender
());
userInfo
.
setNickName
(
user
.
getNickname
());
userInfo
.
setWechatId
(
user
.
getWechatId
());
if
(!
StringUtils
.
isEmpty
(
user
.
getMobile
()))
{
// 手机号存在则设置
userInfo
.
setPhone
(
user
.
getMobile
());
}
SimpleDateFormat
simpleDateFormat
=
new
SimpleDateFormat
(
"yyyy-MM-dd"
);
String
registerDate
=
simpleDateFormat
.
format
(
Objects
.
isNull
(
user
.
getAddTime
())
?
new
Date
()
:
user
.
getAddTime
());
userInfo
.
setRegisterDate
(
registerDate
);
...
...
@@ -146,14 +137,13 @@ public class UserServiceImpl implements UserService {
userInfo
.
setUserLevelDesc
(
UserTypeEnum
.
getInstance
(
user
.
getUserLevel
()).
getDesc
());
result
.
put
(
"userInfo"
,
userInfo
);
logger
.
info
(
"【请求结束】
微信
登录,响应结果:{}"
,
JSONObject
.
toJSONString
(
result
));
logger
.
info
(
"【请求结束】
手机号
登录,响应结果:{}"
,
JSONObject
.
toJSONString
(
result
));
return
Result
.
success
(
result
);
}
catch
(
Exception
e
){
logger
.
error
(
"微信登录失败"
,
e
);
}
catch
(
Exception
e
)
{
logger
.
error
(
"微信
快捷
登录失败"
,
e
);
TransactionAspectSupport
.
currentTransactionStatus
().
setRollbackOnly
();
return
Result
.
failed
(
"微信登录失败"
);
return
Result
.
failed
(
"微信
快捷
登录失败"
);
}
}
@Override
...
...
@@ -199,59 +189,33 @@ public class UserServiceImpl implements UserService {
return
Result
.
failed
(
"验证码不正确"
);
}
// 获取微信授权信息
String
openId
=
""
;
String
sessionKey
=
""
;
try
{
WxMaJscode2SessionResult
result
=
wxMaService
.
getUserService
().
getSessionInfo
(
dto
.
getCode
());
openId
=
result
.
getOpenid
();
sessionKey
=
result
.
getSessionKey
();
}
catch
(
Exception
e
)
{
logger
.
error
(
"微信登录,调用官方接口失败:{}"
,
dto
.
getCode
(),
e
);
return
Result
.
failed
(
"手机号登录失败,获取openid失败"
);
}
if
(
StringUtils
.
isBlank
(
openId
))
{
return
Result
.
failed
(
"手机号登录失败,获取openid失败"
);
}
// 判断手机号用户是否存在
User
user
=
userDao
.
queryByMobile
(
dto
.
getMobile
());
if
(
Objects
.
isNull
(
user
))
{
User
openUser
=
userDao
.
queryByOid
(
openId
);
if
(
Objects
.
isNull
(
openUser
))
{
user
=
new
User
();
user
.
setUsername
(
openId
);
user
.
setPassword
(
openId
);
user
.
setWeixinOpenid
(
openId
);
user
.
setMobile
(
dto
.
getMobile
());
user
.
setAvatar
(
dto
.
getAvatarUrl
());
user
.
setNickname
(
"微信用户"
+
StringUtil
.
generateRandomString
(
10
));
user
.
setGender
((
byte
)
0
);
user
.
setUserLevel
((
byte
)
0
);
user
.
setStatus
((
byte
)
0
);
user
.
setLastLoginTime
(
new
Date
());
user
.
setLastLoginIp
(
IpUtil
.
client
(
request
));
user
.
setShareUserId
(
dto
.
getShareUserId
());
userDao
.
insert
(
user
);
user
=
new
User
();
user
.
setUsername
(
"user"
+
dto
.
getMobile
());
BCryptPasswordEncoder
bCryptPasswordEncoder
=
new
BCryptPasswordEncoder
();
user
.
setPassword
(
bCryptPasswordEncoder
.
encode
(
"Aa123456"
));
user
.
setWeixinOpenid
(
""
);
user
.
setMobile
(
dto
.
getMobile
());
user
.
setAvatar
(
avatarUrl
);
user
.
setNickname
(
"收藏家"
+
StringUtil
.
generateRandomString
(
10
));
user
.
setGender
((
byte
)
0
);
user
.
setUserLevel
((
byte
)
0
);
user
.
setStatus
((
byte
)
0
);
user
.
setLastLoginTime
(
new
Date
());
user
.
setLastLoginIp
(
IpUtil
.
client
(
request
));
user
.
setShareUserId
(
dto
.
getShareUserId
());
userDao
.
insert
(
user
);
FavoritesRequestDto
favoritesRequestDto
=
new
FavoritesRequestDto
();
favoritesRequestDto
.
setUserId
(
user
.
getId
());
favoritesService
.
addDefault
(
favoritesRequestDto
);
}
else
{
user
=
openUser
;
user
.
setMobile
(
dto
.
getMobile
());
user
.
setLastLoginTime
(
new
Date
());
user
.
setLastLoginIp
(
IpUtil
.
client
(
request
));
if
(
userDao
.
updateById
(
user
)
==
0
)
{
return
Result
.
failed
(
505
,
"更新用户数据失败"
);
}
}
FavoritesRequestDto
favoritesRequestDto
=
new
FavoritesRequestDto
();
favoritesRequestDto
.
setUserId
(
user
.
getId
());
favoritesService
.
addDefault
(
favoritesRequestDto
);
}
else
{
user
.
setLastLoginTime
(
new
Date
());
user
.
setLastLoginIp
(
IpUtil
.
client
(
request
));
if
(
userDao
.
updateById
(
user
)
==
0
)
{
return
Result
.
failed
(
505
,
"更新用户数据
失败"
);
logger
.
error
(
"更新用户最后登录信息
失败"
);
}
}
...
...
@@ -263,7 +227,7 @@ public class UserServiceImpl implements UserService {
logger
.
error
(
"手机号登录失败,生成token失败:{}"
,
user
.
getId
(),
e
);
return
Result
.
failed
(
"手机号登录失败,生成token失败"
);
}
userToken
.
setSessionKey
(
sessionKey
);
userToken
.
setSessionKey
(
UUID
.
randomUUID
().
toString
().
replace
(
"-"
,
""
)
);
Map
<
Object
,
Object
>
result
=
new
HashMap
<
Object
,
Object
>();
result
.
put
(
"token"
,
userToken
.
getToken
());
...
...
ch-wx-api/src/main/java/com/wwdz/ch/wx/impl/WxLoginServiceImpl.java
0 → 100644
View file @
915d3a55
package
com.wwdz.ch.wx.impl
;
import
cn.binarywang.wx.miniapp.api.impl.WxMaServiceImpl
;
import
com.wwdz.ch.core.util.HttpUtil
;
import
com.wwdz.ch.wx.service.WxLoginService
;
import
com.xxdxxs.utils.JsonUtils
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.stereotype.Service
;
import
java.util.HashMap
;
import
java.util.Map
;
@Service
public
class
WxLoginServiceImpl
implements
WxLoginService
{
private
static
final
Logger
logger
=
LoggerFactory
.
getLogger
(
WxMaServiceImpl
.
class
);
private
static
final
String
GET_ACCESS_TOKEN_URL
=
"https://api.weixin.qq.com/cgi-bin/stable_token"
;
private
static
final
String
GET_PHONE_URL
=
"https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=%s"
;
@Value
(
"${dts.wx.app-id}"
)
private
String
appid
;
@Value
(
"${dts.wx.app-secret}"
)
private
String
secret
;
@Override
public
String
getPhone
(
String
code
)
{
logger
.
info
(
"开始获取access_token----------------"
);
Map
<
String
,
String
>
tokenParam
=
new
HashMap
<>();
tokenParam
.
put
(
"grant_type"
,
"client_credential"
);
tokenParam
.
put
(
"appid"
,
appid
);
tokenParam
.
put
(
"secret"
,
secret
);
String
tokenResult
=
HttpUtil
.
sendPost
(
GET_ACCESS_TOKEN_URL
,
tokenParam
);
logger
.
info
(
"获取access_token的结果是:"
+
tokenResult
);
String
accessToken
=
JsonUtils
.
getValueByPath
(
tokenResult
,
"access_token"
);
logger
.
info
(
"开始获取phone-----------------------"
);
String
url
=
String
.
format
(
GET_PHONE_URL
,
accessToken
);
Map
<
String
,
String
>
phoneParam
=
new
HashMap
<>();
phoneParam
.
put
(
"code"
,
code
);
String
phoneResult
=
HttpUtil
.
sendPost
(
url
,
phoneParam
);
logger
.
info
(
"获取phone的结果是:"
+
phoneResult
);
return
JsonUtils
.
getValueByPath
(
phoneResult
,
"phone_info/phoneNumber"
);
}
}
ch-wx-api/src/main/java/com/wwdz/ch/wx/service/WxLoginService.java
0 → 100644
View file @
915d3a55
package
com.wwdz.ch.wx.service
;
public
interface
WxLoginService
{
String
getPhone
(
String
code
);
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment