轉:微信開發獲取地理位置實例(java,很是詳細,附工程源碼)

微信開發獲取地理位置實例(java,很是詳細,附工程源碼)

在本篇博客以前,博主已經寫了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 +
                 "&timestamp=" + 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 +
                 "&timestamp=" + 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
相關文章
相關標籤/搜索