Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
A
attendance-performance-platform
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
赵啸非
attendance-performance-platform
Commits
990f8b6d
Commit
990f8b6d
authored
Jul 18, 2023
by
赵啸非
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'origin/master'
parents
66f7a678
3562659e
Changes
6
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
550 additions
and
1 deletion
+550
-1
attendance-performance-manager/pom.xml
attendance-performance-manager/pom.xml
+4
-0
attendance-performance-manager/src/main/java/com/mortals/xhx/module/attendance/dingmsg/DingCallbackCrypto.java
...als/xhx/module/attendance/dingmsg/DingCallbackCrypto.java
+397
-0
attendance-performance-manager/src/main/java/com/mortals/xhx/module/attendance/dingmsg/api/DingMessageController.java
.../module/attendance/dingmsg/api/DingMessageController.java
+103
-0
attendance-performance-manager/src/main/java/com/mortals/xhx/module/attendance/dingmsg/dingmsgreq/DingResponsMeassageReq.java
...attendance/dingmsg/dingmsgreq/DingResponsMeassageReq.java
+25
-0
attendance-performance-manager/src/main/java/com/mortals/xhx/module/attendance/dingmsg/dingmsgreq/EncryptReq.java
.../xhx/module/attendance/dingmsg/dingmsgreq/EncryptReq.java
+18
-0
attendance-performance-manager/src/main/resources/bootstrap.yml
...ance-performance-manager/src/main/resources/bootstrap.yml
+3
-1
No files found.
attendance-performance-manager/pom.xml
View file @
990f8b6d
...
...
@@ -71,6 +71,8 @@
<profiles.dingtalk.agentId>
2652674890
</profiles.dingtalk.agentId>
<profiles.dingtalk.appKey>
dingpqzradgfr4efdi2j
</profiles.dingtalk.appKey>
<profiles.dingtalk.appSecret>
bF2WALmo5_Wuj3hg5gXeWqezrYnZChUJ88HjzNWpkA9ivdOxfBDGOGYcfVRfB3vd
</profiles.dingtalk.appSecret>
<profiles.dingtalk.aesKey>
1QcPYuSpAc98OS3qQwwx5HPH85CZDidxF95yBGad2fJ
</profiles.dingtalk.aesKey>
<profiles.dingtalk.token>
m3WeuVx5kcTY76kh22uWZOTSu0XjvcwNhd
</profiles.dingtalk.token>
<profiles.webUrl>
http://8.136.255.30:11039/attendance
</profiles.webUrl>
<package.environment>
test
</package.environment>
<skipUi>
false
</skipUi>
...
...
@@ -99,6 +101,8 @@
<profiles.dingtalk.agentId>
2652674890
</profiles.dingtalk.agentId>
<profiles.dingtalk.appKey>
dingpqzradgfr4efdi2j
</profiles.dingtalk.appKey>
<profiles.dingtalk.appSecret>
bF2WALmo5_Wuj3hg5gXeWqezrYnZChUJ88HjzNWpkA9ivdOxfBDGOGYcfVRfB3vd
</profiles.dingtalk.appSecret>
<profiles.dingtalk.aesKey>
1QcPYuSpAc98OS3qQwwx5HPH85CZDidxF95yBGad2fJ
</profiles.dingtalk.aesKey>
<profiles.dingtalk.token>
m3WeuVx5kcTY76kh22uWZOTSu0XjvcwNhd
</profiles.dingtalk.token>
<profiles.webUrl>
https://ybswxxcx.zwfwhfgjjfzj.yibin.gov.cn/performance-h5
</profiles.webUrl>
<package.environment>
build
</package.environment>
<skipUi>
false
</skipUi>
...
...
attendance-performance-manager/src/main/java/com/mortals/xhx/module/attendance/dingmsg/DingCallbackCrypto.java
0 → 100644
View file @
990f8b6d
package
com.mortals.xhx.module.attendance.dingmsg
;
import
com.alibaba.fastjson.JSON
;
import
org.apache.commons.codec.binary.Base64
;
import
javax.crypto.Cipher
;
import
javax.crypto.spec.IvParameterSpec
;
import
javax.crypto.spec.SecretKeySpec
;
import
java.io.ByteArrayOutputStream
;
import
java.lang.reflect.Field
;
import
java.nio.charset.Charset
;
import
java.security.MessageDigest
;
import
java.security.Permission
;
import
java.security.PermissionCollection
;
import
java.security.Security
;
import
java.util.Arrays
;
import
java.util.HashMap
;
import
java.util.Map
;
import
java.util.Random
;
/**
* 钉钉开放平台加解密方法
*
* @author ZYW
* @date 2023-07-18 10:42
*/
public
class
DingCallbackCrypto
{
private
static
final
Charset
CHARSET
=
Charset
.
forName
(
"utf-8"
);
private
static
final
Base64
base64
=
new
Base64
();
private
byte
[]
aesKey
;
private
String
token
;
private
String
corpId
;
/**
* ask getPaddingBytes key固定长度
**/
private
static
final
Integer
AES_ENCODE_KEY_LENGTH
=
43
;
/**
* 加密随机字符串字节长度
**/
private
static
final
Integer
RANDOM_LENGTH
=
16
;
/**
* 构造函数
*
* @param token 钉钉开放平台上,开发者设置的token
* @param encodingAesKey 钉钉开放台上,开发者设置的EncodingAESKey
* @param corpId 企业自建应用-事件订阅, 使用appKey
* 企业自建应用-注册回调地址, 使用corpId
* 第三方企业应用, 使用suiteKey
*
* @throws DingTalkEncryptException 执行失败,请查看该异常的错误码和具体的错误信息
*/
public
DingCallbackCrypto
(
String
token
,
String
encodingAesKey
,
String
corpId
)
throws
DingTalkEncryptException
{
if
(
null
==
encodingAesKey
||
encodingAesKey
.
length
()
!=
AES_ENCODE_KEY_LENGTH
)
{
throw
new
DingTalkEncryptException
(
DingTalkEncryptException
.
AES_KEY_ILLEGAL
);
}
this
.
token
=
token
;
this
.
corpId
=
corpId
;
aesKey
=
Base64
.
decodeBase64
(
encodingAesKey
+
"="
);
}
public
Map
<
String
,
String
>
getEncryptedMap
(
String
plaintext
)
throws
DingTalkEncryptException
{
return
getEncryptedMap
(
plaintext
,
System
.
currentTimeMillis
(),
Utils
.
getRandomStr
(
16
));
}
/**
* 将和钉钉开放平台同步的消息体加密,返回加密Map
*
* @param plaintext 传递的消息体明文
* @param timeStamp 时间戳
* @param nonce 随机字符串
* @return
* @throws DingTalkEncryptException
*/
public
Map
<
String
,
String
>
getEncryptedMap
(
String
plaintext
,
Long
timeStamp
,
String
nonce
)
throws
DingTalkEncryptException
{
if
(
null
==
plaintext
)
{
throw
new
DingTalkEncryptException
(
DingTalkEncryptException
.
ENCRYPTION_PLAINTEXT_ILLEGAL
);
}
if
(
null
==
timeStamp
)
{
throw
new
DingTalkEncryptException
(
DingTalkEncryptException
.
ENCRYPTION_TIMESTAMP_ILLEGAL
);
}
if
(
null
==
nonce
)
{
throw
new
DingTalkEncryptException
(
DingTalkEncryptException
.
ENCRYPTION_NONCE_ILLEGAL
);
}
// 加密
String
encrypt
=
encrypt
(
Utils
.
getRandomStr
(
RANDOM_LENGTH
),
plaintext
);
String
signature
=
getSignature
(
token
,
String
.
valueOf
(
timeStamp
),
nonce
,
encrypt
);
Map
<
String
,
String
>
resultMap
=
new
HashMap
<
String
,
String
>();
resultMap
.
put
(
"msg_signature"
,
signature
);
resultMap
.
put
(
"encrypt"
,
encrypt
);
resultMap
.
put
(
"timeStamp"
,
String
.
valueOf
(
timeStamp
));
resultMap
.
put
(
"nonce"
,
nonce
);
return
resultMap
;
}
/**
* 密文解密
*
* @param msgSignature 签名串
* @param timeStamp 时间戳
* @param nonce 随机串
* @param encryptMsg 密文
* @return 解密后的原文
* @throws DingTalkEncryptException
*/
public
String
getDecryptMsg
(
String
msgSignature
,
String
timeStamp
,
String
nonce
,
String
encryptMsg
)
throws
DingTalkEncryptException
{
//校验签名
String
signature
=
getSignature
(
token
,
timeStamp
,
nonce
,
encryptMsg
);
if
(!
signature
.
equals
(
msgSignature
))
{
throw
new
DingTalkEncryptException
(
DingTalkEncryptException
.
COMPUTE_SIGNATURE_ERROR
);
}
// 解密
String
result
=
decrypt
(
encryptMsg
);
return
result
;
}
/*
* 对明文加密.
* @param text 需要加密的明文
* @return 加密后base64编码的字符串
*/
private
String
encrypt
(
String
random
,
String
plaintext
)
throws
DingTalkEncryptException
{
try
{
byte
[]
randomBytes
=
random
.
getBytes
(
CHARSET
);
byte
[]
plainTextBytes
=
plaintext
.
getBytes
(
CHARSET
);
byte
[]
lengthByte
=
Utils
.
int2Bytes
(
plainTextBytes
.
length
);
byte
[]
corpidBytes
=
corpId
.
getBytes
(
CHARSET
);
ByteArrayOutputStream
byteStream
=
new
ByteArrayOutputStream
();
byteStream
.
write
(
randomBytes
);
byteStream
.
write
(
lengthByte
);
byteStream
.
write
(
plainTextBytes
);
byteStream
.
write
(
corpidBytes
);
byte
[]
padBytes
=
PKCS7Padding
.
getPaddingBytes
(
byteStream
.
size
());
byteStream
.
write
(
padBytes
);
byte
[]
unencrypted
=
byteStream
.
toByteArray
();
byteStream
.
close
();
Cipher
cipher
=
Cipher
.
getInstance
(
"AES/CBC/NoPadding"
);
SecretKeySpec
keySpec
=
new
SecretKeySpec
(
aesKey
,
"AES"
);
IvParameterSpec
iv
=
new
IvParameterSpec
(
aesKey
,
0
,
16
);
cipher
.
init
(
Cipher
.
ENCRYPT_MODE
,
keySpec
,
iv
);
byte
[]
encrypted
=
cipher
.
doFinal
(
unencrypted
);
String
result
=
base64
.
encodeToString
(
encrypted
);
return
result
;
}
catch
(
Exception
e
)
{
throw
new
DingTalkEncryptException
(
DingTalkEncryptException
.
COMPUTE_ENCRYPT_TEXT_ERROR
);
}
}
/*
* 对密文进行解密.
* @param text 需要解密的密文
* @return 解密得到的明文
*/
private
String
decrypt
(
String
text
)
throws
DingTalkEncryptException
{
byte
[]
originalArr
;
try
{
// 设置解密模式为AES的CBC模式
Cipher
cipher
=
Cipher
.
getInstance
(
"AES/CBC/NoPadding"
);
SecretKeySpec
keySpec
=
new
SecretKeySpec
(
aesKey
,
"AES"
);
IvParameterSpec
iv
=
new
IvParameterSpec
(
Arrays
.
copyOfRange
(
aesKey
,
0
,
16
));
cipher
.
init
(
Cipher
.
DECRYPT_MODE
,
keySpec
,
iv
);
// 使用BASE64对密文进行解码
byte
[]
encrypted
=
Base64
.
decodeBase64
(
text
);
// 解密
originalArr
=
cipher
.
doFinal
(
encrypted
);
}
catch
(
Exception
e
)
{
throw
new
DingTalkEncryptException
(
DingTalkEncryptException
.
COMPUTE_DECRYPT_TEXT_ERROR
);
}
String
plainText
;
String
fromCorpid
;
try
{
// 去除补位字符
byte
[]
bytes
=
PKCS7Padding
.
removePaddingBytes
(
originalArr
);
// 分离16位随机字符串,网络字节序和corpId
byte
[]
networkOrder
=
Arrays
.
copyOfRange
(
bytes
,
16
,
20
);
int
plainTextLegth
=
Utils
.
bytes2int
(
networkOrder
);
plainText
=
new
String
(
Arrays
.
copyOfRange
(
bytes
,
20
,
20
+
plainTextLegth
),
CHARSET
);
fromCorpid
=
new
String
(
Arrays
.
copyOfRange
(
bytes
,
20
+
plainTextLegth
,
bytes
.
length
),
CHARSET
);
}
catch
(
Exception
e
)
{
throw
new
DingTalkEncryptException
(
DingTalkEncryptException
.
COMPUTE_DECRYPT_TEXT_LENGTH_ERROR
);
}
// corpid不相同的情况
if
(!
fromCorpid
.
equals
(
corpId
))
{
throw
new
DingTalkEncryptException
(
DingTalkEncryptException
.
COMPUTE_DECRYPT_TEXT_CORPID_ERROR
);
}
return
plainText
;
}
/**
* 数字签名
*
* @param token isv token
* @param timestamp 时间戳
* @param nonce 随机串
* @param encrypt 加密文本
* @return
* @throws DingTalkEncryptException
*/
public
String
getSignature
(
String
token
,
String
timestamp
,
String
nonce
,
String
encrypt
)
throws
DingTalkEncryptException
{
try
{
String
[]
array
=
new
String
[]
{
token
,
timestamp
,
nonce
,
encrypt
};
Arrays
.
sort
(
array
);
System
.
out
.
println
(
JSON
.
toJSONString
(
array
));
StringBuffer
sb
=
new
StringBuffer
();
for
(
int
i
=
0
;
i
<
4
;
i
++)
{
sb
.
append
(
array
[
i
]);
}
String
str
=
sb
.
toString
();
System
.
out
.
println
(
str
);
MessageDigest
md
=
MessageDigest
.
getInstance
(
"SHA-1"
);
md
.
update
(
str
.
getBytes
());
byte
[]
digest
=
md
.
digest
();
StringBuffer
hexstr
=
new
StringBuffer
();
String
shaHex
=
""
;
for
(
int
i
=
0
;
i
<
digest
.
length
;
i
++)
{
shaHex
=
Integer
.
toHexString
(
digest
[
i
]
&
0xFF
);
if
(
shaHex
.
length
()
<
2
)
{
hexstr
.
append
(
0
);
}
hexstr
.
append
(
shaHex
);
}
return
hexstr
.
toString
();
}
catch
(
Exception
e
)
{
throw
new
DingTalkEncryptException
(
DingTalkEncryptException
.
COMPUTE_SIGNATURE_ERROR
);
}
}
public
static
class
Utils
{
public
Utils
()
{
}
public
static
String
getRandomStr
(
int
count
)
{
String
base
=
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
;
Random
random
=
new
Random
();
StringBuffer
sb
=
new
StringBuffer
();
for
(
int
i
=
0
;
i
<
count
;
++
i
)
{
int
number
=
random
.
nextInt
(
base
.
length
());
sb
.
append
(
base
.
charAt
(
number
));
}
return
sb
.
toString
();
}
public
static
byte
[]
int2Bytes
(
int
count
)
{
byte
[]
byteArr
=
new
byte
[]
{(
byte
)(
count
>>
24
&
255
),
(
byte
)(
count
>>
16
&
255
),
(
byte
)(
count
>>
8
&
255
),
(
byte
)(
count
&
255
)};
return
byteArr
;
}
public
static
int
bytes2int
(
byte
[]
byteArr
)
{
int
count
=
0
;
for
(
int
i
=
0
;
i
<
4
;
++
i
)
{
count
<<=
8
;
count
|=
byteArr
[
i
]
&
255
;
}
return
count
;
}
}
public
static
class
PKCS7Padding
{
private
static
final
Charset
CHARSET
=
Charset
.
forName
(
"utf-8"
);
private
static
final
int
BLOCK_SIZE
=
32
;
public
PKCS7Padding
()
{
}
public
static
byte
[]
getPaddingBytes
(
int
count
)
{
int
amountToPad
=
32
-
count
%
32
;
if
(
amountToPad
==
0
)
{
amountToPad
=
32
;
}
char
padChr
=
chr
(
amountToPad
);
String
tmp
=
new
String
();
for
(
int
index
=
0
;
index
<
amountToPad
;
++
index
)
{
tmp
=
tmp
+
padChr
;
}
return
tmp
.
getBytes
(
CHARSET
);
}
public
static
byte
[]
removePaddingBytes
(
byte
[]
decrypted
)
{
int
pad
=
decrypted
[
decrypted
.
length
-
1
];
if
(
pad
<
1
||
pad
>
32
)
{
pad
=
0
;
}
return
Arrays
.
copyOfRange
(
decrypted
,
0
,
decrypted
.
length
-
pad
);
}
private
static
char
chr
(
int
a
)
{
byte
target
=
(
byte
)(
a
&
255
);
return
(
char
)
target
;
}
}
public
static
class
DingTalkEncryptException
extends
Exception
{
public
static
final
int
SUCCESS
=
0
;
public
static
final
int
ENCRYPTION_PLAINTEXT_ILLEGAL
=
900001
;
public
static
final
int
ENCRYPTION_TIMESTAMP_ILLEGAL
=
900002
;
public
static
final
int
ENCRYPTION_NONCE_ILLEGAL
=
900003
;
public
static
final
int
AES_KEY_ILLEGAL
=
900004
;
public
static
final
int
SIGNATURE_NOT_MATCH
=
900005
;
public
static
final
int
COMPUTE_SIGNATURE_ERROR
=
900006
;
public
static
final
int
COMPUTE_ENCRYPT_TEXT_ERROR
=
900007
;
public
static
final
int
COMPUTE_DECRYPT_TEXT_ERROR
=
900008
;
public
static
final
int
COMPUTE_DECRYPT_TEXT_LENGTH_ERROR
=
900009
;
public
static
final
int
COMPUTE_DECRYPT_TEXT_CORPID_ERROR
=
900010
;
private
static
Map
<
Integer
,
String
>
msgMap
=
new
HashMap
();
private
Integer
code
;
static
{
msgMap
.
put
(
0
,
"成功"
);
msgMap
.
put
(
900001
,
"加密明文文本非法"
);
msgMap
.
put
(
900002
,
"加密时间戳参数非法"
);
msgMap
.
put
(
900003
,
"加密随机字符串参数非法"
);
msgMap
.
put
(
900005
,
"签名不匹配"
);
msgMap
.
put
(
900006
,
"签名计算失败"
);
msgMap
.
put
(
900004
,
"不合法的aes key"
);
msgMap
.
put
(
900007
,
"计算加密文字错误"
);
msgMap
.
put
(
900008
,
"计算解密文字错误"
);
msgMap
.
put
(
900009
,
"计算解密文字长度不匹配"
);
msgMap
.
put
(
900010
,
"计算解密文字corpid不匹配"
);
}
public
Integer
getCode
()
{
return
this
.
code
;
}
public
DingTalkEncryptException
(
Integer
exceptionCode
)
{
super
((
String
)
msgMap
.
get
(
exceptionCode
));
this
.
code
=
exceptionCode
;
}
}
static
{
try
{
Security
.
setProperty
(
"crypto.policy"
,
"limited"
);
RemoveCryptographyRestrictions
();
}
catch
(
Exception
var1
)
{
}
}
private
static
void
RemoveCryptographyRestrictions
()
throws
Exception
{
Class
<?>
jceSecurity
=
getClazz
(
"javax.crypto.JceSecurity"
);
Class
<?>
cryptoPermissions
=
getClazz
(
"javax.crypto.CryptoPermissions"
);
Class
<?>
cryptoAllPermission
=
getClazz
(
"javax.crypto.CryptoAllPermission"
);
if
(
jceSecurity
!=
null
)
{
setFinalStaticValue
(
jceSecurity
,
"isRestricted"
,
false
);
PermissionCollection
defaultPolicy
=
(
PermissionCollection
)
getFieldValue
(
jceSecurity
,
"defaultPolicy"
,
(
Object
)
null
,
PermissionCollection
.
class
);
if
(
cryptoPermissions
!=
null
)
{
Map
<?,
?>
map
=
(
Map
)
getFieldValue
(
cryptoPermissions
,
"perms"
,
defaultPolicy
,
Map
.
class
);
map
.
clear
();
}
if
(
cryptoAllPermission
!=
null
)
{
Permission
permission
=
(
Permission
)
getFieldValue
(
cryptoAllPermission
,
"INSTANCE"
,
(
Object
)
null
,
Permission
.
class
);
defaultPolicy
.
add
(
permission
);
}
}
}
private
static
Class
<?>
getClazz
(
String
className
)
{
Class
clazz
=
null
;
try
{
clazz
=
Class
.
forName
(
className
);
}
catch
(
Exception
var3
)
{
}
return
clazz
;
}
private
static
void
setFinalStaticValue
(
Class
<?>
srcClazz
,
String
fieldName
,
Object
newValue
)
throws
Exception
{
Field
field
=
srcClazz
.
getDeclaredField
(
fieldName
);
field
.
setAccessible
(
true
);
Field
modifiersField
=
Field
.
class
.
getDeclaredField
(
"modifiers"
);
modifiersField
.
setAccessible
(
true
);
modifiersField
.
setInt
(
field
,
field
.
getModifiers
()
&
-
17
);
field
.
set
((
Object
)
null
,
newValue
);
}
private
static
<
T
>
T
getFieldValue
(
Class
<?>
srcClazz
,
String
fieldName
,
Object
owner
,
Class
<
T
>
dstClazz
)
throws
Exception
{
Field
field
=
srcClazz
.
getDeclaredField
(
fieldName
);
field
.
setAccessible
(
true
);
return
dstClazz
.
cast
(
field
.
get
(
owner
));
}
}
attendance-performance-manager/src/main/java/com/mortals/xhx/module/attendance/dingmsg/api/DingMessageController.java
0 → 100644
View file @
990f8b6d
package
com.mortals.xhx.module.attendance.dingmsg.api
;
import
com.alibaba.fastjson.JSON
;
import
com.alibaba.fastjson.JSONObject
;
import
com.dingtalk.api.DefaultDingTalkClient
;
import
com.dingtalk.api.DingTalkClient
;
import
com.dingtalk.api.request.OapiGettokenRequest
;
import
com.dingtalk.api.response.OapiGettokenResponse
;
import
com.mortals.framework.annotation.UnAuth
;
import
com.mortals.framework.exception.AppException
;
import
com.mortals.xhx.common.pdu.ApiRespPdu
;
import
com.mortals.xhx.module.attendance.dingmsg.DingCallbackCrypto
;
import
com.mortals.xhx.module.attendance.dingmsg.dingmsgreq.DingResponsMeassageReq
;
import
com.mortals.xhx.module.attendance.dingmsg.dingmsgreq.EncryptReq
;
import
lombok.extern.slf4j.Slf4j
;
import
org.apache.commons.logging.Log
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.web.bind.annotation.PostMapping
;
import
org.springframework.web.bind.annotation.RequestBody
;
import
org.springframework.web.bind.annotation.RequestParam
;
import
org.springframework.web.bind.annotation.RestController
;
import
java.util.Map
;
/**
*
* 接收钉钉的审批消息推送
*
* @author ZYW
* @date 2023-07-18 9:52
*/
@RestController
@Slf4j
public
class
DingMessageController
{
/**
* appKey
*/
@Value
(
"${dingtalk.AppKey:''}"
)
protected
String
appKey
;
/**
* aesKey
*/
@Value
(
"${dingtalk.AesKey:''}"
)
protected
String
aesKey
;
/**
* 订阅消息token
*/
@Value
(
"${dingtalk.token:''}"
)
protected
String
token
;
/**
* 接收钉钉消息
*
* @return
*/
@PostMapping
(
"/dingtalk/getOaMeassge"
)
@UnAuth
public
Map
<
String
,
String
>
getOaMessage
(
@RequestParam
(
value
=
"msg_signature"
,
required
=
false
)
String
msg_signature
,
@RequestParam
(
value
=
"timestamp"
,
required
=
false
)
String
timeStamp
,
@RequestParam
(
value
=
"nonce"
,
required
=
false
)
String
nonce
,
@RequestBody
(
required
=
false
)
JSONObject
json
)
throws
DingCallbackCrypto
.
DingTalkEncryptException
{
try
{
// 1. 从http请求中获取加解密参数
// 2. 使用加解密类型
// Constant.OWNER_KEY 说明:
// 1、开发者后台配置的订阅事件为应用级事件推送,此时OWNER_KEY为应用的APP_KEY。
// 2、调用订阅事件接口订阅的事件为企业级事件推送,
// 此时OWNER_KEY为:企业的appkey(企业内部应用)或SUITE_KEY(三方应用)
DingCallbackCrypto
callbackCrypto
=
new
DingCallbackCrypto
(
token
,
aesKey
,
appKey
);
String
encryptMsg
=
json
.
getString
(
"encrypt"
);
String
decryptMsg
=
callbackCrypto
.
getDecryptMsg
(
msg_signature
,
timeStamp
,
nonce
,
encryptMsg
);
// 3. 反序列化回调事件json数据
JSONObject
eventJson
=
JSON
.
parseObject
(
decryptMsg
);
String
eventType
=
eventJson
.
getString
(
"EventType"
);
// 4. 根据EventType分类处理
if
(
"check_url"
.
equals
(
eventType
))
{
// 测试回调url的正确性
log
.
info
(
"测试回调url的正确性"
);
}
else
if
(
"user_add_org"
.
equals
(
eventType
))
{
// 处理通讯录用户增加事件
log
.
info
(
"发生了:"
+
eventType
+
"事件"
);
}
else
{
// 添加其他已注册的
log
.
info
(
"发生了:"
+
eventType
+
"事件"
);
}
// 5. 返回success的加密数据
Map
<
String
,
String
>
successMap
=
callbackCrypto
.
getEncryptedMap
(
"success"
);
return
successMap
;
}
catch
(
DingCallbackCrypto
.
DingTalkEncryptException
e
)
{
e
.
printStackTrace
();
}
return
null
;
}
}
attendance-performance-manager/src/main/java/com/mortals/xhx/module/attendance/dingmsg/dingmsgreq/DingResponsMeassageReq.java
0 → 100644
View file @
990f8b6d
package
com.mortals.xhx.module.attendance.dingmsg.dingmsgreq
;
import
com.fasterxml.jackson.annotation.JsonProperty
;
import
lombok.Data
;
import
lombok.NoArgsConstructor
;
/**
* @author ZYW
* @date 2023-07-18 10:20
*/
@NoArgsConstructor
@Data
public
class
DingResponsMeassageReq
{
@JsonProperty
(
"msg_signature"
)
private
String
msgSignature
;
@JsonProperty
(
"timeStamp"
)
private
String
timeStamp
;
@JsonProperty
(
"nonce"
)
private
String
nonce
;
@JsonProperty
(
"encrypt"
)
private
String
encrypt
;
}
attendance-performance-manager/src/main/java/com/mortals/xhx/module/attendance/dingmsg/dingmsgreq/EncryptReq.java
0 → 100644
View file @
990f8b6d
package
com.mortals.xhx.module.attendance.dingmsg.dingmsgreq
;
/**
* @author ZYW
* @date 2023-07-18 10:14
*/
public
class
EncryptReq
{
String
encrypt
;
public
String
getEncrypt
()
{
return
encrypt
;
}
public
void
setEncrypt
(
String
encrypt
)
{
this
.
encrypt
=
encrypt
;
}
}
attendance-performance-manager/src/main/resources/bootstrap.yml
View file @
990f8b6d
...
...
@@ -72,5 +72,7 @@ dingtalk:
agentId
:
@
profiles.dingtalk.agentId@
AppKey
:
@
profiles.dingtalk.appKey@
AppSecret
:
@
profiles.dingtalk.appSecret@
webUrl
:
@
profiles.webUrl@
webUrl
:
@
profiles.webUrl@
AesKey
:
@
profiles.dingtalk.aesKey@
token
:
@
profiles.dingtalk.token@
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