Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
C
cust-api
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
李伟
cust-api
Commits
679952c7
Commit
679952c7
authored
Dec 29, 2024
by
罗林杰
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'origin/master'
parents
98929816
70288619
Changes
6
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
647 additions
and
4 deletions
+647
-4
pom.xml
pom.xml
+6
-0
AppMemInfoController.java
...isoft/app/appMemInfo/controller/AppMemInfoController.java
+80
-4
WxMiniCons.java
src/main/java/org/rcisoft/app/login/cons/WxMiniCons.java
+53
-0
WxMiniAppController.java
...org/rcisoft/app/login/controller/WxMiniAppController.java
+71
-0
WxMiniService.java
...ain/java/org/rcisoft/app/login/service/WxMiniService.java
+42
-0
WxMiniServiceImpl.java
...org/rcisoft/app/login/service/impl/WxMiniServiceImpl.java
+395
-0
No files found.
pom.xml
View file @
679952c7
...
...
@@ -152,6 +152,12 @@
<version>
4.2
</version>
</dependency>
<dependency>
<groupId>
com.drewnoakes
</groupId>
<artifactId>
metadata-extractor
</artifactId>
<version>
2.14.0
</version>
</dependency>
</dependencies>
...
...
src/main/java/org/rcisoft/app/appMemInfo/controller/AppMemInfoController.java
View file @
679952c7
...
...
@@ -4,6 +4,9 @@ package org.rcisoft.app.appMemInfo.controller;
/*固定导入*/
import
com.baomidou.mybatisplus.core.metadata.IPage
;
import
com.drew.imaging.ImageMetadataReader
;
import
com.drew.metadata.Metadata
;
import
com.drew.metadata.exif.ExifIFD0Directory
;
import
io.swagger.v3.oas.annotations.Operation
;
import
io.swagger.v3.oas.annotations.Parameter
;
import
io.swagger.v3.oas.annotations.Parameters
;
...
...
@@ -36,6 +39,7 @@ import org.springframework.web.multipart.MultipartFile;
import
javax.imageio.ImageIO
;
import
javax.validation.Valid
;
import
java.awt.*
;
import
java.awt.image.BufferedImage
;
import
java.io.ByteArrayOutputStream
;
import
java.io.IOException
;
...
...
@@ -136,24 +140,28 @@ public class AppMemInfoController extends CyPaginationController<MemInfo> {
cyFileStorageService
.
filePath
(
file
,
temp
,
bucket
));
}
//图片压缩
private
static
MultipartFile
compressImage
(
MultipartFile
file
)
{
BufferedImage
image
=
null
;
try
{
image
=
ImageIO
.
read
(
file
.
getInputStream
());
// 设置压缩质量
float
quality
=
1.0f
;
// 获取图像的方向信息并进行旋转调整
image
=
fixImageOrientation
(
file
,
image
);
// // 设置压缩质量
// float quality = 1.0f;
// 调整图片尺寸,设置目标宽度和高度
int
targetWidth
=
800
;
// 目标宽度(可以根据需求调整)
int
targetHeight
=
600
;
// 目标高度(可以根据需求调整)
// 使用Imgscalr进行图像压缩(缩放)
BufferedImage
compressedImage
=
Scalr
.
resize
(
image
,
Scalr
.
Method
.
QUALITY
,
targetWidth
,
targetHeight
);
// BufferedImage compressedImage = Scalr.resize(image,Scalr.Method.QUALITY, Scalr.Mode.AUTOMATIC,500
);
// 将BufferedImage写入ByteArrayOutputStream
ByteArrayOutputStream
outputStream
=
new
ByteArrayOutputStream
();
String
originalFilename
=
file
.
getOriginalFilename
();
String
extension
=
originalFilename
.
substring
(
originalFilename
.
lastIndexOf
(
'.'
)
+
1
).
toLowerCase
();
ImageIO
.
write
(
compressedImage
,
extension
,
outputStream
);
// 假设原始图片格式为jpg
ImageIO
.
write
(
image
,
extension
,
outputStream
);
// 假设原始图片格式为jpg
// 将压缩后的图片数据转换为byte数组
byte
[]
compressedImageData
=
outputStream
.
toByteArray
();
...
...
@@ -167,4 +175,72 @@ public class AppMemInfoController extends CyPaginationController<MemInfo> {
return
file
;
}
/**
* 获取图像的 EXIF 方向标签
*/
private
static
int
getExifOrientation
(
MultipartFile
file
)
{
try
{
Metadata
metadata
=
ImageMetadataReader
.
readMetadata
(
file
.
getInputStream
());
ExifIFD0Directory
directory
=
metadata
.
getFirstDirectoryOfType
(
ExifIFD0Directory
.
class
);
if
(
directory
!=
null
)
{
Integer
orientationTag
=
directory
.
getInteger
(
ExifIFD0Directory
.
TAG_ORIENTATION
);
if
(
orientationTag
!=
null
)
{
return
orientationTag
;
}
}
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
return
1
;
// 默认方向,无旋转
}
/**
* 旋转图像
*/
private
static
BufferedImage
rotateImage
(
BufferedImage
image
,
int
angle
)
{
int
width
=
image
.
getWidth
();
int
height
=
image
.
getHeight
();
// 计算旋转后的新宽高
double
radians
=
Math
.
toRadians
(
angle
);
int
newWidth
=
(
int
)
Math
.
abs
(
width
*
Math
.
cos
(
radians
))
+
(
int
)
Math
.
abs
(
height
*
Math
.
sin
(
radians
));
int
newHeight
=
(
int
)
Math
.
abs
(
height
*
Math
.
cos
(
radians
))
+
(
int
)
Math
.
abs
(
width
*
Math
.
sin
(
radians
));
// 创建一个新的图像,背景色为白色或透明
BufferedImage
rotatedImage
=
new
BufferedImage
(
newWidth
,
newHeight
,
image
.
getType
());
Graphics2D
g2d
=
rotatedImage
.
createGraphics
();
// g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
// g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);
//
// // 设置旋转中心
g2d
.
translate
((
newWidth
-
width
)
/
2
,
(
newHeight
-
height
)
/
2
);
// 居中
// g2d.rotate(radians, width / 2, height / 2); // 旋转
g2d
.
rotate
(
radians
,
width
/
2
,
height
/
2
);
// 绘制原图像
g2d
.
drawImage
(
image
,
0
,
0
,
null
);
g2d
.
dispose
();
return
rotatedImage
;
}
/**
* 根据 EXIF 信息修正图像方向
*/
private
static
BufferedImage
fixImageOrientation
(
MultipartFile
file
,
BufferedImage
image
)
throws
IOException
{
int
orientation
=
getExifOrientation
(
file
);
switch
(
orientation
)
{
case
3
:
return
rotateImage
(
image
,
180
);
case
6
:
return
rotateImage
(
image
,
90
);
case
8
:
return
rotateImage
(
image
,
270
);
default
:
return
image
;
// 无需旋转
}
}
}
src/main/java/org/rcisoft/app/login/cons/WxMiniCons.java
0 → 100644
View file @
679952c7
package
org
.
rcisoft
.
app
.
login
.
cons
;
/**
* Created with family.
* author: cy
* Date: 2021/5/10
* Time: 4:15 PM
* description:
*/
public
class
WxMiniCons
{
// 微信获取 openid
public
static
final
String
LOGIN_URL
=
"https://api.weixin.qq.com/sns/jscode2session?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code"
;
// map - code码
public
static
final
String
CODE
=
"code"
;
// map - user对象
public
static
final
String
DATA
=
"data"
;
// map - token
public
static
final
String
TOKEN
=
"token"
;
// map - openId
public
static
final
String
OPEN_ID
=
"openId"
;
// 已登录,已授权 1
public
static
final
Integer
CODE_AUTHOR
=
200
;
// 已登录,未授权 0.5
public
static
final
Integer
CODE_LOGIN
=
202
;
// 异常 -1
public
static
final
Integer
CODE_ERROR
=
500
;
// 未登录 0
public
static
final
Integer
CODE_UNLOGIN
=
204
;
//微信接口
public
static
final
String
OPEN_ID_STR
=
"openid"
;
public
static
final
String
SESSION_KEY_STR
=
"session_key"
;
//redis openid
public
static
final
String
REDIS_OPENID_STR
=
"users:sk:"
;
// 解密phone str
public
static
final
String
PHONE_STR
=
"phoneNumber"
;
//操作提示
public
static
final
String
OPE_PHONE_ERROR
=
"获取手机号错误,请稍后重试"
;
public
static
final
String
OPE_PHONE_EXIST
=
"您的手机号被占用,请联系客服"
;
public
static
final
String
OPE_PHONE_NOT_EXIST
=
"您的手机号,系统不存在,请联系客服"
;
public
static
final
String
OPE_PROFILE_NOT_LOGIN
=
"用户未登录,请先登录"
;
}
src/main/java/org/rcisoft/app/login/controller/WxMiniAppController.java
0 → 100644
View file @
679952c7
package
org
.
rcisoft
.
app
.
login
.
controller
;
import
jakarta.servlet.http.HttpServletRequest
;
import
lombok.extern.slf4j.Slf4j
;
import
org.rcisoft.app.login.service.WxMiniService
;
import
org.rcisoft.core.jwt.util.CyJwtUtil
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.web.bind.annotation.*
;
import
java.util.Map
;
/**
* @author cy
* Created by cy on 21/5/10.
* @descript
*/
@RestController
@RequestMapping
(
"/app/wxMiniApp"
)
@Slf4j
public
class
WxMiniAppController
{
@Autowired
private
WxMiniService
wxMiniServiceImpl
;
@Autowired
private
CyJwtUtil
cyJwtUtil
;
/**
* wx login 第一步
* 1. 小程序刚进入的时候,可能会有token
* 2. 手机号登录,之前调用的
*
* @param code code
* @return
*/
@GetMapping
(
"/validLogin"
)
public
Map
<
String
,
Object
>
validLogin
(
@RequestParam
(
"code"
)
String
code
,
HttpServletRequest
request
)
{
// 1. 已经登录 ----> 延长登录过期时间 30分钟,返回token 和 基本信息(身份)
return
wxMiniServiceImpl
.
validLogin
(
code
,
cyJwtUtil
.
getToken
(
request
));
}
/**
* 手机号登录 第二步
*
* @return
*/
@GetMapping
(
"/phoneLogin"
)
public
Map
<
String
,
Object
>
phoneLogin
(
@RequestParam
(
"encryptedData"
)
String
encryptedData
,
@RequestParam
(
"iv"
)
String
iv
,
@RequestParam
(
"openId"
)
String
openId
)
{
return
wxMiniServiceImpl
.
phoneLogin
(
encryptedData
,
iv
,
openId
);
}
/**
* 保存授权信息 第三步
*
* @return
*/
@PostMapping
(
"/saveUserProfile"
)
public
Map
<
String
,
Object
>
saveUserProfile
(
HttpServletRequest
request
,
@RequestParam
(
"nickName"
)
String
nickName
,
@RequestParam
(
"avatarUrl"
)
String
avatarUrl
,
@RequestParam
(
"gender"
)
String
gender
,
@RequestParam
(
"address"
)
String
address
)
{
return
wxMiniServiceImpl
.
saveUserProfile
(
nickName
,
avatarUrl
,
gender
,
address
,
cyJwtUtil
.
getToken
(
request
));
}
}
src/main/java/org/rcisoft/app/login/service/WxMiniService.java
0 → 100644
View file @
679952c7
package
org
.
rcisoft
.
app
.
login
.
service
;
import
java.util.Map
;
/**
* Created with family.
* author: cy
* Date: 2021/5/10
* Time: 3:41 PM
* description:
*/
public
interface
WxMiniService
{
/**
* 验证登录
*
* @param code
* @return
*/
Map
<
String
,
Object
>
validLogin
(
String
code
,
String
token
);
/**
* 手机登录
*
* @param encryptedData
* @param iv
* @param openId
* @return
*/
Map
<
String
,
Object
>
phoneLogin
(
String
encryptedData
,
String
iv
,
String
openId
);
/**
* 保存profile
*
* @param nickName
* @param avatarUrl
* @param gender
* @param address
* @return
*/
Map
<
String
,
Object
>
saveUserProfile
(
String
nickName
,
String
avatarUrl
,
String
gender
,
String
address
,
String
token
);
}
src/main/java/org/rcisoft/app/login/service/impl/WxMiniServiceImpl.java
0 → 100644
View file @
679952c7
package
org
.
rcisoft
.
app
.
login
.
service
.
impl
;
import
cn.hutool.json.JSONObject
;
import
cn.hutool.json.JSONUtil
;
import
lombok.extern.slf4j.Slf4j
;
import
org.apache.commons.collections4.CollectionUtils
;
import
org.apache.commons.lang3.StringUtils
;
import
org.apache.http.HttpEntity
;
import
org.apache.http.client.methods.CloseableHttpResponse
;
import
org.apache.http.client.methods.HttpGet
;
import
org.apache.http.impl.client.CloseableHttpClient
;
import
org.apache.http.impl.client.HttpClients
;
import
org.apache.http.util.EntityUtils
;
import
org.bouncycastle.jce.provider.BouncyCastleProvider
;
import
org.codehaus.xfire.util.Base64
;
import
org.rcisoft.app.login.service.WxMiniService
;
import
org.rcisoft.core.jwt.bean.CyJwtBean
;
import
org.rcisoft.core.jwt.model.CyJwtUser
;
import
org.rcisoft.core.jwt.util.CyJwtUtil
;
import
org.rcisoft.core.service.CyRedisService
;
import
org.rcisoft.core.util.CyAESUtils
;
import
org.rcisoft.core.util.CyUserUtil
;
import
org.rcisoft.sys.rbac.menu.dao.SysMenuRbacRepository
;
import
org.rcisoft.sys.rbac.menu.dto.SysMenuRbacDTO
;
import
org.rcisoft.sys.rbac.menu.entity.SysMenuRbac
;
import
org.rcisoft.sys.rbac.user.dao.SysUserRbacRepository
;
import
org.rcisoft.sys.rbac.user.entity.SysUserRbac
;
import
org.rcisoft.tencent.cons.CyWxMiniCons
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.stereotype.Service
;
import
org.springframework.transaction.annotation.Propagation
;
import
org.springframework.transaction.annotation.Transactional
;
import
javax.crypto.BadPaddingException
;
import
javax.crypto.Cipher
;
import
javax.crypto.IllegalBlockSizeException
;
import
javax.crypto.NoSuchPaddingException
;
import
javax.crypto.spec.IvParameterSpec
;
import
javax.crypto.spec.SecretKeySpec
;
import
java.io.IOException
;
import
java.io.UnsupportedEncodingException
;
import
java.security.*
;
import
java.security.spec.InvalidParameterSpecException
;
import
java.util.*
;
/**
* Created with family.
* author: cy
* Date: 2021/5/10
* Time: 4:10 PM
* description:
*/
@Service
@Slf4j
@Transactional
(
readOnly
=
true
,
propagation
=
Propagation
.
NOT_SUPPORTED
)
public
class
WxMiniServiceImpl
implements
WxMiniService
{
// appId
@Value
(
"${wx.appId:}"
)
private
String
appId
;
// secret
@Value
(
"${wx.secret:}"
)
private
String
secret
;
@Value
(
"${wx.timeOut:3600}"
)
private
Integer
timeOut
;
@Autowired
(
required
=
false
)
private
CyRedisService
cyRedisServiceImpl
;
@Autowired
private
CyJwtBean
cyJwtBean
;
@Autowired
private
CyJwtUtil
cyJwtUtil
;
@Autowired
private
SysUserRbacRepository
sysUserRbacRepository
;
@Autowired
(
required
=
false
)
private
SysMenuRbacRepository
sysMenuRbacRepository
;
@Override
public
Map
<
String
,
Object
>
validLogin
(
String
code
,
String
token
)
{
Map
<
String
,
Object
>
resultMap
=
new
HashMap
<>();
Map
<
String
,
String
>
res
=
this
.
getWxOpenId
(
code
);
String
wxOpenid
=
res
.
get
(
CyWxMiniCons
.
OPEN_ID_STR
);
String
sessionKey
=
res
.
get
(
CyWxMiniCons
.
SESSION_KEY_STR
);
// open is null;
if
(
StringUtils
.
isEmpty
(
wxOpenid
))
{
resultMap
.
put
(
CyWxMiniCons
.
CODE
,
CyWxMiniCons
.
CODE_ERROR
);
resultMap
.
put
(
CyWxMiniCons
.
DATA
,
"未获取到openid"
);
return
resultMap
;
}
// redis 存放sessionKey
cyRedisServiceImpl
.
set
(
CyWxMiniCons
.
REDIS_OPENID_STR
+
wxOpenid
,
sessionKey
,
Long
.
parseLong
(
timeOut
+
""
));
// 1. 已经登录 ----> 返回token 和 基本信息
if
(
StringUtils
.
isNotEmpty
(
CyUserUtil
.
getAuthenUsername
())
&&
!
cyJwtBean
.
isTokenExpired
(
token
))
{
return
alreadyLogin
(
resultMap
,
token
);
}
// 2. 未登录
//2.1.1 根据 open_id 数据库数据查询
List
<
SysUserRbac
>
sysUsers
=
sysUserRbacRepository
.
selectByOpenid
(
wxOpenid
);
if
(
CollectionUtils
.
isNotEmpty
(
sysUsers
))
// 2.1.2 微信登录,数据库已绑定 openId --->
return
wxLogin
(
resultMap
,
sysUsers
.
get
(
0
));
else
{
// 2.1.3 未登录,数据库未绑定 openId 新用户
resultMap
.
put
(
CyWxMiniCons
.
CODE
,
CyWxMiniCons
.
CODE_UNLOGIN
);
resultMap
.
put
(
CyWxMiniCons
.
OPEN_ID
,
wxOpenid
);
return
resultMap
;
}
}
@Transactional
(
propagation
=
Propagation
.
REQUIRED
)
@Override
public
Map
<
String
,
Object
>
phoneLogin
(
String
encryptedData
,
String
iv
,
String
openId
)
{
Map
<
String
,
Object
>
resultMap
=
new
HashMap
<>();
Object
session_key
=
cyRedisServiceImpl
.
get
(
CyWxMiniCons
.
REDIS_OPENID_STR
+
openId
);
if
(
null
!=
session_key
&&
StringUtils
.
isAnyEmpty
(
session_key
.
toString
()))
{
resultMap
.
put
(
CyWxMiniCons
.
CODE
,
CyWxMiniCons
.
CODE_ERROR
);
resultMap
.
put
(
CyWxMiniCons
.
DATA
,
CyWxMiniCons
.
OPE_PHONE_ERROR
);
return
resultMap
;
}
//1.解析phone
JSONObject
res
=
this
.
getPhoneNumber
(
session_key
.
toString
(),
encryptedData
,
iv
);
if
(
res
==
null
||
null
==
res
.
get
(
CyWxMiniCons
.
PHONE_STR
)
||
StringUtils
.
isAnyEmpty
(
res
.
get
(
CyWxMiniCons
.
PHONE_STR
).
toString
()))
{
resultMap
.
put
(
CyWxMiniCons
.
CODE
,
CyWxMiniCons
.
CODE_ERROR
);
resultMap
.
put
(
CyWxMiniCons
.
DATA
,
CyWxMiniCons
.
OPE_PHONE_ERROR
);
return
resultMap
;
}
String
phone
=
res
.
get
(
CyWxMiniCons
.
PHONE_STR
).
toString
();
if
(
StringUtils
.
isNotBlank
(
phone
))
phone
=
CyAESUtils
.
encrypt
(
phone
);
log
.
error
(
"phone---------------------"
+
phone
);
List
<
SysUserRbac
>
sysUsers
=
sysUserRbacRepository
.
selectByPhone
(
phone
);
//2.1 手机号已存在
if
(
CollectionUtils
.
isNotEmpty
(
sysUsers
))
return
this
.
wxPhoneLogin
(
resultMap
,
sysUsers
.
get
(
0
),
openId
,
phone
);
//2.2 手机号不存在,客户第一次登录
return
this
.
wxPhoneLogin
(
resultMap
,
null
,
openId
,
phone
);
}
@Transactional
(
propagation
=
Propagation
.
REQUIRED
)
@Override
public
Map
<
String
,
Object
>
saveUserProfile
(
String
nickName
,
String
avatarUrl
,
String
gender
,
String
address
,
String
token
)
{
Map
<
String
,
Object
>
resultMap
=
new
HashMap
<>();
String
phone
=
CyUserUtil
.
getUserInfoStrProp
(
token
,
CyUserUtil
.
USER_PHONE
);
//非法登录
if
(
StringUtils
.
isAnyEmpty
(
token
)
&&
StringUtils
.
isAnyEmpty
(
phone
))
{
resultMap
.
put
(
CyWxMiniCons
.
CODE
,
CyWxMiniCons
.
CODE_ERROR
);
resultMap
.
put
(
CyWxMiniCons
.
DATA
,
CyWxMiniCons
.
OPE_PROFILE_NOT_LOGIN
);
}
SysUserRbac
sysUser
=
new
SysUserRbac
();
sysUser
.
setPhone
(
phone
);
sysUser
.
setWxHead
(
avatarUrl
);
sysUser
.
setWxSex
(
gender
);
sysUser
.
setWxNickName
(
nickName
);
sysUser
.
setWxAddress
(
address
);
sysUserRbacRepository
.
updateUserWxByPhone
(
sysUser
);
//重新生成token
List
<
SysUserRbac
>
users
=
sysUserRbacRepository
.
selectByPhone
(
phone
);
if
(
CollectionUtils
.
isNotEmpty
(
users
))
{
SysUserRbac
sysUserRbac
=
users
.
get
(
0
);
/*根据用户名查询用户权限*/
SysMenuRbacDTO
sysMenu
=
new
SysMenuRbacDTO
();
sysMenu
.
setNotDeleted
();
sysMenu
.
setUsername
(
sysUserRbac
.
getUsername
());
List
<
SysMenuRbac
>
menus
=
sysMenuRbacRepository
.
queryIdByUsername
(
sysMenu
);
if
(
CollectionUtils
.
isEmpty
(
menus
))
menus
=
Collections
.
emptyList
();
sysUserRbac
.
setMenuList
(
menus
);
boolean
notLocked
=
true
;
CyJwtUser
userDetails
=
CyJwtUtil
.
createRbacJwtUser
(
sysUserRbac
,
notLocked
);
//创建token
resultMap
.
put
(
CyWxMiniCons
.
TOKEN
,
CyJwtUtil
.
generateToken
(
userDetails
));
}
resultMap
.
put
(
CyWxMiniCons
.
CODE
,
CyWxMiniCons
.
CODE_AUTHOR
);
resultMap
.
put
(
CyWxMiniCons
.
DATA
,
sysUser
);
return
resultMap
;
}
/**
* 解析phoneNumber
*
* @param session_key
* @param encryptedData
* @param iv
* @return
*/
private
JSONObject
getPhoneNumber
(
String
session_key
,
String
encryptedData
,
String
iv
)
{
byte
[]
dataByte
=
Base64
.
decode
(
encryptedData
);
byte
[]
keyByte
=
Base64
.
decode
(
session_key
);
byte
[]
ivByte
=
Base64
.
decode
(
iv
);
try
{
int
base
=
16
;
if
(
keyByte
.
length
%
base
!=
0
)
{
int
groups
=
keyByte
.
length
/
base
+
(
keyByte
.
length
%
base
!=
0
?
1
:
0
);
byte
[]
temp
=
new
byte
[
groups
*
base
];
Arrays
.
fill
(
temp
,
(
byte
)
0
);
System
.
arraycopy
(
keyByte
,
0
,
temp
,
0
,
keyByte
.
length
);
keyByte
=
temp
;
}
// 初始化
Security
.
addProvider
(
new
BouncyCastleProvider
());
Cipher
cipher
=
Cipher
.
getInstance
(
"AES/CBC/PKCS7Padding"
,
"BC"
);
SecretKeySpec
spec
=
new
SecretKeySpec
(
keyByte
,
"AES"
);
AlgorithmParameters
parameters
=
AlgorithmParameters
.
getInstance
(
"AES"
);
parameters
.
init
(
new
IvParameterSpec
(
ivByte
));
cipher
.
init
(
Cipher
.
DECRYPT_MODE
,
spec
,
parameters
);
byte
[]
resultByte
=
cipher
.
doFinal
(
dataByte
);
if
(
null
!=
resultByte
&&
resultByte
.
length
>
0
)
{
String
result
=
new
String
(
resultByte
,
"UTF-8"
);
return
JSONUtil
.
parseObj
(
result
);
}
}
catch
(
NoSuchAlgorithmException
e
)
{
log
.
error
(
e
.
getMessage
(),
e
);
}
catch
(
NoSuchPaddingException
e
)
{
log
.
error
(
e
.
getMessage
(),
e
);
}
catch
(
InvalidParameterSpecException
e
)
{
log
.
error
(
e
.
getMessage
(),
e
);
}
catch
(
IllegalBlockSizeException
e
)
{
log
.
error
(
e
.
getMessage
(),
e
);
}
catch
(
BadPaddingException
e
)
{
log
.
error
(
e
.
getMessage
(),
e
);
}
catch
(
UnsupportedEncodingException
e
)
{
log
.
error
(
e
.
getMessage
(),
e
);
}
catch
(
InvalidKeyException
e
)
{
log
.
error
(
e
.
getMessage
(),
e
);
}
catch
(
InvalidAlgorithmParameterException
e
)
{
log
.
error
(
e
.
getMessage
(),
e
);
}
catch
(
NoSuchProviderException
e
)
{
e
.
printStackTrace
();
}
return
null
;
}
/**
* 登录获取sessionKey
*
* @param code
* @return
*/
private
Map
<
String
,
String
>
getWxOpenId
(
String
code
)
{
Map
<
String
,
String
>
res
=
new
HashMap
<>();
String
loginUrl
=
String
.
format
(
CyWxMiniCons
.
LOGIN_URL
,
appId
,
secret
,
code
);
CloseableHttpClient
client
=
null
;
CloseableHttpResponse
response
=
null
;
try
{
// 创建http GET请求
HttpGet
httpGet
=
new
HttpGet
(
loginUrl
);
client
=
HttpClients
.
createDefault
();
// 执行请求
response
=
client
.
execute
(
httpGet
);
HttpEntity
entity
=
response
.
getEntity
();
//得到返回数据
String
result
=
EntityUtils
.
toString
(
entity
);
log
.
error
(
"微信返回---------------------"
+
result
);
JSONObject
json_test
=
JSONUtil
.
parseObj
(
result
);
String
wxOpenid
=
json_test
.
getStr
(
CyWxMiniCons
.
OPEN_ID_STR
);
String
sessionKey
=
json_test
.
getStr
(
CyWxMiniCons
.
SESSION_KEY_STR
);
log
.
error
(
"openId---------------------"
+
wxOpenid
);
log
.
error
(
"sessionKey---------------------"
+
sessionKey
);
res
.
put
(
CyWxMiniCons
.
OPEN_ID_STR
,
wxOpenid
);
res
.
put
(
CyWxMiniCons
.
SESSION_KEY_STR
,
sessionKey
);
}
catch
(
Exception
e
)
{
log
.
error
(
e
.
getMessage
());
}
finally
{
if
(
response
!=
null
)
{
try
{
response
.
close
();
}
catch
(
IOException
e
)
{
log
.
error
(
e
.
getMessage
());
}
}
if
(
client
!=
null
)
{
try
{
client
.
close
();
}
catch
(
IOException
e
)
{
log
.
error
(
e
.
getMessage
());
}
}
}
return
res
;
}
/**
* 手机登录
*
* @param resultMap
* @return
*/
private
Map
<
String
,
Object
>
wxPhoneLogin
(
Map
<
String
,
Object
>
resultMap
,
SysUserRbac
sysUserRbac
,
String
openId
,
String
phone
)
{
//2.1.1 第一次登录
if
(
null
==
sysUserRbac
)
{
// 手机号为帐号,验证重, username phone
List
<
SysUserRbac
>
list
=
sysUserRbacRepository
.
queryUserByUserName
(
phone
);
if
(
CollectionUtils
.
isNotEmpty
(
list
))
{
resultMap
.
put
(
CyWxMiniCons
.
CODE
,
CyWxMiniCons
.
CODE_ERROR
);
resultMap
.
put
(
CyWxMiniCons
.
DATA
,
CyWxMiniCons
.
OPE_PHONE_EXIST
);
return
resultMap
;
}
sysUserRbac
=
new
SysUserRbac
();
sysUserRbac
.
setWxOpenid
(
openId
);
sysUserRbac
.
setPhone
(
phone
);
sysUserRbac
.
setUsername
(
CyAESUtils
.
decrypt
(
phone
));
sysUserRbac
.
setCreateDate
(
new
Date
());
sysUserRbac
.
setUpdateDate
(
new
Date
());
sysUserRbac
.
setNotDeleted
();
sysUserRbac
.
setStart
();
sysUserRbacRepository
.
insert
(
sysUserRbac
);
}
//2.1.2 openId 是否绑定 情况:用户旧的微信注销了,更换了微信,但是绑定的手机号都是相同的
else
if
(
StringUtils
.
isNotEmpty
(
sysUserRbac
.
getWxOpenid
())
&&
!
sysUserRbac
.
getWxOpenid
().
equals
(
openId
))
{
resultMap
.
put
(
CyWxMiniCons
.
CODE
,
CyWxMiniCons
.
CODE_ERROR
);
resultMap
.
put
(
CyWxMiniCons
.
DATA
,
CyWxMiniCons
.
OPE_PHONE_EXIST
);
return
resultMap
;
}
//2.1.3 openId 未绑定
else
if
(
StringUtils
.
isAnyBlank
(
sysUserRbac
.
getWxOpenid
()))
{
SysUserRbac
sysUser
=
new
SysUserRbac
();
sysUser
.
setPhone
(
phone
);
sysUser
.
setWxOpenid
(
openId
);
sysUserRbacRepository
.
updateUserWxByPhone
(
sysUser
);
}
return
this
.
wxLogin
(
resultMap
,
sysUserRbac
);
}
/**
* wx登录
*
* @param resultMap
* @return
*/
private
Map
<
String
,
Object
>
wxLogin
(
Map
<
String
,
Object
>
resultMap
,
SysUserRbac
sysUserRbac
)
{
if
(
null
!=
sysUserRbac
.
getWxNickName
())
// 1.1 已授权
resultMap
.
put
(
CyWxMiniCons
.
CODE
,
CyWxMiniCons
.
CODE_AUTHOR
);
else
{
// 1.2 已登录,未授权
resultMap
.
put
(
CyWxMiniCons
.
CODE
,
CyWxMiniCons
.
CODE_LOGIN
);
//resultMap.put(WxMiniCons.OPEN_ID, sysUserRbac.getWxOpenid());
}
/*根据用户名查询用户权限*/
SysMenuRbacDTO
sysMenu
=
new
SysMenuRbacDTO
();
sysMenu
.
setNotDeleted
();
sysMenu
.
setUsername
(
sysUserRbac
.
getUsername
());
List
<
SysMenuRbac
>
menus
=
sysMenuRbacRepository
.
queryIdByUsername
(
sysMenu
);
if
(
CollectionUtils
.
isEmpty
(
menus
))
menus
=
Collections
.
emptyList
();
sysUserRbac
.
setMenuList
(
menus
);
boolean
notLocked
=
true
;
CyJwtUser
userDetails
=
CyJwtUtil
.
createRbacJwtUser
(
sysUserRbac
,
notLocked
);
//创建token
resultMap
.
put
(
CyWxMiniCons
.
TOKEN
,
CyJwtUtil
.
generateToken
(
userDetails
));
sysUserRbac
.
setPassword
(
null
);
resultMap
.
put
(
CyWxMiniCons
.
DATA
,
sysUserRbac
);
return
resultMap
;
}
/**
* 已经登录
*
* @param resultMap
* @return
*/
private
Map
<
String
,
Object
>
alreadyLogin
(
Map
<
String
,
Object
>
resultMap
,
String
token
)
{
cyJwtUtil
.
refreshToken
(
token
);
if
(
null
!=
CyUserUtil
.
getUserInfoStrProp
(
token
,
CyUserUtil
.
USER_WX_NICKNAME
))
// 1.1 已授权
resultMap
.
put
(
CyWxMiniCons
.
CODE
,
CyWxMiniCons
.
CODE_AUTHOR
);
else
{
// 1.2 已登录,未授权
resultMap
.
put
(
CyWxMiniCons
.
CODE
,
CyWxMiniCons
.
CODE_LOGIN
);
}
resultMap
.
put
(
CyWxMiniCons
.
TOKEN
,
token
);
List
<
SysUserRbac
>
users
=
sysUserRbacRepository
.
queryUserByUserName
(
CyUserUtil
.
getAuthenUsername
());
SysUserRbac
sysUserRbac
=
new
SysUserRbac
();
if
(
CollectionUtils
.
isNotEmpty
(
users
))
{
sysUserRbac
=
users
.
get
(
0
);
sysUserRbac
.
setPassword
(
null
);
}
//resultMap.put(WxMiniCons.DATA, CyUserUtil.getUserInfoStrProp(token, CyUserUtil.USER_PHONE));
resultMap
.
put
(
CyWxMiniCons
.
DATA
,
sysUserRbac
);
return
resultMap
;
}
}
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