1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
|
/**
* 獲取微信小程序 session_key 和 openid
*
* @param code 調用微信登陸返回的Code
* @return
*/
public
static
JSONObject getSessionKeyOropenid(String code) {
//微信端登錄code值
String wxCode = code;
Locale locale =
new
Locale(
"en"
,
"US"
);
ResourceBundle resource = ResourceBundle.getBundle(
"config/wx-config"
,locale);
//讀取屬性文件
String requestUrl = resource.getString(
"url"
);
//請求地址 https://api.weixin.qq.com/sns/jscode2session
Map<String, String> requestUrlParam =
new
HashMap<String, String>();
requestUrlParam.put(
"appid"
, resource.getString(
"appId"
));
//開發者設置中的appId
requestUrlParam.put(
"secret"
, resource.getString(
"appSecret"
));
//開發者設置中的appSecret
requestUrlParam.put(
"js_code"
, wxCode);
//小程序調用wx.login返回的code
requestUrlParam.put(
"grant_type"
, resource.getString(
"grantType"
));
//默認參數 authorization_code
//發送post請求讀取調用微信 https://api.weixin.qq.com/sns/jscode2session 接口獲取openid用戶唯一標識
JSONObject jsonObject = JSON.parseObject(sendPost(requestUrl, requestUrlParam));
return
jsonObject;
}
/**
* 向指定 URL 發送POST方法的請求
*
* @param url 發送請求的 URL
* @return 所代表遠程資源的響應結果
*/
public
static
String sendPost(String url, Map<String, ?> paramMap) {
PrintWriter out =
null
;
BufferedReader in =
null
;
String result =
""
;
String param =
""
;
Iterator<String> it = paramMap.keySet().iterator();
while
(it.hasNext()) {
String key = it.next();
param += key +
"="
+ paramMap.get(key) +
"&"
;
}
try
{
URL realUrl =
new
URL(url);
// 打開和URL之間的連接
URLConnection conn = realUrl.openConnection();
// 設置通用的請求屬性
conn.setRequestProperty(
"accept"
,
"*/*"
);
conn.setRequestProperty(
"connection"
,
"Keep-Alive"
);
conn.setRequestProperty(
"Accept-Charset"
,
"utf-8"
);
conn.setRequestProperty(
"user-agent"
,
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"
);
// 發送POST請求必須設置如下兩行
conn.setDoOutput(
true
);
conn.setDoInput(
true
);
// 獲取URLConnection對象對應的輸出流
out =
new
PrintWriter(conn.getOutputStream());
// 發送請求參數
out.print(param);
// flush輸出流的緩沖
out.flush();
// 定義BufferedReader輸入流來讀取URL的響應
in =
new
BufferedReader(
new
InputStreamReader(conn.getInputStream(),
"UTF-8"
));
String line;
while
((line = in.readLine()) !=
null
) {
result += line;
}
}
catch
(Exception e) {
log.error(e.getMessage(), e);
}
//使用finally塊來關閉輸出流、輸入流
finally
{
try
{
if
(out !=
null
) {
out.close();
}
if
(in !=
null
) {
in.close();
}
}
catch
(IOException ex) {
ex.printStackTrace();
}
}
return
result;
}
/**
* 解密用戶敏感數據獲取用戶信息
*
* @param sessionKey 數據進行加密簽名的密鑰
* @param encryptedData 包括敏感數據在內的完整用戶信息的加密數據
* @param iv 加密算法的初始向量
* @return
* */
public
static
JSONObject getUserInfo(String encryptedData, String sessionKey, String iv) {
// 被加密的數據
byte
[] dataByte = Base64Util.decodeByte(encryptedData);
// 加密秘鑰
byte
[] keyByte = Base64Util.decodeByte(sessionKey);
// 偏移量
byte
[] ivByte = Base64Util.decodeByte(iv);
try
{
// 如果密鑰不足16位,那么就補足. 這個if 中的內容很重要
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
JSON.parseObject(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) {
log.error(e.getMessage(), e);
}
return
null
;
}
|