java微信公众号获取地理位置_Java微信公众平台开发之获取地理位置
本部分需要用到微信的JS-SDK,微信JS-SDK是微信公眾平臺面向網頁開發者提供的基于微信內的網頁開發工具包。
通過使用微信JS-SDK,網頁開發者可借助微信高效地使用拍照、選圖、語音、位置等手機系統的能力,同時可以直接使用微信分享、掃一掃、卡券、支付等微信特有的能力,為微信用戶提供更優質的網頁體驗。
詳細文檔點擊查看
一、JS-SDK引入
1.先登錄微信公眾平臺進入“公眾號設置”的“功能設置”里填寫“JS接口安全域名”,和網頁授權一樣只是個域名。
2.在需要調用JS接口的頁面引入如下JS文件之一
二、通過config接口注入權限驗證配置
wx.config({
debug: true, // 開啟調試模式,調用的所有api的返回值會在客戶端alert出來,若要查看傳入的參數,可以在pc端打開,參數信息會通過log打出,僅在pc端時才會打印。
appId: '', // 必填,公眾號的唯一標識
timestamp: , // 必填,生成簽名的時間戳
nonceStr: '', // 必填,生成簽名的隨機串
signature: '',// 必填,簽名
jsApiList: [] // 必填,需要使用的JS接口列表
});
首先生成這個signature之前需要獲取到一個臨時票據jsapi_ticket,jsapi_ticket是公眾號用于調用微信JS接口的臨時票據。正常情況下,jsapi_ticket的有效期為7200秒,通過access_token來獲取。由于獲取jsapi_ticket的api調用次數非常有限,頻繁刷新jsapi_ticket會導致api調用受限,影響自身業務,同樣也需要個中控服務器控制刷新。
1、獲取臨時票據
封裝返回結果
package com.phil.wechatauth.model.resp;
import com.phil.common.result.ResultState;
/**
* jsapi_ticket是公眾號用于調用微信JS接口的臨時票據
* @author phil
* @date 2017年8月21日
*
*/
public class JsapiTicket extends ResultState {
/**
*
*/
private static final long serialVersionUID = -357009110782376503L;
private String ticket; //jsapi_ticket
private String expires_in;
public String getTicket() {
return ticket;
}
public void setTicket(String ticket) {
this.ticket = ticket;
}
public String getExpires_in() {
return expires_in;
}
public void setExpires_in(String expires_in) {
this.expires_in = expires_in;
}
} 獲取方法
/**
* 獲取jsapi_ticket 調用微信JS接口的臨時票據
* @return
*/
public String getTicket(String accessToken) {
JsapiTicket jsapiTicket = null;
Mapparams = new TreeMap();
params.put("access_token",accessToken);
params.put("type", "jsapi");
String result = HttpReqUtil.HttpDefaultExecute(HttpReqUtil.GET_METHOD, WechatConfig.GET_TICKET_URL, params,"");
if(StringUtils.isNotBlank(result)){
jsapiTicket = JsonUtil.fromJson(result, JsapiTicket.class);
}
if(jsapiTicket.getErrcode()==0){
return jsapiTicket.getTicket();
}
return null;
}
2、生成簽名并返回參數
signature生成規則如下:參與簽名的字段包括noncestr(隨機字符串), 有效的jsapi_ticket, timestamp(時間戳), url(當前網頁的URL,不包含#及其后面部分) 。對所有待簽名參數按照字段名的ASCII 碼從小到大排序(字典序)后,使用URL鍵值對的格式(即key1=value1&key2=value2…)拼接成字符串string1。這里需要注意的是所有參數名均為小寫字符。對string1作sha1加密,字段名和字段值都采用原始值,不進行URL 轉義。
string1示例如下
jsapi_ticket=sM4AOVdWfPE4DxkXGEs8VMCPGGVi4C3VM0P37wVUCFvkVAy_90u5h9nbSlYy3-Sl-HhTdfl2fzFy1AOcHKP7qg&noncestr=Wm3WZYTPz0wzccnW×tamp=1414587457&url=http://mp.weixin.qq.com?params=value
這里有個坑,頁面是nonceStr,但是簽名的字段是noncestr,注意大小寫
簡單封裝下JS-SDK config配置信息
package com.phil.wechatauth.model.resp;
/**
* JS-SDK的頁面配置信息
* @author phil
* @date 2017年8月22日
*
*/
public class JsWechatConfig {
private String appId;
private long timestamp;
private String noncestr;
private String signature;
public String getAppId() {
return appId;
}
public void setAppId(String appId) {
this.appId = appId;
}
public long getTimestamp() {
return timestamp;
}
public void setTimestamp(long timestamp) {
this.timestamp = timestamp;
}
public String getNoncestr() {
return noncestr;
}
public void setNoncestr(String noncestr) {
this.noncestr = noncestr;
}
public String getSignature() {
return signature;
}
public void setSignature(String signature) {
this.signature = signature;
}
}
添加配置信息到頁面
/**
*
*/
package com.phil.wechatauth.controller;
import java.util.SortedMap;
import java.util.TreeMap;
import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import com.phil.common.config.SystemConfig;
import com.phil.common.config.WechatConfig;
import com.phil.common.util.DateTimeUtil;
import com.phil.common.util.PayUtil;
import com.phil.common.util.SignatureUtil;
import com.phil.wechatauth.model.resp.JsWechatConfig;
import com.phil.wechatauth.service.WechatAuthService;
/**
* JS-SDK
* @author phil
* @date 2017年8月21日
*
*/
@Controller
@RequestMapping("/auth")
public class WechatAuthController {
@Autowired
private WechatAuthService wechatAuthService;
/**
* 獲取地理位置
* @param request
* @return
* @throws Exception
*/
@RequestMapping("/getLocation")
public String getLocation(HttpServletRequest request) throws Exception{
JsWechatConfig jsWechatConfig = new JsWechatConfig();
jsWechatConfig.setAppId(WechatConfig.APP_ID);
jsWechatConfig.setTimestamp(DateTimeUtil.currentTime());
jsWechatConfig.setNoncestr(PayUtil.createNonceStr());
SortedMapmap = new TreeMap();
map.put("jsapi_ticket", wechatAuthService.getTicket(wechatAuthService.findlastestToken()));
map.put("noncestr", jsWechatConfig.getNoncestr());
map.put("timestamp", jsWechatConfig.getTimestamp());
map.put("url", request.getRequestURL().toString());
String signature = SignatureUtil.createSha1Sign(map, null, SystemConfig.CHARACTER_ENCODING);
jsWechatConfig.setSignature(signature);
request.setAttribute("jsWechatConfig", jsWechatConfig);
return "wechatauth/getLocation";
}
}
簽名方法
/**
* 通過Map中的所有元素參與簽名
*
* @param map 待參與簽名的map集合
* @params apikey apikey中 如果為空則不參與簽名,如果不為空則參與簽名
* @return
*/
public static String createSha1Sign(SortedMapmap, String apiKey, String characterEncoding) {
String result = notSignParams(map, apiKey);
MessageDigest md = null;
try {
md = MessageDigest.getInstance("SHA-1");
byte[] digest = md.digest(result.getBytes());
result = byteToStr(digest);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return result;
}
其他的簽名方法點擊查看
三、通過ready接口處理成功驗證
以上執行完成,進入的完整的頁面
獲取地理位置
地址:
可以通過微信官方提供的微信web開發者工具調試
總結
以上是生活随笔為你收集整理的java微信公众号获取地理位置_Java微信公众平台开发之获取地理位置的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 解魔方机器人一秒搞定魔方
- 下一篇: java美元兑换,(Java实现) 美元