记得上下班打卡 | git大法好,push需谨慎
Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
L
liquidnet-bus-v1
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
董敬伟
liquidnet-bus-v1
Commits
5ae7707f
Commit
5ae7707f
authored
Jun 18, 2026
by
姜秀龙
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
小程序解密手机号-》小程序授权手机号登录
parent
2fb244b4
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
165 additions
and
65 deletions
+165
-65
FeignAdamBaseClient.java
...liquidnet/service/feign/adam/api/FeignAdamBaseClient.java
+2
-1
AdamLoginController.java
...iquidnet/service/adam/controller/AdamLoginController.java
+6
-5
SweetWechatLoginController.java
.../service/sweet/controller/SweetWechatLoginController.java
+3
-2
WechatAppletLoginInfoVo.java
...quidnet/service/sweet/dto/vo/WechatAppletLoginInfoVo.java
+91
-0
SweetWechatLoginServiceImpl.java
...rvice/sweet/service/impl/SweetWechatLoginServiceImpl.java
+63
-57
No files found.
liquidnet-bus-feign/liquidnet-api-feign-adam/src/main/java/com/liquidnet/service/feign/adam/api/FeignAdamBaseClient.java
View file @
5ae7707f
...
...
@@ -71,7 +71,8 @@ public interface FeignAdamBaseClient {
@NotBlank
(
message
=
"手机号不能为空"
)
@RequestParam
(
value
=
"mobile"
)
String
mobile
,
@NotBlank
(
message
=
"临时票据不能为空"
)
@RequestParam
(
value
=
"otp"
)
String
otp
);
@RequestParam
(
value
=
"otp"
)
String
otp
,
@RequestParam
(
value
=
"isComplete"
,
required
=
false
)
Integer
isComplete
);
@GetMapping
(
value
=
"member/check/depth"
,
headers
=
{
"Inner-Required=1"
})
ResponseDto
<
Boolean
>
isMember
(
@NotBlank
(
message
=
"用户ID不能为空"
)
@RequestParam
(
value
=
"uid"
)
String
uid
);
...
...
liquidnet-bus-service/liquidnet-service-adam/liquidnet-service-adam-impl/src/main/java/com/liquidnet/service/adam/controller/AdamLoginController.java
View file @
5ae7707f
...
...
@@ -339,7 +339,8 @@ public class AdamLoginController {
@NotBlank
(
message
=
"手机号不能为空"
)
@RequestParam
String
mobile
,
@NotBlank
(
message
=
"临时票据不能为空"
)
@RequestParam
String
otp
)
{
@RequestParam
String
otp
,
@RequestParam
(
required
=
false
)
Integer
isComplete
)
{
log
.
info
(
"login by silent for mobile:{},{}"
,
mobile
,
otp
);
long
reql
=
0
,
l
=
LocalDateTime
.
now
().
toEpochSecond
(
ZoneOffset
.
UTC
);
String
otpDecrypt
=
null
;
...
...
@@ -352,7 +353,7 @@ public class AdamLoginController {
log
.
error
(
"login by silent for mobile:{},{}/{},{}-{}"
,
mobile
,
otp
,
otpDecrypt
,
l
,
reql
);
return
ResponseDto
.
failure
(
ErrorMapping
.
get
(
"10005"
));
}
return
this
.
silentMobileLoginSuccess
(
mobile
,
null
);
return
this
.
silentMobileLoginSuccess
(
mobile
,
null
,
null
==
isComplete
?
0
:
isComplete
);
}
@ApiOperationSupport
(
order
=
7
)
...
...
@@ -372,15 +373,15 @@ public class AdamLoginController {
log
.
error
(
"login by silent v2 otp invalid, mobile:{}"
,
mobile
);
return
ResponseDto
.
failure
(
ErrorMapping
.
get
(
"10005"
));
}
return
this
.
silentMobileLoginSuccess
(
mobile
,
AdamConst
.
REGIST_SOURCE_DOUDOU
);
return
this
.
silentMobileLoginSuccess
(
mobile
,
AdamConst
.
REGIST_SOURCE_DOUDOU
,
0
);
}
private
ResponseDto
<
AdamLoginInfoVo
>
silentMobileLoginSuccess
(
String
mobile
,
String
registSource
)
{
private
ResponseDto
<
AdamLoginInfoVo
>
silentMobileLoginSuccess
(
String
mobile
,
String
registSource
,
int
isComplete
)
{
String
uid
=
adamRdmService
.
getUidByMobile
(
mobile
);
boolean
toRegister
=
StringUtils
.
isEmpty
(
uid
);
AdamUserInfoVo
userInfoVo
=
toRegister
?
adamUserService
.
register
(
mobile
,
0
,
registSource
)
?
adamUserService
.
register
(
mobile
,
isComplete
,
registSource
)
:
adamRdmService
.
getUserInfoVoByUid
(
uid
);
if
(!
toRegister
&&
(
null
==
userInfoVo
||
userInfoVo
.
getState
()
==
2
))
{
...
...
liquidnet-bus-service/liquidnet-service-sweet/src/main/java/com/liquidnet/service/sweet/controller/SweetWechatLoginController.java
View file @
5ae7707f
...
...
@@ -2,6 +2,7 @@ package com.liquidnet.service.sweet.controller;
import
com.liquidnet.service.adam.dto.vo.AdamLoginInfoVo
;
import
com.liquidnet.service.base.ResponseDto
;
import
com.liquidnet.service.sweet.dto.vo.WechatAppletLoginInfoVo
;
import
com.liquidnet.service.sweet.dto.vo.WechatTokenInfoVo
;
import
com.liquidnet.service.sweet.dto.vo.WechatUserInfoVo
;
import
com.liquidnet.service.sweet.service.impl.SweetWechatLoginServiceImpl
;
...
...
@@ -26,7 +27,7 @@ public class SweetWechatLoginController {
private
SweetWechatLoginServiceImpl
sweetLoginService
;
@GetMapping
(
"userInfo"
)
@ApiOperation
(
"小程序
解密手机号
"
)
@ApiOperation
(
"小程序
授权手机号登录
"
)
@ApiImplicitParams
({
@ApiImplicitParam
(
type
=
"query"
,
dataType
=
"String"
,
name
=
"userCode"
,
value
=
" 获取 uid oid的 code"
),
@ApiImplicitParam
(
type
=
"query"
,
dataType
=
"String"
,
name
=
"code"
,
value
=
"获取手机号的 code"
,
required
=
true
),
...
...
@@ -34,7 +35,7 @@ public class SweetWechatLoginController {
@ApiImplicitParam
(
type
=
"query"
,
dataType
=
"String"
,
name
=
"iv"
,
value
=
"iv"
),
@ApiImplicitParam
(
type
=
"query"
,
dataType
=
"Integer"
,
name
=
"type"
,
value
=
"1草莓 2五百里 3mdsk 4正在 5跳飞船 6小家伙 7摩登 8DouDou 9mootoo 10wenque"
,
required
=
true
),
})
public
ResponseDto
userInfo
(
public
ResponseDto
<
WechatAppletLoginInfoVo
>
userInfo
(
@RequestParam
(
required
=
false
)
String
userCode
,
@RequestParam
()
String
code
,
@RequestParam
(
required
=
false
)
String
encryptedData
,
...
...
liquidnet-bus-service/liquidnet-service-sweet/src/main/java/com/liquidnet/service/sweet/dto/vo/WechatAppletLoginInfoVo.java
0 → 100644
View file @
5ae7707f
package
com
.
liquidnet
.
service
.
sweet
.
dto
.
vo
;
import
com.liquidnet.service.adam.dto.vo.AdamLoginInfoVo
;
import
io.swagger.annotations.ApiModel
;
import
io.swagger.annotations.ApiModelProperty
;
@ApiModel
(
value
=
"WechatAppletLoginInfoVo"
,
description
=
"小程序登录响应(含旧版兼容字段)"
)
public
class
WechatAppletLoginInfoVo
extends
AdamLoginInfoVo
{
private
static
final
long
serialVersionUID
=
1L
;
@ApiModelProperty
(
"兼容旧版,同 userInfo.uid"
)
private
String
userId
;
@ApiModelProperty
(
"兼容旧版,同 wechatOpenid"
)
private
String
openId
;
@ApiModelProperty
(
"兼容旧版,同 wechatUnionid"
)
private
String
unionId
;
@ApiModelProperty
(
"兼容旧版"
)
private
String
getPhoneNumber
;
@ApiModelProperty
(
"兼容旧版"
)
private
String
getPurePhoneNumber
;
@ApiModelProperty
(
"兼容旧版"
)
private
String
getCountryCode
;
public
String
getUserId
()
{
return
userId
;
}
public
void
setUserId
(
String
userId
)
{
this
.
userId
=
userId
;
}
public
String
getOpenId
()
{
return
openId
;
}
public
void
setOpenId
(
String
openId
)
{
this
.
openId
=
openId
;
}
public
String
getUnionId
()
{
return
unionId
;
}
public
void
setUnionId
(
String
unionId
)
{
this
.
unionId
=
unionId
;
}
public
String
getGetPhoneNumber
()
{
return
getPhoneNumber
;
}
public
void
setGetPhoneNumber
(
String
getPhoneNumber
)
{
this
.
getPhoneNumber
=
getPhoneNumber
;
}
public
String
getGetPurePhoneNumber
()
{
return
getPurePhoneNumber
;
}
public
void
setGetPurePhoneNumber
(
String
getPurePhoneNumber
)
{
this
.
getPurePhoneNumber
=
getPurePhoneNumber
;
}
public
String
getGetCountryCode
()
{
return
getCountryCode
;
}
public
void
setGetCountryCode
(
String
getCountryCode
)
{
this
.
getCountryCode
=
getCountryCode
;
}
public
static
WechatAppletLoginInfoVo
wrap
(
AdamLoginInfoVo
loginInfo
,
String
phoneNumber
,
String
purePhoneNumber
,
String
countryCode
,
String
openId
,
String
unionId
)
{
WechatAppletLoginInfoVo
vo
=
new
WechatAppletLoginInfoVo
();
vo
.
setToken
(
loginInfo
.
getToken
());
vo
.
setUserInfo
(
loginInfo
.
getUserInfo
());
vo
.
setUserMemberVo
(
loginInfo
.
getUserMemberVo
());
vo
.
setWechatOpenid
(
loginInfo
.
getWechatOpenid
());
vo
.
setWechatUnionid
(
loginInfo
.
getWechatUnionid
());
if
(
null
!=
loginInfo
.
getUserInfo
())
{
vo
.
setUserId
(
loginInfo
.
getUserInfo
().
getUid
());
}
vo
.
setOpenId
(
openId
);
vo
.
setUnionId
(
unionId
);
vo
.
setGetPhoneNumber
(
phoneNumber
);
vo
.
setGetPurePhoneNumber
(
purePhoneNumber
);
vo
.
setGetCountryCode
(
countryCode
);
return
vo
;
}
}
liquidnet-bus-service/liquidnet-service-sweet/src/main/java/com/liquidnet/service/sweet/service/impl/SweetWechatLoginServiceImpl.java
View file @
5ae7707f
...
...
@@ -6,12 +6,12 @@ import com.liquidnet.commons.lang.util.CollectionUtil;
import
com.liquidnet.commons.lang.util.DESUtils
;
import
com.liquidnet.commons.lang.util.IDGenerator
;
import
com.liquidnet.service.adam.dto.vo.AdamLoginInfoVo
;
import
com.liquidnet.service.adam.dto.vo.AdamUserInfoVo
;
import
com.liquidnet.service.base.ErrorMapping
;
import
com.liquidnet.service.base.ResponseDto
;
import
com.liquidnet.service.base.SqlMapping
;
import
com.liquidnet.service.base.constant.MQConst
;
import
com.liquidnet.service.feign.adam.api.FeignAdamBaseClient
;
import
com.liquidnet.service.sweet.dto.vo.WechatAppletLoginInfoVo
;
import
com.liquidnet.service.sweet.dto.vo.WechatTokenInfoVo
;
import
com.liquidnet.service.sweet.dto.vo.WechatUserInfoVo
;
import
com.liquidnet.service.sweet.utils.QueueUtils
;
...
...
@@ -27,7 +27,6 @@ import org.springframework.stereotype.Service;
import
java.time.LocalDateTime
;
import
java.time.ZoneOffset
;
import
java.util.HashMap
;
import
java.util.LinkedList
;
import
java.util.Objects
;
...
...
@@ -56,7 +55,7 @@ public class SweetWechatLoginServiceImpl {
@Lazy
private
FeignAdamBaseClient
feignAdamBaseClient
;
public
ResponseDto
userInfo
(
String
userCode
,
String
code
,
String
encryptedData
,
String
iv
,
Integer
type
)
{
public
ResponseDto
<
WechatAppletLoginInfoVo
>
userInfo
(
String
userCode
,
String
code
,
String
encryptedData
,
String
iv
,
Integer
type
)
{
log
.
info
(
"小程序解密用户信息参数:[code=[{}], encryptedData=[{}], [iv=[{}], type=[{}]"
,
code
,
encryptedData
,
iv
,
type
);
try
{
WxMaJscode2SessionResult
sessionInfo
=
null
;
...
...
@@ -83,54 +82,19 @@ public class SweetWechatLoginServiceImpl {
String
phoneNumber
=
wxMaPhoneNumberInfo
.
getPhoneNumber
();
String
purePhoneNumber
=
wxMaPhoneNumberInfo
.
getPurePhoneNumber
();
String
countryCode
=
wxMaPhoneNumberInfo
.
getCountryCode
();
// mysql redis
SweetAppletUsersVo
sweetAppletUsers
=
redisUtils
.
getSweetAppletUsersOfPhone
(
purePhoneNumber
);
String
userId
=
""
;
if
(
null
==
sweetAppletUsers
)
{
// 获取adam用户信息 自动注册
ResponseDto
<
AdamUserInfoVo
>
userInfoVo
=
feignAdamBaseClient
.
registerByMobile
(
purePhoneNumber
);
AdamUserInfoVo
userInfoVoData
=
userInfoVo
.
getData
();
userId
=
userInfoVoData
.
getUid
();
String
appletUserId
=
IDGenerator
.
nextSnowId
();
LinkedList
<
String
>
sqlsA
=
CollectionUtil
.
linkedListString
();
LinkedList
<
Object
[]>
sqlsDataA
=
CollectionUtil
.
linkedListObjectArr
();
sqlsA
.
add
(
SqlMapping
.
get
(
"sweet_applet_users.insert"
));
sqlsDataA
.
add
(
new
Object
[]{
appletUserId
,
userId
,
openId
,
unionId
,
phoneNumber
,
purePhoneNumber
,
countryCode
,
type
});
queueUtils
.
sendMsgByRedis
(
MQConst
.
SweetQueue
.
SWEET_WECHAT_USER_INSERT
.
getKey
(),
SqlMapping
.
gets
(
sqlsA
,
sqlsDataA
));
SweetAppletUsersVo
sweetAppletUsersVo
=
SweetAppletUsersVo
.
getNew
();
sweetAppletUsersVo
.
setAppletUserId
(
appletUserId
);
sweetAppletUsersVo
.
setUserId
(
userId
);
sweetAppletUsersVo
.
setOpenId
(
openId
);
sweetAppletUsersVo
.
setUnionId
(
unionId
);
sweetAppletUsersVo
.
setPhoneNumber
(
phoneNumber
);
sweetAppletUsersVo
.
setPurePhoneNumber
(
purePhoneNumber
);
sweetAppletUsersVo
.
setCountryCode
(
countryCode
);
sweetAppletUsersVo
.
setType
(
type
);
redisUtils
.
setSweetAppletUsers
(
sweetAppletUsersVo
);
// 调用关注赠积分任务 这里如果不调用的话
// 1。关注过了也登陆过小程序的可以脚本处理 脚本不处理就需要每个用户点进入小程序登陆
// 2。关注过了 无小程序的 本次登陆才有的 接口也不是前端请求的 就没有地方触发做任务接口
// 3。有小程序未关注的就关注时候适用
/*SweetWechatUsersVo sweetWechatUsersSky = redisUtils.getSweetWechatUsersOfUnionId(unionId, 2);
if (null != sweetWechatUsersSky) {
feignStoneIntegralClient.doTask(4, userId);
}*/
}
else
{
userId
=
sweetAppletUsers
.
getUserId
();
boolean
needSweetBinding
=
null
==
redisUtils
.
getSweetAppletUsersOfPhone
(
purePhoneNumber
);
ResponseDto
<
AdamLoginInfoVo
>
loginResp
=
this
.
loginByPhoneWithWechat
(
purePhoneNumber
,
openId
,
unionId
,
needSweetBinding
?
1
:
null
);
if
(!
loginResp
.
isSuccess
()
||
null
==
loginResp
.
getData
())
{
return
ResponseDto
.
failure
(
loginResp
.
getCode
(),
loginResp
.
getMessage
());
}
if
(
needSweetBinding
)
{
this
.
bindSweetAppletUser
(
loginResp
.
getData
().
getUserInfo
().
getUid
(),
openId
,
unionId
,
phoneNumber
,
purePhoneNumber
,
countryCode
,
type
);
}
// 返回给前端数据
HashMap
<
String
,
Object
>
userInfo
=
CollectionUtil
.
mapStringObject
();
userInfo
.
put
(
"unionId"
,
unionId
);
userInfo
.
put
(
"openId"
,
openId
);
userInfo
.
put
(
"userId"
,
userId
);
userInfo
.
put
(
"getPhoneNumber"
,
phoneNumber
);
userInfo
.
put
(
"getPurePhoneNumber"
,
purePhoneNumber
);
userInfo
.
put
(
"getCountryCode"
,
countryCode
);
return
ResponseDto
.
success
(
userInfo
);
return
ResponseDto
.
success
(
WechatAppletLoginInfoVo
.
wrap
(
loginResp
.
getData
(),
phoneNumber
,
purePhoneNumber
,
countryCode
,
openId
,
unionId
));
}
catch
(
Exception
e
)
{
log
.
error
(
"WechatUserInfoError Exception:{}"
,
e
);
return
ResponseDto
.
failure
();
...
...
@@ -186,16 +150,58 @@ public class SweetWechatLoginServiceImpl {
if
(
null
==
sweetAppletUsersVo
)
{
return
ResponseDto
.
failure
(
ErrorMapping
.
get
(
"90081"
));
}
String
purePhone
=
sweetAppletUsersVo
.
getPurePhoneNumber
();
String
otp
=
DESUtils
.
DES
().
encrypt
(
purePhone
+
LocalDateTime
.
now
().
toEpochSecond
(
ZoneOffset
.
UTC
));
ResponseDto
<
AdamLoginInfoVo
>
adamUserInfoVoResponseDto
=
feignAdamBaseClient
.
loginBySilentMobile
(
purePhone
,
otp
);
AdamLoginInfoVo
adamLoginInfoVo
=
adamUserInfoVoResponseDto
.
getData
();
adamLoginInfoVo
.
setWechatOpenid
(
sweetAppletUsersVo
.
getOpenId
());
adamLoginInfoVo
.
setWechatUnionid
(
sweetAppletUsersVo
.
getUnionId
());
return
ResponseDto
.
success
(
adamLoginInfoVo
);
return
this
.
loginByPhoneWithWechat
(
sweetAppletUsersVo
.
getPurePhoneNumber
(),
sweetAppletUsersVo
.
getOpenId
(),
sweetAppletUsersVo
.
getUnionId
()
);
}
catch
(
Exception
e
)
{
log
.
error
(
"userInfoMaError Exception:{}"
,
e
);
return
ResponseDto
.
failure
(
"获取用户信息失败~"
);
}
}
private
ResponseDto
<
AdamLoginInfoVo
>
loginByPhoneWithWechat
(
String
purePhone
,
String
openId
,
String
unionId
)
{
return
this
.
loginByPhoneWithWechat
(
purePhone
,
openId
,
unionId
,
null
);
}
private
ResponseDto
<
AdamLoginInfoVo
>
loginByPhoneWithWechat
(
String
purePhone
,
String
openId
,
String
unionId
,
Integer
isComplete
)
{
try
{
String
otp
=
DESUtils
.
DES
().
encrypt
(
purePhone
+
LocalDateTime
.
now
().
toEpochSecond
(
ZoneOffset
.
UTC
));
ResponseDto
<
AdamLoginInfoVo
>
loginResp
=
feignAdamBaseClient
.
loginBySilentMobile
(
purePhone
,
otp
,
isComplete
);
if
(!
loginResp
.
isSuccess
()
||
null
==
loginResp
.
getData
())
{
return
ResponseDto
.
failure
(
loginResp
.
getCode
(),
loginResp
.
getMessage
());
}
AdamLoginInfoVo
loginInfoVo
=
loginResp
.
getData
();
loginInfoVo
.
setWechatOpenid
(
openId
);
loginInfoVo
.
setWechatUnionid
(
unionId
);
return
ResponseDto
.
success
(
loginInfoVo
);
}
catch
(
Exception
e
)
{
log
.
error
(
"loginByPhoneWithWechat error, mobile:{}"
,
purePhone
,
e
);
return
ResponseDto
.
failure
(
"获取用户信息失败~"
);
}
}
private
void
bindSweetAppletUser
(
String
userId
,
String
openId
,
String
unionId
,
String
phoneNumber
,
String
purePhoneNumber
,
String
countryCode
,
Integer
type
)
{
String
appletUserId
=
IDGenerator
.
nextSnowId
();
LinkedList
<
String
>
sqlsA
=
CollectionUtil
.
linkedListString
();
LinkedList
<
Object
[]>
sqlsDataA
=
CollectionUtil
.
linkedListObjectArr
();
sqlsA
.
add
(
SqlMapping
.
get
(
"sweet_applet_users.insert"
));
sqlsDataA
.
add
(
new
Object
[]{
appletUserId
,
userId
,
openId
,
unionId
,
phoneNumber
,
purePhoneNumber
,
countryCode
,
type
});
queueUtils
.
sendMsgByRedis
(
MQConst
.
SweetQueue
.
SWEET_WECHAT_USER_INSERT
.
getKey
(),
SqlMapping
.
gets
(
sqlsA
,
sqlsDataA
));
SweetAppletUsersVo
sweetAppletUsersVo
=
SweetAppletUsersVo
.
getNew
();
sweetAppletUsersVo
.
setAppletUserId
(
appletUserId
);
sweetAppletUsersVo
.
setUserId
(
userId
);
sweetAppletUsersVo
.
setOpenId
(
openId
);
sweetAppletUsersVo
.
setUnionId
(
unionId
);
sweetAppletUsersVo
.
setPhoneNumber
(
phoneNumber
);
sweetAppletUsersVo
.
setPurePhoneNumber
(
purePhoneNumber
);
sweetAppletUsersVo
.
setCountryCode
(
countryCode
);
sweetAppletUsersVo
.
setType
(
type
);
redisUtils
.
setSweetAppletUsers
(
sweetAppletUsersVo
);
}
}
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