controller
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
|
@RequestMapping
(
"/weixin"
)
@ResponseBody
public
String weixin(String signature,String timestamp
,String nonce,String echostr)
throws
NoSuchAlgorithmException {
String token=
"umaiw"
;
String tmpStr= getSHA1(token, timestamp, nonce);
System.out.println(
"+++++++++++++++++++++tmpStr "
+tmpStr);
System.out.println(
"---------------------signature "
+signature);
if
(tmpStr.equals(signature)){
return
echostr;
}
else
{
return
null
;
}
/**
* 用SHA1算法生成安全签名
* @param token 票据
* @param timestamp 时间戳
* @param nonce 随机字符串
* @param encrypt 密文
* @return 安全签名
* @throws NoSuchAlgorithmException
* @throws AesException
*/
public
String getSHA1(String token, String timestamp, String nonce)
throws
NoSuchAlgorithmException {
String[] array =
new
String[] { token, timestamp, nonce };
StringBuffer sb =
new
StringBuffer();
// 字符串排序
Arrays.sort(array);
for
(
int
i =
0
; i <
3
; 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();
}
|
Sign.java
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
|
package
com.util;
import
java.util.UUID;
import
java.util.Map;
import
java.util.HashMap;
import
java.util.Formatter;
import
java.util.concurrent.TimeoutException;
import
java.security.MessageDigest;
import
java.security.NoSuchAlgorithmException;
import
java.io.IOException;
import
java.io.UnsupportedEncodingException;
import
javax.servlet.http.HttpServletRequest;
import
net.rubyeye.xmemcached.exception.MemcachedException;
import
org.junit.Test;
import
org.springframework.beans.factory.annotation.Autowired;
import
org.springframework.stereotype.Component;
@Component
(
"Sign"
)
public
class
Sign {
@Autowired
private
WeiXinRequest weiXinRequest;
@Test
public
Map<String, String> test(HttpServletRequest requesturl)
throws
IOException, TimeoutException, InterruptedException, MemcachedException {
String ticket= weiXinRequest.getWeiXinTicket();
// 注意 URL 一定要动态获取,不能 hardcode
String url = requesturl.getRequestURL().toString();
Map<String, String> ret = sign(ticket, url);
for
(Map.Entry entry : ret.entrySet()) {
System.out.println(entry.getKey() +
", "
+ entry.getValue());
}
ret.put(
"appId"
,weiXinRequest.appId );
return
ret;
};
public
static
Map<String, String> sign(String jsapi_ticket, String url) {
Map<String, String> ret =
new
HashMap<String, String>();
String nonce_str = create_nonce_str();
String timestamp = create_timestamp();
String string1;
String signature =
""
;
//注意这里参数名必须全部小写,且必须有序
string1 =
"jsapi_ticket="
+ jsapi_ticket +
"&noncestr="
+ nonce_str +
"×tamp="
+ timestamp +
"&url="
+ url;
System.out.println(string1);
try
{
MessageDigest crypt = MessageDigest.getInstance(
"SHA-1"
);
crypt.reset();
crypt.update(string1.getBytes(
"UTF-8"
));
signature = byteToHex(crypt.digest());
}
catch
(NoSuchAlgorithmException e)
{
e.printStackTrace();
}
catch
(UnsupportedEncodingException e)
{
e.printStackTrace();
}
ret.put(
"url"
, url);
ret.put(
"jsapi_ticket"
, jsapi_ticket);
ret.put(
"nonceStr"
, nonce_str);
ret.put(
"timestamp"
, timestamp);
ret.put(
"signature"
, signature);
return
ret;
}
private
static
String byteToHex(
final
byte
[] hash) {
Formatter formatter =
new
Formatter();
for
(
byte
b : hash)
{
formatter.format(
"%02x"
, b);
}
String result = formatter.toString();
formatter.close();
return
result;
}
private
static
String create_nonce_str() {
return
UUID.randomUUID().toString();
}
private
static
String create_timestamp() {
return
Long.toString(System.currentTimeMillis() /
1000
);
}
}
|
WeiXinRequest.java
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
|
package
com.util;
import
java.io.IOException;
import
java.io.InputStreamReader;
import
java.net.HttpURLConnection;
import
java.net.URL;
import
java.text.SimpleDateFormat;
import
java.util.Date;
import
java.util.Map;
import
java.util.concurrent.TimeoutException;
import
javax.servlet.http.HttpServletRequest;
import
javax.xml.crypto.Data;
import
net.rubyeye.xmemcached.MemcachedClient;
import
net.rubyeye.xmemcached.exception.MemcachedException;
import
org.activiti.engine.impl.util.json.JSONObject;
import
org.activiti.engine.impl.util.json.JSONTokener;
import
org.springframework.beans.factory.annotation.Autowired;
import
org.springframework.stereotype.Component;
import
com.model.CitySession;
@Component
(
"WeiXinRequest"
)
public
class
WeiXinRequest {
@Autowired
private
MemcachedClient memcachedClient;
String appId =
"你扫描后登陆进去的appid 不同人不一样哦"
;
private
String appSecret=
"同上"
;
public
String getWeiXinTicket()
throws
IOException, TimeoutException, InterruptedException, MemcachedException {
String access_token=
""
;
String ticket=
""
;
Object act=memcachedClient.get(
"access_token"
);
Object apiticket=memcachedClient.get(
"ticket"
);
Object expires_in ;
if
(
null
==act){
URL url =
new
URL(
"https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="
+ appId +
"&secret="
+ appSecret);
JSONObject json = getConnection(url);
access_token = (String) json.getString(
"access_token"
);
expires_in= json.get(
"expires_in"
);
if
(access_token ==
null
) {
return
null
;
}
memcachedClient.set(
"access_token"
,
2
*
60
*
60
, access_token);
}
else
{
access_token=(String) act;
}
System.out.println(
"access_token is ====="
+ access_token);
if
(
null
==apiticket){
URL url1=
new
URL(
"https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token="
+access_token+
"&type=jsapi"
);
JSONObject json1 = getConnection(url1);
ticket=(String) json1.get(
"ticket"
);
}
else
{
ticket=(String) apiticket;
}
return
ticket;
// 断开连接
}
public
JSONObject getConnection(URL url)
throws
IOException {
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setDoOutput(
true
);
connection.setDoInput(
true
);
connection.setRequestMethod(
"GET"
);
connection.setUseCaches(
false
);
connection.setInstanceFollowRedirects(
true
);
connection.setRequestProperty(
"Content-Type"
,
"application/x-www-form-urlencoded"
);
connection.connect();
JSONObject jsono =
new
JSONObject(
new
JSONTokener(
new
InputStreamReader(connection.getInputStream())));
connection.disconnect();
return
jsono;
}
}
|
js发送请求的controller
1
2
3
4
5
6
7
8
9
10
11
|
/*
* json数据格式测试
*/
@RequestMapping
(value =
"/house/index1"
)
public
ModelAndView index(HttpServletRequest request,
HttpServletResponse response, ModelMap modelMap,
HttpSession session)
throws
IOException, TimeoutException, InterruptedException, MemcachedException {
Map<String, String> map=sign.test(request);
modelMap.addAllAttributes(map);
return
new
ModelAndView(
"/views/index/weixintest"
,modelMap);
}
|