在本篇博客以前,博主已經寫了4篇關於微信相關文章,其中三篇是本文基礎:javascript
一、微信開發之入門教程,該文章詳細講解了企業號體驗號免費申請與一些必要的配置,以及如何調用微信接口。html
二、微信開發之經過代理調試本地項目,該文章詳細講解了如何調試本地項目,使用工具的詳細安裝與配置。前端
三、微信開發之使用java獲取簽名signature(貼源碼,附工程),該文詳細講些瞭如何獲取簽名,代碼十分詳細。java
對於初學者,可能還不知道訂閱號、服務號、和企業號的區別,博主以前也是一直沒有弄清楚,所以查閱資料整理了一篇博客供你們閱讀:微信服務號、訂閱號和企業號的區別(運營和開發兩個角度)。建議有時間得猿友仍是閱讀一下爲好。git
上面的文章內容雖然有點多並且繁瑣,看完以後不敢說已經入門,可是初步瞭解,本身寫實例是沒有問題的。不積跬步無以致千里,但願猿友們耐心繼續下去!!!!!!web
上面的文章內容雖然有點多並且繁瑣,看完以後不敢說已經入門,可是初步瞭解,本身寫實例是沒有問題的。不積跬步無以致千里,但願猿友們耐心繼續下去!!!!!!spring
上面的文章內容雖然有點多並且繁瑣,看完以後不敢說已經入門,可是初步瞭解,本身寫實例是沒有問題的。不積跬步無以致千里,但願猿友們耐心繼續下去!!!!!!apache
期間可能會遇到一些坑,歡迎與博主評論交流json
有了上面的基礎,接下來博主將分享一個具體的微信開發實例,獲取用戶當前的地理位置。api
1、結果演示
2、代碼及代碼講解
本工程使用的環境是Eclipse + maven + springmvc,下面附上關鍵代碼,springmvc和web.xml相關配置和maven相關依賴就不一一列舉,最後會附上工程供你們下載。
2.一、獲取簽名工具類(httpclient和sha1加密)
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
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
|
package
com.luo.util;
import
java.io.IOException;
import
java.io.UnsupportedEncodingException;
import
java.security.MessageDigest;
import
java.security.NoSuchAlgorithmException;
import
java.util.ArrayList;
import
java.util.HashMap;
import
java.util.Iterator;
import
java.util.List;
import
java.util.Map;
import
java.util.Set;
import
java.util.UUID;
import
net.sf.json.JSONObject;
import
org.apache.http.HttpEntity;
import
org.apache.http.HttpResponse;
import
org.apache.http.NameValuePair;
import
org.apache.http.ParseException;
import
org.apache.http.client.ClientProtocolException;
import
org.apache.http.client.entity.UrlEncodedFormEntity;
import
org.apache.http.client.methods.HttpGet;
import
org.apache.http.client.methods.HttpPost;
import
org.apache.http.client.methods.HttpUriRequest;
import
org.apache.http.impl.client.DefaultHttpClient;
import
org.apache.http.message.BasicNameValuePair;
import
org.apache.http.protocol.HTTP;
import
org.apache.http.util.EntityUtils;
public
class
HttpXmlClient {
public
static
String post(String url, Map<String, String> params) {
DefaultHttpClient httpclient =
new
DefaultHttpClient();
String body =
null
;
HttpPost post = postForm(url, params);
body = invoke(httpclient, post);
httpclient.getConnectionManager().shutdown();
return
body;
}
public
static
String get(String url) {
DefaultHttpClient httpclient =
new
DefaultHttpClient();
String body =
null
;
HttpGet get =
new
HttpGet(url);
body = invoke(httpclient, get);
httpclient.getConnectionManager().shutdown();
return
body;
}
private
static
String invoke(DefaultHttpClient httpclient,
HttpUriRequest httpost) {
HttpResponse response = sendRequest(httpclient, httpost);
String body = paseResponse(response);
return
body;
}
private
static
String paseResponse(HttpResponse response) {
HttpEntity entity = response.getEntity();
String charset = EntityUtils.getContentCharSet(entity);
String body =
null
;
try
{
body = EntityUtils.toString(entity);
}
catch
(ParseException e) {
e.printStackTrace();
}
catch
(IOException e) {
e.printStackTrace();
}
return
body;
}
private
static
HttpResponse sendRequest(DefaultHttpClient httpclient,
HttpUriRequest httpost) {
HttpResponse response =
null
;
try
{
response = httpclient.execute(httpost);
}
catch
(ClientProtocolException e) {
e.printStackTrace();
}
catch
(IOException e) {
e.printStackTrace();
}
return
response;
}
private
static
HttpPost postForm(String url, Map<String, String> params) {
HttpPost httpost =
new
HttpPost(url);
List<NameValuePair> nvps =
new
ArrayList<NameValuePair>();
Set<String> keySet = params.keySet();
for
(String key : keySet) {
nvps.add(
new
BasicNameValuePair(key, params.get(key)));
}
try
{
httpost.setEntity(
new
UrlEncodedFormEntity(nvps, HTTP.UTF_8));
}
catch
(UnsupportedEncodingException e) {
e.printStackTrace();
}
return
httpost;
}
public
static
void
main(String[] args) {
//獲取access_token
Map<String, String> params =
new
HashMap<String, String>();
params.put(
"corpid"
,
"wx5f24fa0db1819ea2"
);
params.put(
"corpsecret"
,
"uQtWzF0bQtl2KRHX0amekjpq8L0aO96LSpSNfctOBLRbuYPO4DUBhMn0_v2jHS-9"
);
String xml = HttpXmlClient.post(
"https://qyapi.weixin.qq.com/cgi-bin/gettoken"
,params);
JSONObject jsonMap = JSONObject.fromObject(xml);
Map<String, String> map =
new
HashMap<String, String>();
Iterator<String> it = jsonMap.keys();
while
(it.hasNext()) {
String key = (String) it.next();
String u = jsonMap.get(key).toString();
map.put(key, u);
}
String access_token = map.get(
"access_token"
);
System.out.println(
"access_token="
+ access_token);
//獲取ticket
params.put(
"access_token"
,access_token);
xml = HttpXmlClient.post(
"https://qyapi.weixin.qq.com/cgi-bin/get_jsapi_ticket"
,params);
jsonMap = JSONObject.fromObject(xml);
map =
new
HashMap<String, String>();
it = jsonMap.keys();
while
(it.hasNext()) {
String key = (String) it.next();
String u = jsonMap.get(key).toString();
map.put(key, u);
}
String jsapi_ticket = map.get(
"ticket"
);
System.out.println(
"jsapi_ticket="
+ jsapi_ticket);
//獲取簽名signature
String noncestr = UUID.randomUUID().toString();
String timestamp = Long.toString(System.currentTimeMillis() /
1000
);
String url=
"http://mp.weixin.qq.com"
;
String str =
"jsapi_ticket="
+ jsapi_ticket +
"&noncestr="
+ noncestr +
"×tamp="
+ timestamp +
"&url="
+ url;
//sha1加密
String signature = SHA1(str);
System.out.println(
"noncestr="
+ noncestr);
System.out.println(
"timestamp="
+ timestamp);
System.out.println(
"signature="
+ signature);
//最終得到調用微信js接口驗證須要的三個參數noncestr、timestamp、signature
}
/**
* @author:羅國輝
* @date: 2015年12月17日 上午9:24:43
* @description: SHA、SHA1加密
* @parameter: str:待加密字符串
* @return: 加密串
**/
public
static
String SHA1(String str) {
try
{
MessageDigest digest = java.security.MessageDigest
.getInstance(
"SHA-1"
);
//若是是SHA加密只須要將"SHA-1"改爲"SHA"便可
digest.update(str.getBytes());
byte
messageDigest[] = digest.digest();
// Create Hex String
StringBuffer hexStr =
new
StringBuffer();
// 字節數組轉換爲 十六進制 數
for
(
int
i =
0
; i < messageDigest.length; i++) {
String shaHex = Integer.toHexString(messageDigest[i] &
0xFF
);
if
(shaHex.length() <
2
) {
hexStr.append(
0
);
}
hexStr.append(shaHex);
}
return
hexStr.toString();
}
catch
(NoSuchAlgorithmException e) {
e.printStackTrace();
}
return
null
;
}
}
|
2.二、controller代碼(儘量仔細閱讀下面的每一行代碼,特別是url部分)
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
|
package
com.luo.controller;
import
java.util.HashMap;
import
java.util.Iterator;
import
java.util.Map;
import
java.util.UUID;
import
javax.servlet.http.HttpServletRequest;
import
net.sf.json.JSONObject;
import
org.springframework.stereotype.Controller;
import
org.springframework.web.bind.annotation.RequestMapping;
import
org.springframework.web.servlet.ModelAndView;
import
com.luo.util.HttpXmlClient;
@Controller
public
class
UserController {
@RequestMapping
(
"/"
)
public
ModelAndView getIndex(HttpServletRequest request){
ModelAndView mav =
new
ModelAndView(
"index"
);
//獲取access_token
Map<String, String> params =
new
HashMap<String, String>();
params.put(
"corpid"
,
"wx7099477f2de8aded"
);
params.put(
"corpsecret"
,
"4clWzENvHVmpcyuA4toys0URkfYanIqWtxZ5plbisn6Cd5AVTF0thpaK6UAhjIvN"
);
String xml = HttpXmlClient.post(
"https://qyapi.weixin.qq.com/cgi-bin/gettoken"
,params);
JSONObject jsonMap = JSONObject.fromObject(xml);
Map<String, String> map =
new
HashMap<String, String>();
Iterator<String> it = jsonMap.keys();
while
(it.hasNext()) {
String key = (String) it.next();
String u = jsonMap.get(key).toString();
map.put(key, u);
}
String access_token = map.get(
"access_token"
);
//獲取ticket
params.put(
"access_token"
,access_token);
xml = HttpXmlClient.post(
"https://qyapi.weixin.qq.com/cgi-bin/get_jsapi_ticket"
,params);
jsonMap = JSONObject.fromObject(xml);
map =
new
HashMap<String, String>();
it = jsonMap.keys();
while
(it.hasNext()) {
String key = (String) it.next();
String u = jsonMap.get(key).toString();
map.put(key, u);
}
String jsapi_ticket = map.get(
"ticket"
);
//獲取簽名signature
String noncestr = UUID.randomUUID().toString();
String timestamp = Long.toString(System.currentTimeMillis() /
1000
);
//獲取請求url
String path = request.getContextPath();
//覺得我配置的菜單是http://yo.bbdfun.com/first_maven_project/,最後是有"/"的,因此url也加上了"/"
String url = request.getScheme() +
"://"
+ request.getServerName() + path +
"/"
;
String str =
"jsapi_ticket="
+ jsapi_ticket +
"&noncestr="
+ noncestr +
"×tamp="
+ timestamp +
"&url="
+ url;
//sha1加密
String signature = HttpXmlClient.SHA1(str);
mav.addObject(
"signature"
, signature);
mav.addObject(
"timestamp"
, timestamp);
mav.addObject(
"noncestr"
, noncestr);
mav.addObject(
"appId"
,
"wx7099477f2de8aded"
);
System.out.println(
"jsapi_ticket="
+ jsapi_ticket);
System.out.println(
"noncestr="
+ noncestr);
System.out.println(
"timestamp="
+ timestamp);
System.out.println(
"url="
+ url);
System.out.println(
"str="
+ str);
System.out.println(
"signature="
+ signature);
return
mav;
}
}
|
2.三、前端js代碼(儘量仔細閱讀下面的每一行代碼)
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
|
<%@ page language=
"java"
contentType=
"text/html; charset=UTF-8"
pageEncoding=
"UTF-8"
%>
<html>
<head>
<script src=
"http://res.wx.qq.com/open/js/jweixin-1.0.0.js"
></script>
<script>
wx.config({
debug:
true
,
// 開啓調試模式,調用的全部api的返回值會在客戶端alert出來,若要查看傳入的參數,能夠在pc端打開,參數信息會經過log打出,僅在pc端時纔會打印。
appId:
'${appId}'
,
// 必填,企業號的惟一標識,此處填寫企業號corpid
timestamp: parseInt(
"${timestamp}"
,
10
),
// 必填,生成簽名的時間戳
nonceStr:
'${noncestr}'
,
// 必填,生成簽名的隨機串
signature:
'${signature}'
,
// 必填,簽名,見附錄1
|