Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
S
sc_media
Project
Project
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
Graph
比较
统计图
议题
0
议题
0
列表
看板
标记
Milestones
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
注册表
注册表
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
svn
sc_media
Commits
52378c51
提交
52378c51
authored
8月 15, 2019
作者:
renjiancai
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
--no commit message
上级
de8f7915
全部展开
隐藏空白字符变更
内嵌
并排
正在显示
16 个修改的文件
包含
573 行增加
和
24 行删除
+573
-24
pom.xml
com.zrqx.resource/pom.xml
+24
-1
.WXBizMsgCrypt.java.swp
...ain/java/com/zrqx/resource/bg/aes/.WXBizMsgCrypt.java.swp
+0
-0
AesException.java
.../src/main/java/com/zrqx/resource/bg/aes/AesException.java
+59
-0
ByteGroup.java
...rce/src/main/java/com/zrqx/resource/bg/aes/ByteGroup.java
+26
-0
PKCS7Encoder.java
.../src/main/java/com/zrqx/resource/bg/aes/PKCS7Encoder.java
+67
-0
SHA1.java
...resource/src/main/java/com/zrqx/resource/bg/aes/SHA1.java
+61
-0
WXBizMsgCrypt.java
...src/main/java/com/zrqx/resource/bg/aes/WXBizMsgCrypt.java
+0
-0
WXBizMsgCryptTest.java
...main/java/com/zrqx/resource/bg/aes/WXBizMsgCryptTest.java
+152
-0
XMLParse.java
...urce/src/main/java/com/zrqx/resource/bg/aes/XMLParse.java
+81
-0
WechatAuthorization.java
.../com/zrqx/resource/bg/controller/WechatAuthorization.java
+0
-0
WeChatConfig.java
.../com/zrqx/resource/bg/controller/config/WeChatConfig.java
+3
-2
WechatStaticData.java
.../zrqx/resource/bg/controller/config/WechatStaticData.java
+2
-2
ArticleLibraryController.java
...ource/bg/controller/content/ArticleLibraryController.java
+3
-4
UserController.java
.../com/zrqx/resource/bg/controller/user/UserController.java
+0
-0
Program.java
...urce/src/main/java/com/zrqx/resource/bg/util/Program.java
+65
-0
Redis.java
...source/src/main/java/com/zrqx/resource/commons/Redis.java
+30
-15
没有找到文件。
com.zrqx.resource/pom.xml
浏览文件 @
52378c51
...
...
@@ -17,6 +17,7 @@
<groupId>
com.zrqx
</groupId>
<artifactId>
com.zrqx.core
</artifactId>
</dependency>
<dependency>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-starter-data-redis
</artifactId>
...
...
@@ -48,7 +49,11 @@
<groupId>
org.springframework.cloud
</groupId>
<artifactId>
spring-cloud-starter-openfeign
</artifactId>
</dependency>
<dependency>
<groupId>
commons-codec
</groupId>
<artifactId>
commons-codec
</artifactId>
<version>
1.9
</version>
</dependency>
<!--熔断器 -->
<dependency>
<groupId>
org.springframework.cloud
</groupId>
...
...
@@ -101,12 +106,30 @@
<artifactId>
jsoup
</artifactId>
<version>
1.11.3
</version>
</dependency>
<dependency>
<groupId>
dom4j
</groupId>
<artifactId>
dom4j
</artifactId>
<version>
1.6.1
</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.jeewx/jeewx-api -->
<dependency>
<groupId>
org.jeewx
</groupId>
<artifactId>
jeewx-api
</artifactId>
<version>
1.2.0
</version>
</dependency>
<!-- https://mvnrepository.com/artifact/net.sf.json-lib/json-lib -->
<dependency>
<groupId>
net.sf.json-lib
</groupId>
<artifactId>
json-lib-ext-spring
</artifactId>
<version>
1.0.2
</version>
</dependency>
<!--用于测试的 -->
<dependency>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-starter-test
</artifactId>
<scope>
test
</scope>
</dependency>
<!-- 热部署工具 -->
<!-- <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId>
</dependency> -->
...
...
com.zrqx.resource/src/main/java/com/zrqx/resource/bg/aes/.WXBizMsgCrypt.java.swp
0 → 100644
浏览文件 @
52378c51
File added
com.zrqx.resource/src/main/java/com/zrqx/resource/bg/aes/AesException.java
0 → 100644
浏览文件 @
52378c51
package
com
.
zrqx
.
resource
.
bg
.
aes
;
@SuppressWarnings
(
"serial"
)
public
class
AesException
extends
Exception
{
public
final
static
int
OK
=
0
;
public
final
static
int
ValidateSignatureError
=
-
40001
;
public
final
static
int
ParseXmlError
=
-
40002
;
public
final
static
int
ComputeSignatureError
=
-
40003
;
public
final
static
int
IllegalAesKey
=
-
40004
;
public
final
static
int
ValidateAppidError
=
-
40005
;
public
final
static
int
EncryptAESError
=
-
40006
;
public
final
static
int
DecryptAESError
=
-
40007
;
public
final
static
int
IllegalBuffer
=
-
40008
;
//public final static int EncodeBase64Error = -40009;
//public final static int DecodeBase64Error = -40010;
//public final static int GenReturnXmlError = -40011;
private
int
code
;
private
static
String
getMessage
(
int
code
)
{
switch
(
code
)
{
case
ValidateSignatureError:
return
"签名验证错误"
;
case
ParseXmlError:
return
"xml解析失败"
;
case
ComputeSignatureError:
return
"sha加密生成签名失败"
;
case
IllegalAesKey:
return
"SymmetricKey非法"
;
case
ValidateAppidError:
return
"appid校验失败"
;
case
EncryptAESError:
return
"aes加密失败"
;
case
DecryptAESError:
return
"aes解密失败"
;
case
IllegalBuffer:
return
"解密后得到的buffer非法"
;
// case EncodeBase64Error:
// return "base64加密错误";
// case DecodeBase64Error:
// return "base64解密错误";
// case GenReturnXmlError:
// return "xml生成失败";
default
:
return
null
;
// cannot be
}
}
public
int
getCode
()
{
return
code
;
}
AesException
(
int
code
)
{
super
(
getMessage
(
code
));
this
.
code
=
code
;
}
}
com.zrqx.resource/src/main/java/com/zrqx/resource/bg/aes/ByteGroup.java
0 → 100644
浏览文件 @
52378c51
package
com
.
zrqx
.
resource
.
bg
.
aes
;
import
java.util.ArrayList
;
class
ByteGroup
{
ArrayList
<
Byte
>
byteContainer
=
new
ArrayList
<
Byte
>();
public
byte
[]
toBytes
()
{
byte
[]
bytes
=
new
byte
[
byteContainer
.
size
()];
for
(
int
i
=
0
;
i
<
byteContainer
.
size
();
i
++)
{
bytes
[
i
]
=
byteContainer
.
get
(
i
);
}
return
bytes
;
}
public
ByteGroup
addBytes
(
byte
[]
bytes
)
{
for
(
byte
b
:
bytes
)
{
byteContainer
.
add
(
b
);
}
return
this
;
}
public
int
size
()
{
return
byteContainer
.
size
();
}
}
com.zrqx.resource/src/main/java/com/zrqx/resource/bg/aes/PKCS7Encoder.java
0 → 100644
浏览文件 @
52378c51
/**
* 对公众平台发送给公众账号的消息加解密示例代码.
*
* @copyright Copyright (c) 1998-2014 Tencent Inc.
*/
// ------------------------------------------------------------------------
package
com
.
zrqx
.
resource
.
bg
.
aes
;
import
java.nio.charset.Charset
;
import
java.util.Arrays
;
/**
* 提供基于PKCS7算法的加解密接口.
*/
class
PKCS7Encoder
{
static
Charset
CHARSET
=
Charset
.
forName
(
"utf-8"
);
static
int
BLOCK_SIZE
=
32
;
/**
* 获得对明文进行补位填充的字节.
*
* @param count 需要进行填充补位操作的明文字节个数
* @return 补齐用的字节数组
*/
static
byte
[]
encode
(
int
count
)
{
// 计算需要填充的位数
int
amountToPad
=
BLOCK_SIZE
-
(
count
%
BLOCK_SIZE
);
if
(
amountToPad
==
0
)
{
amountToPad
=
BLOCK_SIZE
;
}
// 获得补位所用的字符
char
padChr
=
chr
(
amountToPad
);
String
tmp
=
new
String
();
for
(
int
index
=
0
;
index
<
amountToPad
;
index
++)
{
tmp
+=
padChr
;
}
return
tmp
.
getBytes
(
CHARSET
);
}
/**
* 删除解密后明文的补位字符
*
* @param decrypted 解密后的明文
* @return 删除补位字符后的明文
*/
static
byte
[]
decode
(
byte
[]
decrypted
)
{
int
pad
=
(
int
)
decrypted
[
decrypted
.
length
-
1
];
if
(
pad
<
1
||
pad
>
32
)
{
pad
=
0
;
}
return
Arrays
.
copyOfRange
(
decrypted
,
0
,
decrypted
.
length
-
pad
);
}
/**
* 将数字转化成ASCII码对应的字符,用于对明文进行补码
*
* @param a 需要转化的数字
* @return 转化得到的字符
*/
static
char
chr
(
int
a
)
{
byte
target
=
(
byte
)
(
a
&
0xFF
);
return
(
char
)
target
;
}
}
com.zrqx.resource/src/main/java/com/zrqx/resource/bg/aes/SHA1.java
0 → 100644
浏览文件 @
52378c51
/**
* 对公众平台发送给公众账号的消息加解密示例代码.
*
* @copyright Copyright (c) 1998-2014 Tencent Inc.
*/
// ------------------------------------------------------------------------
package
com
.
zrqx
.
resource
.
bg
.
aes
;
import
java.security.MessageDigest
;
import
java.util.Arrays
;
/**
* SHA1 class
*
* 计算公众平台的消息签名接口.
*/
class
SHA1
{
/**
* 用SHA1算法生成安全签名
* @param token 票据
* @param timestamp 时间戳
* @param nonce 随机字符串
* @param encrypt 密文
* @return 安全签名
* @throws AesException
*/
public
static
String
getSHA1
(
String
token
,
String
timestamp
,
String
nonce
,
String
encrypt
)
throws
AesException
{
try
{
String
[]
array
=
new
String
[]
{
token
,
timestamp
,
nonce
,
encrypt
};
StringBuffer
sb
=
new
StringBuffer
();
// 字符串排序
Arrays
.
sort
(
array
);
for
(
int
i
=
0
;
i
<
4
;
i
++)
{
sb
.
append
(
array
[
i
]);
}
String
str
=
sb
.
toString
();
// SHA1签名生成
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
)
{
e
.
printStackTrace
();
throw
new
AesException
(
AesException
.
ComputeSignatureError
);
}
}
}
com.zrqx.resource/src/main/java/com/zrqx/resource/bg/aes/WXBizMsgCrypt.java
0 → 100644
浏览文件 @
52378c51
差异被折叠。
点击展开。
com.zrqx.resource/src/main/java/com/zrqx/resource/bg/aes/WXBizMsgCryptTest.java
0 → 100644
浏览文件 @
52378c51
package
com
.
zrqx
.
resource
.
bg
.
aes
;
import
static
org
.
junit
.
Assert
.*;
import
java.io.IOException
;
import
java.io.StringReader
;
import
javax.xml.parsers.DocumentBuilder
;
import
javax.xml.parsers.DocumentBuilderFactory
;
import
javax.xml.parsers.ParserConfigurationException
;
import
org.junit.After
;
import
org.junit.AfterClass
;
import
org.junit.Before
;
import
org.junit.BeforeClass
;
import
org.junit.Test
;
import
org.w3c.dom.Document
;
import
org.w3c.dom.Element
;
import
org.w3c.dom.NodeList
;
import
org.xml.sax.InputSource
;
import
org.xml.sax.SAXException
;
public
class
WXBizMsgCryptTest
{
String
encodingAesKey
=
"abcdefghijklmnopqrstuvwxyz0123456789ABCDEFG"
;
String
token
=
"pamtest"
;
String
timestamp
=
"1409304348"
;
String
nonce
=
"xxxxxx"
;
String
appId
=
"wxb11529c136998cb6"
;
String
replyMsg
=
"我是中文abcd123"
;
String
xmlFormat
=
"<xml><ToUserName><![CDATA[toUser]]></ToUserName><Encrypt><![CDATA[%1$s]]></Encrypt></xml>"
;
String
afterAesEncrypt
=
"jn1L23DB+6ELqJ+6bruv21Y6MD7KeIfP82D6gU39rmkgczbWwt5+3bnyg5K55bgVtVzd832WzZGMhkP72vVOfg=="
;
String
randomStr
=
"aaaabbbbccccdddd"
;
String
replyMsg2
=
"<xml><ToUserName><![CDATA[oia2Tj我是中文jewbmiOUlr6X-1crbLOvLw]]></ToUserName><FromUserName><![CDATA[gh_7f083739789a]]></FromUserName><CreateTime>1407743423</CreateTime><MsgType><![CDATA[video]]></MsgType><Video><MediaId><![CDATA[eYJ1MbwPRJtOvIEabaxHs7TX2D-HV71s79GUxqdUkjm6Gs2Ed1KF3ulAOA9H1xG0]]></MediaId><Title><![CDATA[testCallBackReplyVideo]]></Title><Description><![CDATA[testCallBackReplyVideo]]></Description></Video></xml>"
;
String
afterAesEncrypt2
=
"jn1L23DB+6ELqJ+6bruv23M2GmYfkv0xBh2h+XTBOKVKcgDFHle6gqcZ1cZrk3e1qjPQ1F4RsLWzQRG9udbKWesxlkupqcEcW7ZQweImX9+wLMa0GaUzpkycA8+IamDBxn5loLgZpnS7fVAbExOkK5DYHBmv5tptA9tklE/fTIILHR8HLXa5nQvFb3tYPKAlHF3rtTeayNf0QuM+UW/wM9enGIDIJHF7CLHiDNAYxr+r+OrJCmPQyTy8cVWlu9iSvOHPT/77bZqJucQHQ04sq7KZI27OcqpQNSto2OdHCoTccjggX5Z9Mma0nMJBU+jLKJ38YB1fBIz+vBzsYjrTmFQ44YfeEuZ+xRTQwr92vhA9OxchWVINGC50qE/6lmkwWTwGX9wtQpsJKhP+oS7rvTY8+VdzETdfakjkwQ5/Xka042OlUb1/slTwo4RscuQ+RdxSGvDahxAJ6+EAjLt9d8igHngxIbf6YyqqROxuxqIeIch3CssH/LqRs+iAcILvApYZckqmA7FNERspKA5f8GoJ9sv8xmGvZ9Yrf57cExWtnX8aCMMaBropU/1k+hKP5LVdzbWCG0hGwx/dQudYR/eXp3P0XxjlFiy+9DMlaFExWUZQDajPkdPrEeOwofJb"
;
@BeforeClass
public
static
void
setUpBeforeClass
()
throws
Exception
{
}
@AfterClass
public
static
void
tearDownAfterClass
()
throws
Exception
{
}
@Before
public
void
setUp
()
throws
Exception
{
}
@After
public
void
tearDown
()
throws
Exception
{
}
@Test
public
void
testNormal
()
throws
ParserConfigurationException
,
SAXException
,
IOException
{
try
{
WXBizMsgCrypt
pc
=
new
WXBizMsgCrypt
(
token
,
encodingAesKey
,
appId
);
String
afterEncrpt
=
pc
.
encryptMsg
(
replyMsg
,
timestamp
,
nonce
);
DocumentBuilderFactory
dbf
=
DocumentBuilderFactory
.
newInstance
();
DocumentBuilder
db
=
dbf
.
newDocumentBuilder
();
StringReader
sr
=
new
StringReader
(
afterEncrpt
);
InputSource
is
=
new
InputSource
(
sr
);
Document
document
=
db
.
parse
(
is
);
Element
root
=
document
.
getDocumentElement
();
NodeList
nodelist1
=
root
.
getElementsByTagName
(
"Encrypt"
);
NodeList
nodelist2
=
root
.
getElementsByTagName
(
"MsgSignature"
);
String
encrypt
=
nodelist1
.
item
(
0
).
getTextContent
();
String
msgSignature
=
nodelist2
.
item
(
0
).
getTextContent
();
String
fromXML
=
String
.
format
(
xmlFormat
,
encrypt
);
// 第三方收到公众号平台发送的消息
String
afterDecrpt
=
pc
.
decryptMsg
(
msgSignature
,
timestamp
,
nonce
,
fromXML
);
assertEquals
(
replyMsg
,
afterDecrpt
);
}
catch
(
AesException
e
)
{
fail
(
"正常流程,怎么就抛出异常了??????"
);
}
}
@Test
public
void
testAesEncrypt
()
{
try
{
WXBizMsgCrypt
pc
=
new
WXBizMsgCrypt
(
token
,
encodingAesKey
,
appId
);
assertEquals
(
afterAesEncrypt
,
pc
.
encrypt
(
randomStr
,
replyMsg
));
}
catch
(
AesException
e
)
{
e
.
printStackTrace
();
fail
(
"no异常"
);
}
}
@Test
public
void
testAesEncrypt2
()
{
try
{
WXBizMsgCrypt
pc
=
new
WXBizMsgCrypt
(
token
,
encodingAesKey
,
appId
);
assertEquals
(
afterAesEncrypt2
,
pc
.
encrypt
(
randomStr
,
replyMsg2
));
}
catch
(
AesException
e
)
{
e
.
printStackTrace
();
fail
(
"no异常"
);
}
}
@Test
public
void
testIllegalAesKey
()
{
try
{
new
WXBizMsgCrypt
(
token
,
"abcde"
,
appId
);
}
catch
(
AesException
e
)
{
assertEquals
(
AesException
.
IllegalAesKey
,
e
.
getCode
());
return
;
}
fail
(
"错误流程不抛出异常???"
);
}
@Test
public
void
testValidateSignatureError
()
throws
ParserConfigurationException
,
SAXException
,
IOException
{
try
{
WXBizMsgCrypt
pc
=
new
WXBizMsgCrypt
(
token
,
encodingAesKey
,
appId
);
String
afterEncrpt
=
pc
.
encryptMsg
(
replyMsg
,
timestamp
,
nonce
);
DocumentBuilderFactory
dbf
=
DocumentBuilderFactory
.
newInstance
();
DocumentBuilder
db
=
dbf
.
newDocumentBuilder
();
StringReader
sr
=
new
StringReader
(
afterEncrpt
);
InputSource
is
=
new
InputSource
(
sr
);
Document
document
=
db
.
parse
(
is
);
Element
root
=
document
.
getDocumentElement
();
NodeList
nodelist1
=
root
.
getElementsByTagName
(
"Encrypt"
);
String
encrypt
=
nodelist1
.
item
(
0
).
getTextContent
();
String
fromXML
=
String
.
format
(
xmlFormat
,
encrypt
);
pc
.
decryptMsg
(
"12345"
,
timestamp
,
nonce
,
fromXML
);
// 这里签名错误
}
catch
(
AesException
e
)
{
assertEquals
(
AesException
.
ValidateSignatureError
,
e
.
getCode
());
return
;
}
fail
(
"错误流程不抛出异常???"
);
}
@Test
public
void
testVerifyUrl
()
throws
AesException
{
WXBizMsgCrypt
wxcpt
=
new
WXBizMsgCrypt
(
"QDG6eK"
,
"jWmYm7qr5nMoAUwZRjGtBxmz3KA1tkAj3ykkR6q2B2C"
,
"wx5823bf96d3bd56c7"
);
String
verifyMsgSig
=
"5c45ff5e21c57e6ad56bac8758b79b1d9ac89fd3"
;
String
timeStamp
=
"1409659589"
;
String
nonce
=
"263014780"
;
String
echoStr
=
"P9nAzCzyDtyTWESHep1vC5X9xho/qYX3Zpb4yKa9SKld1DsH3Iyt3tP3zNdtp+4RPcs8TgAE7OaBO+FZXvnaqQ=="
;
wxcpt
.
verifyUrl
(
verifyMsgSig
,
timeStamp
,
nonce
,
echoStr
);
// 只要不抛出异常就好
}
}
com.zrqx.resource/src/main/java/com/zrqx/resource/bg/aes/XMLParse.java
0 → 100644
浏览文件 @
52378c51
/**
* 对公众平台发送给公众账号的消息加解密示例代码.
*
* @copyright Copyright (c) 1998-2014 Tencent Inc.
*/
// ------------------------------------------------------------------------
package
com
.
zrqx
.
resource
.
bg
.
aes
;
import
java.io.StringReader
;
import
javax.xml.parsers.DocumentBuilder
;
import
javax.xml.parsers.DocumentBuilderFactory
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
org.w3c.dom.Document
;
import
org.w3c.dom.Element
;
import
org.w3c.dom.NodeList
;
import
org.xml.sax.InputSource
;
/**
* XMLParse class
*
* 提供提取消息格式中的密文及生成回复消息格式的接口.
*/
class
XMLParse
{
private
final
static
Logger
log
=
LoggerFactory
.
getLogger
(
XMLParse
.
class
);
/**
* 提取出xml数据包中的加密消息
* @param xmltext 待提取的xml字符串
* @return 提取出的加密消息字符串
* @throws AesException
*/
public
static
Object
[]
extract
(
String
xmltext
)
throws
AesException
{
Object
[]
result
=
new
Object
[
3
];
try
{
DocumentBuilderFactory
dbf
=
DocumentBuilderFactory
.
newInstance
();
dbf
.
setFeature
(
"http://apache.org/xml/features/disallow-doctype-decl"
,
true
);
dbf
.
setFeature
(
"http://xml.org/sax/features/external-general-entities"
,
false
);
dbf
.
setFeature
(
"http://xml.org/sax/features/external-parameter-entities"
,
false
);
dbf
.
setFeature
(
"http://apache.org/xml/features/nonvalidating/load-external-dtd"
,
false
);
dbf
.
setXIncludeAware
(
false
);
dbf
.
setExpandEntityReferences
(
false
);
DocumentBuilder
db
=
dbf
.
newDocumentBuilder
();
StringReader
sr
=
new
StringReader
(
xmltext
);
InputSource
is
=
new
InputSource
(
sr
);
Document
document
=
db
.
parse
(
is
);
Element
root
=
document
.
getDocumentElement
();
NodeList
nodelist1
=
root
.
getElementsByTagName
(
"Encrypt"
);
NodeList
nodelist2
=
root
.
getElementsByTagName
(
"ToUserName"
);
result
[
0
]
=
0
;
result
[
1
]
=
nodelist1
.
item
(
0
).
getTextContent
();
if
(
nodelist2
.
item
(
0
)
!=
null
){
result
[
2
]
=
nodelist2
.
item
(
0
).
getTextContent
();
}
return
result
;
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
throw
new
AesException
(
AesException
.
ParseXmlError
);
}
}
/**
* 生成xml消息
* @param encrypt 加密后的消息密文
* @param signature 安全签名
* @param timestamp 时间戳
* @param nonce 随机字符串
* @return 生成的xml字符串
*/
public
static
String
generate
(
String
encrypt
,
String
signature
,
String
timestamp
,
String
nonce
)
{
String
format
=
"<xml>\n"
+
"<Encrypt><![CDATA[%1$s]]></Encrypt>\n"
+
"<MsgSignature><![CDATA[%2$s]]></MsgSignature>\n"
+
"<TimeStamp>%3$s</TimeStamp>\n"
+
"<Nonce><![CDATA[%4$s]]></Nonce>\n"
+
"</xml>"
;
return
String
.
format
(
format
,
encrypt
,
signature
,
timestamp
,
nonce
);
}
}
com.zrqx.resource/src/main/java/com/zrqx/resource/bg/controller/WechatAuthorization.java
0 → 100644
浏览文件 @
52378c51
差异被折叠。
点击展开。
com.zrqx.resource/src/main/java/com/zrqx/resource/bg/controller/config/WeChatConfig.java
浏览文件 @
52378c51
...
...
@@ -9,9 +9,10 @@ public class WeChatConfig {
/**
* 微信公众号appid
*/
public
final
static
String
WECHAT_ClIENT_Id
=
"wx
a036be65443d937f
"
;
public
final
static
String
WECHAT_ClIENT_Id
=
"wx
d53422d70d076d82
"
;
/**
* 微信公众号AppSecret
*/
public
final
static
String
WECHAT_ClIENT_SECRET
=
"e2070c6ac1a3c465042320d17a946479"
;
public
final
static
String
WECHAT_ClIENT_SECRET
=
"5c1cccaaf3daeb84303771693bee4ec3"
;
}
com.zrqx.resource/src/main/java/com/zrqx/resource/bg/controller/config/WechatStaticData.java
浏览文件 @
52378c51
...
...
@@ -48,11 +48,11 @@ public class WechatStaticData {
/**
* 获取用户access_token
*/
public
final
static
String
OAUTT2_PATH
=
"https://api.weixin.qq.com/
sns/oauth2/access_token?appid
="
;
public
final
static
String
OAUTT2_PATH
=
"https://api.weixin.qq.com/
cgi-bin/component/api_query_auth?component_access_token
="
;
/**
* 获取用户信息
*/
public
final
static
String
USERINFO_PATH
=
"https://api.weixin.qq.com/
sns/userinfo?
access_token="
;
public
final
static
String
USERINFO_PATH
=
"https://api.weixin.qq.com/
cgi-bin/component/api_get_authorizer_info?component_
access_token="
;
/**
* 图片上传微信url
*/
...
...
com.zrqx.resource/src/main/java/com/zrqx/resource/bg/controller/content/ArticleLibraryController.java
浏览文件 @
52378c51
...
...
@@ -404,7 +404,7 @@ public class ArticleLibraryController {
List
<
ArticleRelation
>
list
=
articleRelationService
.
selectByCriteria
();
if
(
list
.
size
()>
0
){
for
(
ArticleRelation
resourceRelation
:
list
)
{
userAccountRelationService
.
createCriteria
().
andEqualTo
(
"
original_author"
,
resourceRelation
.
getOriginal_author
());
userAccountRelationService
.
createCriteria
().
andEqualTo
(
"
account"
,
resourceRelation
.
getAccount
());
UserAccountRelation
user
=
userAccountRelationService
.
selectOneByCriteria
();
//企鹅号
if
(
form
.
getOriginal_author
().
get
(
i
).
equals
(
"1"
)){
...
...
@@ -422,10 +422,10 @@ public class ArticleLibraryController {
JSONObject
jsonobj_url
=
JSON
.
parseObject
(
excute
);
//成功结果:{"type":"TYPE","media_id":"MEDIA_ID","created_at":123456789}
String
thumb_media_id
=
jsonobj_url
.
getString
(
"media_id"
);
//String thumb_media_id ="
_4vt4k61UkTmNZdz2-HVHBQtPNHVvUbbEbrpQT6L7RhxxoGyiuogGlOC4EopHdCQ
";
//String thumb_media_id ="
bBnUF9ZEV1P09gmeGGoaOrFYTIdchZWEc4ZJ32ZPhgyUB5hOrh30hHvca15hreeR
";
String
content
=
library
.
getText
().
replaceAll
(
" "
,
""
);
String
param
=
"{\"articles\":[{\"thumb_media_id\":\""
+
thumb_media_id
+
"\",\"author\":\""
+
user
.
getAccountName
()+
"\",\"title\":\""
+
library
.
getTitle
()+
"\",\"content\":\""
+
content
+
"\",\"show_cover_pic\":1,\"need_open_comment\":1,\"only_fans_can_comment\":1}]}"
;
String
url_Wx
=
WechatStaticData
.
UPLOAD_SENDALL_NEWS
;
String
url_Wx
=
WechatStaticData
.
UPLOAD_SENDALL_NEWS
+
user
.
getAccess_token
()
;
JSONObject
json
=
JSONArray
.
parseObject
(
param
);
String
result_Wx
=
HttpClientUtil
.
doPostW
(
url_Wx
,
"utf-8"
,
json
);
JSONObject
jsonobj_WX
=
JSON
.
parseObject
(
result_Wx
);
...
...
@@ -436,7 +436,6 @@ public class ArticleLibraryController {
if
(
news
.
equals
(
"news"
)){
//根据标签进行群发,图文消息
param1
=
"{\"filter\":{\"is_to_all\":true,\"tag_id\":null},\"mpnews\":{\"media_id\":\""
+
media_id
+
"\"},\"msgtype\":\"mpnews\",\"send_ignore_reprint\":0}"
;
//param1="{\"touser\":\"o2MPM5jh1V8p_X0nC5D5ejsWPOLs\",\"mpnews\":{\"media_id\":\""+media_id+"\"},\"msgtype\":\"mpnews\"}";
}
else
if
(
news
.
equals
(
"image"
)){
//获取图片
param1
=
"{\"filter\":{\"is_to_all\":true,\"tag_id\":},\"image\":{\"media_id\":\""
+
media_id
+
"\"},\"msgtype\":\"image\"}"
;
...
...
com.zrqx.resource/src/main/java/com/zrqx/resource/bg/controller/user/UserController.java
浏览文件 @
52378c51
差异被折叠。
点击展开。
com.zrqx.resource/src/main/java/com/zrqx/resource/bg/util/Program.java
0 → 100644
浏览文件 @
52378c51
package
com
.
zrqx
.
resource
.
bg
.
util
;
import
java.io.StringReader
;
import
javax.xml.parsers.DocumentBuilder
;
import
javax.xml.parsers.DocumentBuilderFactory
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
org.w3c.dom.Document
;
import
org.w3c.dom.Element
;
import
org.w3c.dom.NodeList
;
import
org.xml.sax.InputSource
;
import
com.zrqx.resource.bg.aes.WXBizMsgCrypt
;
public
class
Program
{
private
final
static
Logger
logger
=
LoggerFactory
.
getLogger
(
Program
.
class
);
public
static
void
main
(
String
[]
args
)
throws
Exception
{
//
// 第三方回复公众平台
//
// 需要加密的明文
String
encodingAesKey
=
"abcdefghijklmnopqrstuvwxyz0123456789ABCDEFG"
;
String
token
=
"pamtest"
;
String
timestamp
=
"1409304348"
;
String
nonce
=
"xxxxxx"
;
String
appId
=
"wx4f95e09cb7f4f354"
;
String
replyMsg
=
" 中文<xml><ToUserName><![CDATA[oia2TjjewbmiOUlr6X-1crbLOvLw]]></ToUserName><FromUserName><![CDATA[gh_7f083739789a]]></FromUserName><CreateTime>1407743423</CreateTime><MsgType><![CDATA[video]]></MsgType><Video><MediaId><![CDATA[eYJ1MbwPRJtOvIEabaxHs7TX2D-HV71s79GUxqdUkjm6Gs2Ed1KF3ulAOA9H1xG0]]></MediaId><Title><![CDATA[testCallBackReplyVideo]]></Title><Description><![CDATA[testCallBackReplyVideo]]></Description></Video></xml>"
;
WXBizMsgCrypt
pc
=
new
WXBizMsgCrypt
(
token
,
encodingAesKey
,
appId
);
String
mingwen
=
pc
.
encryptMsg
(
replyMsg
,
timestamp
,
nonce
);
System
.
out
.
println
(
"加密后: "
+
mingwen
);
DocumentBuilderFactory
dbf
=
DocumentBuilderFactory
.
newInstance
();
dbf
.
setFeature
(
"http://apache.org/xml/features/disallow-doctype-decl"
,
true
);
dbf
.
setFeature
(
"http://xml.org/sax/features/external-general-entities"
,
false
);
dbf
.
setFeature
(
"http://xml.org/sax/features/external-parameter-entities"
,
false
);
dbf
.
setFeature
(
"http://apache.org/xml/features/nonvalidating/load-external-dtd"
,
false
);
dbf
.
setXIncludeAware
(
false
);
dbf
.
setExpandEntityReferences
(
false
);
DocumentBuilder
db
=
dbf
.
newDocumentBuilder
();
StringReader
sr
=
new
StringReader
(
mingwen
);
InputSource
is
=
new
InputSource
(
sr
);
Document
document
=
db
.
parse
(
is
);
Element
root
=
document
.
getDocumentElement
();
NodeList
nodelist1
=
root
.
getElementsByTagName
(
"Encrypt"
);
NodeList
nodelist2
=
root
.
getElementsByTagName
(
"MsgSignature"
);
String
encrypt
=
nodelist1
.
item
(
0
).
getTextContent
();
String
msgSignature
=
nodelist2
.
item
(
0
).
getTextContent
();
String
format
=
"<xml><ToUserName><![CDATA[toUser]]></ToUserName><Encrypt><![CDATA[%1$s]]></Encrypt></xml>"
;
String
fromXML
=
String
.
format
(
format
,
encrypt
);
// 公众平台发送消息给第三方,第三方处理
// 第三方收到公众号平台发送的消息
String
result2
=
pc
.
decryptMsg
(
msgSignature
,
timestamp
,
nonce
,
fromXML
);
logger
.
info
(
"++++++++++++++++++解密后明文:"
+
result2
);
System
.
out
.
println
(
"解密后明文: "
+
result2
);
}
}
com.zrqx.resource/src/main/java/com/zrqx/resource/commons/Redis.java
浏览文件 @
52378c51
...
...
@@ -27,7 +27,6 @@ import com.zrqx.core.util.JsonUtil.JsonUtil;
*/
@Component
public
class
Redis
{
private
static
final
String
FG_TOKEN
=
"y-token"
;
private
static
final
String
BG_TOKEN
=
"x-token"
;
...
...
@@ -50,6 +49,36 @@ public class Redis {
public
User
getUser
()
{
return
getInfoObjectRedis
(
getToken
(
BG_TOKEN
),
User
.
class
);
}
public
String
fmtObj
(
Object
obj
)
throws
IOException
{
return
obj
instanceof
String
?
obj
.
toString
():
JsonUtil
.
bean2Json
(
obj
);
}
/**
* 添加到redis
* @param token
* Key
* @param obj
* Value
* @param timeout
* 过期时间
* @param unit
* TimeUnitEnum 时间格式
* @throws IOException
*/
public
void
set
(
String
token
,
Object
obj
,
long
timeout
,
TimeUnit
unit
)
throws
IOException
{
stringRedisTemplate
.
opsForValue
().
set
(
token
,
fmtObj
(
obj
),
timeout
,
unit
);
}
public
void
set
(
String
token
,
Object
obj
,
long
timeout
)
throws
IOException
{
stringRedisTemplate
.
opsForValue
().
set
(
token
,
fmtObj
(
obj
),
timeout
,
TimeUnit
.
SECONDS
);
}
/**
* 添加到redis
* @param token Key
* @param obj Value
* @throws IOException
*/
public
void
set
(
String
token
,
Object
obj
)
throws
IOException
{
stringRedisTemplate
.
opsForValue
().
set
(
token
,
fmtObj
(
obj
));
}
/**
* 根据key删除redis中的数据
* @param key
...
...
@@ -107,18 +136,4 @@ public class Redis {
public
static
String
getFgToken
(){
return
getToken
(
FG_TOKEN
);
}
/**
* 获取前台登录用户信息
*
* @return
*/
public
String
fmtObj
(
Object
obj
)
throws
IOException
{
return
obj
instanceof
String
?
obj
.
toString
():
JsonUtil
.
bean2Json
(
obj
);
}
public
void
set
(
String
token
,
Object
obj
,
long
timeout
,
TimeUnit
unit
)
throws
IOException
{
stringRedisTemplate
.
opsForValue
().
set
(
token
,
fmtObj
(
obj
),
timeout
,
unit
);
}
public
void
set
(
String
token
,
Object
obj
,
long
timeout
)
throws
IOException
{
stringRedisTemplate
.
opsForValue
().
set
(
token
,
fmtObj
(
obj
),
timeout
,
TimeUnit
.
SECONDS
);
}
}
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论